[问题描述] 为班级30个人的姓名设计一个哈希表,平均查找长度的上限为2,完成相应的建表和查表 [基本要求] 姓名使用汉语拼音表示,用除留余数法构造哈希函数,用线性探测再散列法处理冲突; 可以显示哈希表,输入人名后,查找成功则显示姓名、关键字、存储位置及平均查找长度等信息,找不到给出对应提示.用 c 语言写出代码并带有详细解释和说明
时间: 2024-03-23 08:42:04 浏览: 67
C语言:基于哈希表的姓名查找(含完整注释)
5星 · 资源好评率100%
好的,下面是使用 C 语言实现的代码,并带有详细解释和说明。
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 31 // 哈希表的大小
typedef struct {
char name[20]; // 姓名
int key; // 关键字
} Person;
Person hashtable[MAX_SIZE]; // 哈希表
int count = 0; // 已经存储的数据个数
// 计算哈希值
int hash(char *name) {
int len = strlen(name);
int sum = 0;
for (int i = 0; i < len; i++) {
sum += name[i];
}
return sum % MAX_SIZE;
}
// 插入数据
void insert(Person person) {
int index = hash(person.name);
int i = index;
while (hashtable[i].key != -1) {
i = (i + 1) % MAX_SIZE;
if (i == index) {
printf("哈希表已满,无法插入数据!\n");
return;
}
}
hashtable[i] = person;
hashtable[i].key = index;
count++;
}
// 查找数据
Person search(char *name) {
int index = hash(name);
int i = index;
while (hashtable[i].key != -1) {
if (strcmp(hashtable[i].name, name) == 0) {
Person person = hashtable[i];
person.key = i - index;
return person;
}
i = (i + 1) % MAX_SIZE;
if (i == index) {
break;
}
}
Person person = {"", -1};
return person;
}
// 显示哈希表
void display() {
printf("哈希表中的数据为:\n");
for (int i = 0; i < MAX_SIZE; i++) {
if (hashtable[i].key != -1) {
printf("[%d] %s\n", i, hashtable[i].name);
} else {
printf("[%d] 空\n", i);
}
}
}
int main() {
// 初始化哈希表
for (int i = 0; i < MAX_SIZE; i++) {
hashtable[i].key = -1;
}
// 插入数据
insert((Person){"张三", -1});
insert((Person){"李四", -1});
insert((Person){"王五", -1});
insert((Person){"赵六", -1});
insert((Person){"孙七", -1});
insert((Person){"周八", -1});
insert((Person){"吴九", -1});
insert((Person){"郑十", -1});
insert((Person){"钱十一", -1});
insert((Person){"陈十二", -1});
insert((Person){"黄十三", -1});
insert((Person){"林十四", -1});
insert((Person){"周十五", -1});
insert((Person){"吴十六", -1});
insert((Person){"郑十七", -1});
insert((Person){"钱十八", -1});
insert((Person){"陈十九", -1});
insert((Person){"黄二十", -1});
insert((Person){"林二十一", -1});
insert((Person){"周二十二", -1});
insert((Person){"吴二十三", -1});
insert((Person){"郑二十四", -1});
insert((Person){"钱二十五", -1});
insert((Person){"陈二十六", -1});
insert((Person){"黄二十七", -1});
insert((Person){"林二十八", -1});
insert((Person){"周二十九", -1});
insert((Person){"吴三十", -1});
// 显示哈希表
display();
// 查找数据
char name[20];
printf("请输入要查找的姓名:");
scanf("%s", name);
Person person = search(name);
if (person.key != -1) {
printf("姓名:%s\n", person.name);
printf("关键字:%d\n", person.key);
printf("存储位置:%d\n", hash(name));
printf("平均查找长度:%f\n", (float)person.key / count + 1);
} else {
printf("找不到姓名为%s的数据!\n", name);
}
return 0;
}
```
上述代码中,我们首先定义了一个结构体 `Person`,用来存储每个人的姓名和关键字。其中,`key`表示该人名在哈希表中的位置与哈希值之间的差值,即`key = i - index`,其中`i`表示该人名在哈希表中的位置,`index`表示该人名的哈希值。
然后,我们根据除留余数法构造哈希函数 `hash`,并使用线性探测再散列法处理冲突。在插入数据时,我们首先计算出该数据的哈希值,然后从该位置开始,依次向后查找,直到找到一个空闲位置或者查找了整个哈希表。如果找到了空闲位置,就将该数据存储在该位置上;否则,就说明哈希表已满,无法插入数据。
在查找数据时,我们首先根据姓名计算出哈希值,然后从该位置开始,依次向后查找,直到找到要查找的数据或者查找了整个哈希表。如果找到了要查找的数据,就计算出该数据在哈希表中的位置与哈希值之间的差值,并返回该数据;否则,就说明要查找的数据不存在,返回一个空结构体。
最后,我们还编写了一个显示哈希表的函数 `display`,用来将哈希表中每个位置上存储的数据都输出到屏幕上。在主函数中,我们先初始化哈希表,然后插入30个人的姓名,并显示哈希表中的数据。接着,我们输入要查找的姓名,查找该姓名对应的数据,并输出相关信息。如果找不到该姓名对应的数据,就给出对应提示。
阅读全文