c语言程序设计针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度
时间: 2023-12-01 16:03:39 浏览: 285
好的,这是一个经典的哈希表设计问题。首先,我们需要定义一个学生信息的结构体,包括姓名、学号和电话号码等信息:
```c
typedef struct {
char name[30];
char id[20];
char phone[20];
} Student;
```
接下来,我们需要设计哈希函数,以学生姓名为关键字进行哈希。一个简单的哈希函数可以是将姓名转换为一个数字,然后取模得到哈希表的下标:
```c
int hash(char *name, int size) {
int sum = 0;
for (int i = 0; name[i]; i++) {
sum += name[i];
}
return sum % size;
}
```
其中,`size`是哈希表的大小,可以根据数据量进行设置。这里我们可以设置为100。
接下来,我们可以定义哈希表的结构体:
```c
#define SIZE 100
typedef struct {
Student *data[SIZE];
int count;
} HashTable;
```
其中,`data`是一个指针数组,每个指针指向一个学生信息的结构体。`count`表示哈希表中已经存储的学生信息数量。
接下来,我们可以定义哈希表的两个基本操作,即插入和查找。插入操作可以先根据哈希函数得到学生姓名对应的哈希表下标,然后将学生信息插入到指定位置。如果该位置已经被占用,则需要解决冲突。这里我们采用线性探测的方法,即向后依次查找,直到找到一个空闲位置为止。
```c
void insert(HashTable *table, Student *stu) {
int index = hash(stu->name, SIZE);
while (table->data[index]) {
index = (index + 1) % SIZE;
}
table->data[index] = stu;
table->count++;
}
```
查找操作也是先根据哈希函数得到学生姓名对应的哈希表下标,然后依次向后查找,直到找到对应的学生信息或者找到一个空闲位置为止。
```c
Student *find(HashTable *table, char *name) {
int index = hash(name, SIZE);
while (table->data[index]) {
if (strcmp(table->data[index]->name, name) == 0) {
return table->data[index];
}
index = (index + 1) % SIZE;
}
return NULL;
}
```
最后,我们可以编写一个测试程序,随机生成一些学生信息并插入哈希表,然后随机查找一些学生信息并计算平均查找长度:
```c
int main() {
srand(time(NULL));
HashTable table = {0};
for (int i = 0; i < 50; i++) {
Student *stu = malloc(sizeof(Student));
sprintf(stu->name, "student%d", rand() % 1000);
sprintf(stu->id, "id%d", rand() % 1000);
sprintf(stu->phone, "phone%d", rand() % 1000);
insert(&table, stu);
}
int total = 0;
for (int i = 0; i < 50; i++) {
char name[30];
sprintf(name, "student%d", rand() % 1000);
Student *stu = find(&table, name);
if (stu) {
total += 1;
}
}
printf("average search length: %lf\n", (double) table.count / total);
return 0;
}
```
注意,在插入和查找时,我们需要动态分配学生信息的内存,以便于存储。
以上就是一个简单的哈希表设计和实现过程,希望可以帮助到你!
阅读全文