用c语言写一个代码实现针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度(姓名以汉语拼音形式,待填入哈希表的人名不低于30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。)
时间: 2024-02-11 21:07:15 浏览: 21
好的,以下是我给你提供的代码,其中包含了哈希表的建立、查找和哈希函数的设计。在本代码中,我使用的是链地址法处理哈希冲突。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASHSIZE 101 //哈希表长度,选择一个大质数
struct student {
char name[20];
int id;
char phone[12];
struct student *next;
};
struct student *hashtable[HASHSIZE];
int hash(char *name) //哈希函数,将姓名转化为数字
{
unsigned int hashval = 0;
while (*name != '\0')
hashval = *name++ + hashval * 31;
return hashval % HASHSIZE;
}
void insert(struct student *newstu) //向哈希表中插入新学生信息
{
int index = hash(newstu->name);
newstu->next = hashtable[index];
hashtable[index] = newstu;
}
void search(char *name) //按姓名查找学生信息
{
int index = hash(name);
struct student *p = hashtable[index];
int count = 0;
while (p != NULL) {
count++;
if (strcmp(p->name, name) == 0) {
printf("学生姓名:%s 学号:%d 电话号码:%s\n", p->name, p->id, p->phone);
printf("比较次数:%d\n", count);
return;
}
p = p->next;
}
printf("找不到该学生信息!\n");
}
int main()
{
int i;
char name[20], phone[12];
struct student *newstu;
//手动输入学生信息,也可以读取文件或从数据库中获取
for (i = 0; i < 30; i++) {
newstu = (struct student *)malloc(sizeof(struct student));
printf("请输入第%d个学生的姓名、学号和电话号码:", i + 1);
scanf("%s%d%s", newstu->name, &newstu->id, newstu->phone);
insert(newstu);
}
//按姓名查找学生信息
printf("请输入要查找的学生姓名:");
scanf("%s", name);
search(name);
return 0;
}
```
在上面的代码中,我们定义了一个结构体`student`,包含了学生的姓名、学号和电话号码等信息,同时也定义了`hashtable`哈希表数组。在`insert`函数中,我们将新学生信息插入到哈希表中,如果出现哈希冲突,我们使用链地址法将新学生信息挂在冲突的链表后面。在`search`函数中,我们按照哈希函数计算出学生姓名对应的哈希值,然后在哈希表中查找该学生信息,如果找到则输出学生信息和比较次数,否则输出“找不到该学生信息!”。
最后,我们可以在`main`函数中手动输入学生信息,也可以从文件或数据库中读取,然后按照学生姓名查找学生信息。在查找的过程中,我们可以通过输出比较次数来分析平均查找长度。