用c语言写一个代码要求如下针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序,并分析平均查找长度(姓名以汉语拼音形式,待填入哈希表的人名不低于30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。) 按提示输入10个任意的整形数据; 2、 输入要查找的数据; 3、 可以看到所要查找的数据的位置。
时间: 2024-02-03 18:11:49 浏览: 81
为了实现以上要求,我们可以按以下步骤进行:
1. 定义一个结构体来存储学生信息,包括姓名、学号、电话号码等。
```
typedef struct {
char name[20]; // 姓名
char id[10]; // 学号
char phone[12]; // 电话号码
} Student;
```
2. 设计哈希表,这里我们使用链地址法处理冲突。
```
#define HASH_SIZE 31 // 哈希表大小,选择一个质数
typedef struct _Node {
Student student; // 学生信息
struct _Node *next; // 链表指针
} Node;
typedef struct {
Node *heads[HASH_SIZE]; // 哈希表头指针数组
} HashTable;
// 初始化哈希表
void initHashTable(HashTable *hashTable) {
for (int i = 0; i < HASH_SIZE; i++) {
hashTable->heads[i] = NULL;
}
}
```
3. 设计哈希函数,这里我们选择将姓名转化为数字进行哈希。
```
// 哈希函数,将字符串转化为数字
int hash(char *str) {
int sum = 0;
for (int i = 0; str[i] != '\0'; i++) {
sum += str[i];
}
return sum % HASH_SIZE;
}
```
4. 实现插入函数,将学生信息插入到哈希表中。
```
// 插入函数,将学生信息插入到哈希表中
void insert(HashTable *hashTable, Student student) {
int index = hash(student.name); // 计算哈希值
Node *node = (Node *)malloc(sizeof(Node));
node->student = student;
node->next = hashTable->heads[index];
hashTable->heads[index] = node;
}
```
5. 实现查找函数,通过学生姓名查找学生信息。
```
// 查找函数,通过学生姓名查找学生信息
Student *search(HashTable *hashTable, char *name, int *compareCount) {
int index = hash(name); // 计算哈希值
Node *node = hashTable->heads[index];
*compareCount = 1;
while (node != NULL) { // 遍历链表
if (strcmp(node->student.name, name) == 0) {
return &(node->student);
}
node = node->next;
(*compareCount)++;
}
return NULL;
}
```
6. 实现主函数,按照要求输入学生信息并插入到哈希表中,然后进行查找操作。
```
int main() {
HashTable hashTable;
initHashTable(&hashTable);
// 输入学生信息并插入到哈希表中
for (int i = 0; i < 30; i++) {
Student student;
printf("请输入学生姓名、学号和电话号码,用空格隔开:");
scanf("%s %s %s", student.name, student.id, student.phone);
insert(&hashTable, student);
}
// 进行查找操作
char name[20];
printf("请输入要查找的学生姓名:");
scanf("%s", name);
int compareCount;
Student *student = search(&hashTable, name, &compareCount);
if (student != NULL) {
printf("查询成功,该学生的学号为 %s,电话号码为 %s,比较次数为 %d。\n", student->id, student->phone, compareCount);
} else {
printf("查询失败,未找到该学生的信息。\n");
}
return 0;
}
```
注意:以上代码仅为示例,还有许多细节需要处理,例如内存泄漏、输入格式检查等,需要根据实际情况进行完善。
阅读全文