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-21 08:02:24 浏览: 85
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define TABLE_SIZE 13
typedef struct Node {
int key;
int value;
struct Node* next;
} Node;
Node* hashTable[TABLE_SIZE];
// 哈希函数,将key映射到哈希表的下标
int hash(int key) {
return key % TABLE_SIZE;
}
// 向哈希表中插入元素
void insert(int key, int value) {
int index = hash(key);
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->key = key;
newNode->value = value;
newNode->next = NULL;
if (hashTable[index] == NULL) {
hashTable[index] = newNode;
} else {
Node* p = hashTable[index];
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
}
// 在哈希表中查找元素
int search(int key, int* count) {
int index = hash(key);
Node* p = hashTable[index];
*count = 1;
while (p != NULL) {
if (p->key == key) {
return p->value;
}
p = p->next;
(*count)++;
}
return -1;
}
int main() {
int n, k;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
insert(x, i);
}
scanf("%d", &k);
int count;
int result = search(k, &count);
if (result == -1) {
printf("fail %d\n", n);
} else {
printf("%d %d\n", result, count);
}
return 0;
}
```
解释一下代码:
- 我们定义了一个哈希表 `hashTable`,其中每个元素是一个指针,指向一个链表。
- `insert` 函数将一个元素插入到哈希表中。我们先通过哈希函数计算出该元素应该插入的位置,然后将一个新节点插入到该位置对应的链表的末尾。
- `search` 函数在哈希表中查找一个元素。我们先通过哈希函数计算出该元素可能存在的位置,然后遍历该位置对应的链表,查找该元素。如果找到了,返回该元素在原查找表中的位置;否则返回 -1,表示查找失败。同时,我们还记录了查找的比较次数。
- 在 `main` 函数中,我们读入原查找表中的元素,并插入到哈希表中。然后读入需要查询的关键字,调用 `search` 函数进行查询。最后根据查询结果输出相应的信息。
阅读全文