c语言构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置, 否则返回“fail”,并输出查找成功或失败时的比较次数 设定哈希函数为:H(key)=key mod 13 哈希表长度m为16,下标取值(0、1......15) 线性探测方法处理冲突:Hi=(H(key)+di) MOD m先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。第三行输入查询关键字K
时间: 2024-02-16 12:03:05 浏览: 58
好的,以下是按照您要求的完整代码。在这里,我们使用了动态数组来存储整数数据,并通过 `fgets()` 函数读取输入,使用 `strtok()` 函数来解析字符串中的整数。同时,我们将构造哈希表、插入数据和搜索数据的过程都封装在函数中,以便于调用。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 16
int hash(int key) {
return key % 13;
}
int search(int table[], int key, int *count) {
int index = hash(key);
int i = 0, j;
while (i < M) {
j = (index + i) % M;
(*count)++;
if (table[j] == key) {
printf("查找成功,关键字 %d 在哈希表中的位置为 %d\n", key, j);
return j;
}
else if (table[j] == -1) {
printf("查找失败,关键字 %d 不在哈希表中\n", key);
return -1;
}
i++;
}
printf("查找失败,关键字 %d 不在哈希表中\n", key);
return -1;
}
int *create_table() {
int *table = (int *)malloc(M * sizeof(int));
int i;
for (i = 0; i < M; i++)
table[i] = -1;
return table;
}
void insert_data(int table[]) {
char buffer[100];
char *token;
int key;
fgets(buffer, 100, stdin);
token = strtok(buffer, " ");
while (token != NULL) {
key = atoi(token);
table[hash(key)] = key;
token = strtok(NULL, " ");
}
}
int main() {
int *table = create_table();
int i, key, count = 0;
insert_data(table);
scanf("%d", &key);
search(table, key, &count);
printf("比较次数:%d\n", count);
free(table);
return 0;
}
```
在上述代码中,我们定义了 `create_table()` 函数用于动态创建哈希表,`insert_data()` 函数用于读取输入并插入数据到哈希表中。在 `main()` 函数中,我们先调用 `create_table()` 函数创建一个哈希表,然后调用 `insert_data()` 函数读取输入并插入数据。最后,我们从标准输入中读取查询关键字 `key`,并调用 `search()` 函数搜索数据并输出比较次数,最后释放哈希表的内存空间。
注意,在使用哈希表时,需要考虑数据的分布情况,尽量避免冲突的发生,从而提高查找效率。同时,需要注意动态数组的内存管理,避免内存泄漏的发生。
阅读全文