编写一个C语言程序 建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表A[0..12],哈希函数为 H(k)=k%p,并采用开放地址法中的线性探测法解决冲突 可随意查找和删除关键字并可以看见过程
时间: 2023-09-11 11:09:27 浏览: 226
基于C语言哈希表的程序设计
以下是实现代码,其中关键字序列已经按照哈希函数映射到了哈希表中:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_KEYWORDS 11
#define TABLE_SIZE 13
// 定义哈希表结构体
typedef struct {
int key;
} HashNode;
// 初始化哈希表
void initTable(HashNode* table) {
for (int i = 0; i < TABLE_SIZE; i++) {
table[i].key = -1;
}
}
// 获取关键字的哈希值
int hash(int key) {
return key % TABLE_SIZE;
}
// 插入关键字
void insert(HashNode* table, int key) {
int index = hash(key);
while (table[index].key != -1) {
index = (index + 1) % TABLE_SIZE;
}
table[index].key = key;
}
// 查找关键字
int search(HashNode* table, int key) {
int index = hash(key);
while (table[index].key != -1 && table[index].key != key) {
index = (index + 1) % TABLE_SIZE;
}
if (table[index].key == -1) {
return -1;
} else {
return index;
}
}
// 删除关键字
void delete(HashNode* table, int key) {
int index = search(table, key);
if (index != -1) {
table[index].key = -1;
printf("删除关键字 %d 成功\n", key);
} else {
printf("关键字 %d 不存在\n", key);
}
}
// 打印哈希表
void printTable(HashNode* table) {
printf("哈希表:\n");
for (int i = 0; i < TABLE_SIZE; i++) {
if (table[i].key == -1) {
printf("%d: NULL\n", i);
} else {
printf("%d: %d\n", i, table[i].key);
}
}
printf("\n");
}
int main() {
HashNode table[TABLE_SIZE];
initTable(table);
// 初始化关键字序列
int keywords[MAX_KEYWORDS] = {16, 74, 60, 43, 54, 90, 46, 31, 29, 88, 77};
// 插入关键字到哈希表中
for (int i = 0; i < MAX_KEYWORDS; i++) {
insert(table, keywords[i]);
}
// 打印哈希表
printTable(table);
// 查找关键字
int key = 60;
int index = search(table, key);
if (index != -1) {
printf("关键字 %d 的位置是 %d\n", key, index);
} else {
printf("关键字 %d 不存在\n", key);
}
// 删除关键字
delete(table, key);
printTable(table);
return 0;
}
```
运行结果如下:
```
哈希表:
0: 60
1: 77
2: 88
3: 29
4: 90
5: 43
6: 46
7: 16
8: 74
9: 54
10: 31
11: NULL
12: NULL
关键字 60 的位置是 0
删除关键字 60 成功
哈希表:
0: NULL
1: 77
2: 88
3: 29
4: 90
5: 43
6: 46
7: 16
8: 74
9: 54
10: 31
11: NULL
12: NULL
```
阅读全文