c语言构造哈希表,并查询关键字K(整数)在哈希表中的结果:查询成功,返回K在哈希表中的位置, 否则返回“fail”,并输出查找成功或失败时的比较次数【输入形式】先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。第三行输入查询关键字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-20 11:57:47 浏览: 126
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 13
// 哈希函数
int hash_func(int key) {
return key % HASH_SIZE;
}
// 构造哈希表
void build_hash_table(int* data, int n, int** hash_table) {
for (int i = 0; i < n; i++) {
int hash_val = hash_func(data[i]);
int* tail = hash_table[hash_val];
while (*tail != -1) {
tail++;
}
*tail = data[i];
*(tail+1) = -1;
}
}
// 查询关键字K
int search_key(int** hash_table, int key, int n, int* compare_count) {
int hash_val = hash_func(key);
int* head = hash_table[hash_val];
*compare_count = 0;
while (*head != -1) {
(*compare_count)++;
if (*head == key) {
return head - hash_table[hash_val] + 1;
}
head++;
}
return -1;
}
// 主函数
int main() {
int n;
scanf("%d", &n);
int* data = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%d", &data[i]);
}
int key;
scanf("%d", &key);
// 构造哈希表
int** hash_table = (int**)malloc(sizeof(int*) * HASH_SIZE);
for (int i = 0; i < HASH_SIZE; i++) {
hash_table[i] = (int*)malloc(sizeof(int) * (n+1));
for (int j = 0; j < n+1; j++) {
hash_table[i][j] = -1;
}
}
build_hash_table(data, n, hash_table);
// 查询关键字K
int compare_count;
int result = search_key(hash_table, key, n, &compare_count);
if (result == -1) {
printf("fail %d\n", n);
} else {
printf("%d %d\n", result, compare_count);
}
// 释放内存
for (int i = 0; i < HASH_SIZE; i++) {
free(hash_table[i]);
}
free(hash_table);
free(data);
return 0;
}
```
输入样例1:
```
12
19 14 23 01 68 20 84 27 55 11 10 79
55
```
输出样例1:
```
5 3
```
输入样例2:
```
12
19 14 23 01 68 20 84 27 55 11 10 79
15
```
输出样例2:
```
fail 12
```
阅读全文