C语言的开放地址法哈希查找(包含哈希表的建立,查找,插入,重建等)
时间: 2023-08-15 11:24:07 浏览: 132
哈希表的建立和查找
下面是一个使用开放地址法处理哈希表冲突的完整C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 哈希表最大长度
#define EMPTY -1 // 哈希表空位置标记
typedef struct {
char key[20];
int value;
} HashNode; // 哈希表节点类型定义
HashNode hashTable[MAX_SIZE]; // 哈希表数组
int hashSize = 0; // 哈希表当前长度
// 计算哈希值
int hashCode(char *key)
{
int hash = 0;
for (int i = 0; i < strlen(key); i++) {
hash = hash * 31 + key[i];
}
return hash % MAX_SIZE;
}
// 插入节点到哈希表
void insert(char *key, int value)
{
int hash = hashCode(key);
int c = 0; // 冲突次数计数器
// 开放地址法处理哈希表冲突
while (hashTable[hash].value != EMPTY && strcmp(hashTable[hash].key, key) != 0) {
hash = (hash + 1) % MAX_SIZE;
c++;
if (c > MAX_SIZE) {
printf("哈希表已满,重建中...\n");
memset(hashTable, -1, sizeof(hashTable));
hashSize = 0;
break;
}
}
if (hashTable[hash].value == EMPTY) {
strcpy(hashTable[hash].key, key);
hashTable[hash].value = value;
hashSize++;
}
}
// 查找节点
int get(char *key)
{
int hash = hashCode(key);
int c = 0; // 冲突次数计数器
// 开放地址法处理哈希表冲突
while (hashTable[hash].value != EMPTY && strcmp(hashTable[hash].key, key) != 0) {
hash = (hash + 1) % MAX_SIZE;
c++;
if (c > MAX_SIZE) {
printf("该节点不存在!\n");
return -1;
}
}
if (hashTable[hash].value == EMPTY) {
printf("该节点不存在!\n");
return -1;
} else {
return hashTable[hash].value;
}
}
int main()
{
// 初始化哈希表
memset(hashTable, -1, sizeof(hashTable));
// 插入节点
insert("apple", 1);
insert("banana", 2);
insert("orange", 3);
insert("watermelon", 4);
insert("pear", 5);
// 查找节点
printf("apple: %d\n", get("apple"));
printf("banana: %d\n", get("banana"));
printf("orange: %d\n", get("orange"));
printf("watermelon: %d\n", get("watermelon"));
printf("pear: %d\n", get("pear"));
printf("grape: %d\n", get("grape")); // 不存在的节点
return 0;
}
```
在上面的代码中,我们使用哈希表数组 `hashTable` 存储哈希表节点,每个节点包含键值对信息,包括键值 `key` 和值 `value`。我们使用 `hashCode` 函数计算键值对应的哈希值,使用开放地址法处理哈希表冲突,如果冲突次数超过 `MAX_SIZE` 则重建哈希表。我们提供了 `insert` 函数用于插入节点到哈希表中,提供了 `get` 函数用于查找节点。在 `main` 函数中,我们插入了几个节点,并且查找了这几个节点。
阅读全文