开放地址法处理冲突的哈希查找算法,C语言实现
时间: 2024-02-28 17:57:14 浏览: 92
开放地址法是一种常用的哈希冲突处理方式,它的基本思想是当发生哈希冲突时,继续在哈希表中寻找下一个空闲位置,直到找到目标元素或者遍历完整个哈希表。常用的开放地址法包括线性探测法、二次探测法和双重散列法等。
下面是使用线性探测法实现开放地址法的哈希查找算法的C语言实现:
```
#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 100 // 哈希表的大小
// 哈希表元素结构体
typedef struct {
int key; // 关键字
int value; // 值
} HashItem;
// 哈希表结构体
typedef struct {
HashItem *table; // 哈希表数组指针
int size; // 哈希表大小
} HashTable;
// 创建哈希表
HashTable* createHashTable(int size) {
HashTable *hashTable = (HashTable*) malloc(sizeof(HashTable));
hashTable->table = (HashItem*) calloc(size, sizeof(HashItem));
hashTable->size = size;
return hashTable;
}
// 哈希函数
int hashFunction(int key) {
return key % HASH_SIZE;
}
// 哈希表插入
void insert(HashTable *hashTable, int key, int value) {
int index = hashFunction(key);
while (hashTable->table[index].key != 0) {
index = (index + 1) % hashTable->size;
}
hashTable->table[index].key = key;
hashTable->table[index].value = value;
}
// 哈希表查找
int search(HashTable *hashTable, int key) {
int index = hashFunction(key);
while (hashTable->table[index].key != key) {
index = (index + 1) % hashTable->size;
if (hashTable->table[index].key == 0) {
return -1; // 未找到
}
}
return hashTable->table[index].value;
}
int main() {
HashTable *hashTable = createHashTable(HASH_SIZE);
insert(hashTable, 1, 10);
insert(hashTable, 2, 20);
insert(hashTable, 3, 30);
printf("key=1, value=%d\n", search(hashTable, 1));
printf("key=2, value=%d\n", search(hashTable, 2));
printf("key=3, value=%d\n", search(hashTable, 3));
printf("key=4, value=%d\n", search(hashTable, 4));
return 0;
}
```
上述程序中,首先定义了一个哈希表元素结构体 HashItem,其中包含键值对的关键字 key 和值 value。然后定义了一个哈希表结构体 HashTable,其中包含哈希表数组指针 table 和哈希表大小 size。接下来,程序实现了创建哈希表 createHashTable、哈希函数 hashFunction、哈希表插入 insert 和哈希表查找 search 等函数。其中,哈希表插入使用了线性探测法来解决哈希冲突。
最后,在 main 函数中,程序创建了一个哈希表,插入了三个键值对,然后分别查找了 key 为 1、2、3、4 的值,输出了对应的结果。
需要注意的是,上述程序实现的哈希表只能存储整数类型的键和值,如果需要存储其他类型的数据,需要对程序进行相应的修改。
阅读全文