c语言构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置, 否则返回“fail”,并输出查找成功或失败时的比较次数 设定哈希函数为:H(key)=key mod 13 哈希表长度m为16,下标取值(0、1......15) 线性探测方法处理冲突:Hi=(H(key)+di) MOD m 【输入形式】 先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。第三行输入查询关键字K 【样例输入1】 12 19 14 23 01 68 20 84 27 55 11 10 79 55 【样例1输出】 5 3 【样例1说明】 原查找表共12个元素,第二行依次输入元素值19 14 23 01 68 20 84 27 55 11 10 79 ,需利用哈希表查找关键字55。 查询结果:55在哈希表位置5,共比较3次查询成功。 【样例输入2】 12 19 14 23 01 68 20 84 27 55 11 10 79 15 【样例2输出】 fail 12 【样例2说明】 原查找表共12个元素,第二行依次输入元素值19 14 23 01 68 20 84 27 55 11 10 79 ,需利用哈希表查找关键字15。 查询结果:查询失败,共比较12次获取查询结果。
时间: 2024-02-19 08:58:49 浏览: 57
以下是C语言的代码实现:
```c
#include <stdio.h>
#define m 16
// 哈希函数
int H(int key) {
return key % 13;
}
// 插入元素
void insert(int hash_table[], int key) {
int i = H(key);
int j = 0;
while (j < m) {
if (hash_table[i] == -1) {
hash_table[i] = key;
return;
}
j++;
i = (i + 1) % m;
}
}
// 查找元素
void search(int hash_table[], int key, int *pos, int *comp) {
int i = H(key);
int j = 0;
while (j < m) {
if (hash_table[i] == key) {
*pos = i;
*comp = j+1;
return;
} else if (hash_table[i] == -1) {
*pos = -1;
*comp = j+1;
return;
}
j++;
i = (i + 1) % m;
}
*pos = -1;
*comp = j+1;
}
int main() {
int n, key, k, pos, comp;
int hash_table[m];
for (int i = 0; i < m; i++) {
hash_table[i] = -1; // 初始化哈希表
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &key);
insert(hash_table, key);
}
scanf("%d", &k);
search(hash_table, k, &pos, &comp);
if (pos == -1) {
printf("fail %d\n", comp);
} else {
printf("%d %d\n", pos, comp);
}
return 0;
}
```
解释一下代码的思路:
1. 首先定义哈希表的长度为16,使用一个数组来存储哈希表。
2. 定义哈希函数,用于将关键字映射到哈希表的下标。
3. 定义插入函数,使用线性探测法来处理哈希冲突,将元素插入哈希表中。
4. 定义查找函数,也使用线性探测法来处理哈希冲突,查找哈希表中是否存在关键字,返回位置和比较次数。
5. 读取输入,先读取整数的个数,然后再读取每个整数插入哈希表中,最后读取查询关键字。
6. 调用查找函数,输出结果。
注意,当哈希表已满时,插入操作会失败,但本题没有考虑这种情况。
阅读全文