用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-17 19:03:41 浏览: 90
用C语言实现的哈希表设计
```c
#include <stdio.h>
#define M 16 //哈希表长度
#define K 13 //哈希函数的除数
//哈希表
int hash_table[M];
//哈希函数
int hash(int key) {
return key % K;
}
//线性探测法解决哈希冲突
int linear_probe(int key) {
int i = 0; //探测次数
int pos = hash(key); //初始位置
while (hash_table[pos] != -1 && hash_table[pos] != key) { //如果位置被占据且不是key
i++;
pos = (pos + 1) % M; //探测下一个位置
}
return i == M ? -1 : pos; //如果探测次数等于哈希表长度则认为查找失败
}
int main() {
//初始化哈希表,-1表示空位
for (int i = 0; i < M; i++) {
hash_table[i] = -1;
}
int n, key; //n为数据个数,key为待查找关键字
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
int pos = linear_probe(num);
if (pos != -1) { //插入成功
hash_table[pos] = num;
} else { //插入失败
printf("哈希表已满,%d插入失败\n", num);
}
}
//查找待查关键字
scanf("%d", &key);
int pos = linear_probe(key);
if (pos != -1 && hash_table[pos] == key) { //查找成功
printf("%d %d\n", pos, pos + 1);
} else { //查找失败
printf("fail %d\n", n + 1);
}
return 0;
}
```
阅读全文