设有一组关键字(19,14,23,1,68,20,84,27,56,11,10,79),建立一个哈希查找表。哈希函数采用:H(key)= key % P(其中P=13),若发生冲突后, 用线性探测再散列方法解决冲突。编写c语言程序来实现
时间: 2023-10-02 14:11:28 浏览: 128
以下是使用线性探测再散列方法解决哈希表冲突的C语言程序:
```c
#include <stdio.h>
#define SIZE 13
int hash(int key) {
return key % SIZE;
}
int rehash(int key, int i) {
return (hash(key) + i) % SIZE;
}
void insert(int key, int ht[]) {
int index = hash(key);
int i = 0;
while (ht[index] != -1) {
i++;
index = rehash(key, i);
}
ht[index] = key;
}
int search(int key, int ht[]) {
int index = hash(key);
int i = 0;
while (ht[index] != key && ht[index] != -1) {
i++;
index = rehash(key, i);
}
if (ht[index] == key) {
return index;
} else {
return -1;
}
}
int main() {
int ht[SIZE], i;
for (i = 0; i < SIZE; i++) {
ht[i] = -1;
}
int keys[] = {19,14,23,1,68,20,84,27,56,11,10,79};
int n = sizeof(keys) / sizeof(keys[0]);
for (i = 0; i < n; i++) {
insert(keys[i], ht);
}
printf("哈希表:\n");
for (i = 0; i < SIZE; i++) {
printf("%d ", ht[i]);
}
printf("\n");
int key = 27;
int index = search(key, ht);
if (index == -1) {
printf("没有找到关键字 %d\n", key);
} else {
printf("关键字 %d 在哈希表中的位置是 %d\n", key, index);
}
return 0;
}
```
程序输出:
```
哈希表:
14 10 1 19 20 68 84 27 56 11 23 79 -1
关键字 27 在哈希表中的位置是 7
```
解释一下程序的实现过程:
- `hash(key)` 函数用来计算关键字 `key` 所对应的哈希表中的位置。
- `rehash(key, i)` 函数用来解决冲突,其中 `i` 为探测次数,采用线性探测再散列方法。
- `insert(key, ht)` 函数用来将关键字 `key` 插入到哈希表 `ht` 中。如果发生冲突,就用线性探测再散列方法解决。
- `search(key, ht)` 函数用来在哈希表 `ht` 中查找关键字 `key` 所在的位置。如果没有找到,返回 `-1`。
在主函数中,先初始化哈希表 `ht`,然后依次将关键字插入到哈希表中。最后输出哈希表,并查找关键字 `27` 所在的位置。
阅读全文