用c语言针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度(姓名以汉语拼音形式,待填入哈希表的人名不低于30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。)
时间: 2024-03-06 22:49:18 浏览: 229
好的,这是一个非常实用的程序。以下是一个C语言的哈希表通讯录的示例代码,你可以参考它来完成你的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define MAX_PHONE_LEN 20
#define HASH_TABLE_SIZE 50
typedef struct Student {
char name[MAX_NAME_LEN];
char id[MAX_PHONE_LEN];
char phone[MAX_PHONE_LEN];
struct Student *next;
} Student;
int hash(char *name) {
int sum = 0;
for (int i = 0; i < strlen(name); i++) {
sum += name[i];
}
return sum % HASH_TABLE_SIZE;
}
Student *create_student(char *name, char *id, char *phone) {
Student *s = (Student*)malloc(sizeof(Student));
strcpy(s->name, name);
strcpy(s->id, id);
strcpy(s->phone, phone);
s->next = NULL;
return s;
}
void insert_student(Student **hash_table, char *name, char *id, char *phone) {
int index = hash(name);
Student *head = hash_table[index];
Student *s = create_student(name, id, phone);
if (head == NULL) {
hash_table[index] = s;
} else {
while (head->next != NULL) {
head = head->next;
}
head->next = s;
}
}
Student *find_student(Student **hash_table, char *name, int *compare_count) {
int index = hash(name);
Student *head = hash_table[index];
while (head != NULL) {
(*compare_count)++;
if (strcmp(head->name, name) == 0) {
return head;
}
head = head->next;
}
return NULL;
}
int main() {
Student **hash_table = (Student**)malloc(sizeof(Student*) * HASH_TABLE_SIZE);
memset(hash_table, 0, sizeof(Student*) * HASH_TABLE_SIZE);
insert_student(hash_table, "Zhang San", "001", "123456");
insert_student(hash_table, "Li Si", "002", "234567");
insert_student(hash_table, "Wang Wu", "003", "345678");
insert_student(hash_table, "Zhao Liu", "004", "456789");
char input_name[MAX_NAME_LEN];
printf("Please input a name to search: ");
scanf("%s", input_name);
int compare_count = 0;
Student *s = find_student(hash_table, input_name, &compare_count);
if (s != NULL) {
printf("ID: %s\n", s->id);
printf("Phone: %s\n", s->phone);
printf("Compare count: %d\n", compare_count);
} else {
printf("No such student.\n");
}
return 0;
}
```
在这个示例代码中,我们使用了哈希表来存储学生信息,并且针对学生姓名设计了哈希函数。在插入学生信息时,我们会根据哈希函数计算出学生姓名对应的哈希表索引,然后将学生信息插入到对应的链表中。在查找学生信息时,我们同样会根据哈希函数计算出对应的哈希表索引,并且遍历对应的链表来查找学生信息。在查找的过程中,我们会记录比较次数,以便分析平均查找长度。
当然,这个示例代码中还有很多可以改进的地方,比如可以使用链地址法来处理冲突,可以动态调整哈希表大小等等。但是这个示例代码已经足够帮助你了解如何使用哈希表来实现通讯录功能。如果你有什么问题,可以随时向我提问。
阅读全文