用C语言编写:针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度(姓名以汉语拼音形式,待填入哈希表的人名不低于30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。)1、 按提示输入10个任意的整形数据; 2、 输入要查找的数据; 3、 可以看到所要查找的数据的位置。
时间: 2024-03-09 17:46:47 浏览: 390
很好,下面是我为您编写的 C 语言代码,使用的是链地址法解决哈希冲突。您可以根据需要进行修改和优化。
```
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LEN 20 // 姓名最大长度
#define MAX_SIZE 50 // 哈希表最大长度
// 学生信息结构体
typedef struct student_info{
char name[MAX_LEN];
int id;
char phone[MAX_LEN];
struct student_info *next;
}StudentInfo;
// 哈希表结构体
typedef struct hash_table{
StudentInfo *table[MAX_SIZE];
int size;
}HashTable;
// 哈希函数,将姓名转化为一个数字
int hash(char *name, int size){
int hash = 0;
for(int i=0; i<strlen(name); i++){
hash += name[i];
}
return hash % size;
}
// 初始化哈希表
void initHashTable(HashTable *hashTable){
hashTable->size = MAX_SIZE;
for(int i=0; i<hashTable->size; i++){
hashTable->table[i] = NULL;
}
}
// 插入学生信息到哈希表中
void insertStudentInfo(HashTable *hashTable, char *name, int id, char *phone){
int index = hash(name, hashTable->size);
StudentInfo *p = hashTable->table[index];
while(p != NULL){
if(strcmp(p->name, name) == 0){
printf("The name already exists in the hash table.\n");
return;
}
p = p->next;
}
StudentInfo *newStudent = (StudentInfo*)malloc(sizeof(StudentInfo));
strcpy(newStudent->name, name);
newStudent->id = id;
strcpy(newStudent->phone, phone);
newStudent->next = hashTable->table[index];
hashTable->table[index] = newStudent;
printf("Insert student info successfully.\n");
}
// 根据姓名查找学生信息
StudentInfo *findStudentInfo(HashTable *hashTable, char *name, int *compareCount){
int index = hash(name, hashTable->size);
StudentInfo *p = hashTable->table[index];
*compareCount = 0;
while(p != NULL){
(*compareCount)++;
if(strcmp(p->name, name) == 0){
return p;
}
p = p->next;
}
return NULL;
}
int main(){
HashTable hashTable;
initHashTable(&hashTable);
// 输入学生信息
char names[][MAX_LEN] = {"zhangsan", "lisi", "wangwu", "zhaoliu", "qianqi", "sunba", "zhengjiu", "zhouyi", "wudi", "kongshi"};
int ids[] = {1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010};
char phones[][MAX_LEN] = {"123456", "234567", "345678", "456789", "567890", "678901", "789012", "890123", "901234", "012345"};
for(int i=0; i<10; i++){
insertStudentInfo(&hashTable, names[i], ids[i], phones[i]);
}
// 按姓名查找学生信息
char searchName[MAX_LEN];
printf("Please enter the name you want to search: ");
scanf("%s", searchName);
int compareCount;
StudentInfo *result = findStudentInfo(&hashTable, searchName, &compareCount);
if(result != NULL){
printf("Found the student info: %s %d %s\n", result->name, result->id, result->phone);
printf("Compare count: %d\n", compareCount);
}
else{
printf("Cannot find the student info.\n");
}
return 0;
}
```
在上述代码中,我们定义了一个 `StudentInfo` 结构体来存储学生信息,包括姓名、学号和电话号码。同时,我们还定义了一个 `HashTable` 结构体来存储哈希表,包括哈希表的长度和每个位置的链表头指针。在 `initHashTable` 函数中,我们将哈希表中每个位置的链表头指针初始化为 `NULL`。
哈希函数 `hash` 将姓名转化为一个数字,并使用这个数字对哈希表的长度进行取模,得到该学生信息在哈希表中的位置。
在插入学生信息时,我们首先根据哈希函数找到该学生信息在哈希表中的位置。如果该位置上已经存在一个学生信息,我们就遍历该位置上的链表,防止插入重复的学生信息。如果该位置上没有学生信息,我们就创建一个新的 `StudentInfo` 结构体,并将它插入到该位置的链表头。
在查找学生信息时,我们首先根据哈希函数找到该学生信息在哈希表中的位置。然后,我们遍历该位置上的链表,比较每个学生信息的姓名,直到找到目标学生信息或者遍历完该链表为止。在查找过程中,我们记录比较的次数,以便分析平均查找长度。
最后,我们在 `main` 函数中输入了 10 个学生信息,并按姓名查找了其中一个学生信息。输出结果包括查找到的学生信息、比较次数和查找失败的提示。
阅读全文