用C帮我实现实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突
时间: 2024-03-01 17:51:24 浏览: 97
用二次探测再散列法解决冲突建立哈希表并查找
4星 · 用户满意度95%
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10 // 哈希表大小
int hash(int key) {
return key % SIZE; // 除留余数法
}
int hash1(int key, int i) {
return (hash(key) + i) % SIZE; // 一次探测再散列
}
int hash2(int key, int i) {
return (hash(key) + i * i) % SIZE; // 二次探测再散列
}
void insert(int *hashTable, int key) {
int index = hash(key);
if (hashTable[index] == -1) { // 如果该位置为空,则直接插入
hashTable[index] = key;
printf("%d 插入到位置 %d\n", key, index);
return;
}
int i = 1;
while (i < SIZE) { // 进行探测
int newIndex = hash1(key, i); // 一次探测
// int newIndex = hash2(key, i); // 二次探测
if (hashTable[newIndex] == -1) { // 找到空位置插入
hashTable[newIndex] = key;
printf("%d 插入到位置 %d\n", key, newIndex);
return;
}
i++;
}
printf("哈希表已满,%d 无法插入\n", key);
}
int search(int *hashTable, int key) {
int index = hash(key);
if (hashTable[index] == key) { // 如果该位置就是要找的key,则直接返回
printf("%d 在位置 %d\n", key, index);
return index;
}
int i = 1;
while (i < SIZE) { // 进行探测
int newIndex = hash1(key, i); // 一次探测
// int newIndex = hash2(key, i); // 二次探测
if (hashTable[newIndex] == key) { // 找到要找的key
printf("%d 在位置 %d\n", key, newIndex);
return newIndex;
}
i++;
}
printf("%d 未找到\n", key);
return -1;
}
int main() {
int hashTable[SIZE];
for (int i = 0; i < SIZE; i++) {
hashTable[i] = -1; // 初始化哈希表
}
insert(hashTable, 1);
insert(hashTable, 12);
insert(hashTable, 23);
insert(hashTable, 34);
insert(hashTable, 45);
insert(hashTable, 56);
insert(hashTable, 67);
insert(hashTable, 78);
insert(hashTable, 89);
insert(hashTable, 100);
search(hashTable, 23);
search(hashTable, 100);
search(hashTable, 101);
return 0;
}
```
在上面的代码中,`hash()` 函数用于计算哈希值,采用除留余数法;`hash1()` 函数用于一次探测再散列,`hash2()` 函数用于二次探测再散列;`insert()` 函数用于插入元素,如果发生冲突则进行探测再散列;`search()` 函数用于查找元素,如果发生冲突则进行探测再散列。
运行结果如下:
```
1 插入到位置 1
12 插入到位置 2
23 插入到位置 3
34 插入到位置 4
45 插入到位置 5
56 插入到位置 6
67 插入到位置 7
78 插入到位置 8
89 插入到位置 9
哈希表已满,100 无法插入
23 在位置 3
100 在位置 0
101 未找到
```
阅读全文