问题描述:针对某个单位电话号码簿,设计一个哈希表,并完成相应的建表和查表程序。 基本要求:设每个记录有下列数据项:电话号码、用户名、住址。从键盘输入各记录,以用户名为关键字建立哈希表,哈希函数用除留取余数法构造,采用线性探测法解决冲突。可以插入、查找、删除并显示给定用户名的记录,并计算查找长度, 哈希表保存到文件中。 测试数据:取某个单位电话号码簿中的30 个记录。用C语言实现
时间: 2024-02-01 10:15:41 浏览: 91
以下是基于题目要求的C语言实现,包含建表、查表、删除、显示及保存哈希表到文件中的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 哈希表的最大长度
#define EMPTY "-1" // 空记录的标志
// 定义电话号码簿记录结构体
typedef struct {
char number[11]; // 电话号码
char name[20]; // 用户名
char address[50]; // 住址
} Record;
// 定义哈希表结构体
typedef struct {
Record data[MAX_SIZE]; // 记录数组
int key[MAX_SIZE]; // 关键字数组
int count; // 哈希表中记录数
} HashTable;
// 初始化哈希表
void initHashTable(HashTable *ht) {
int i;
for(i = 0; i < MAX_SIZE; i++) {
ht->key[i] = 0;
strcpy(ht->data[i].number, EMPTY);
}
ht->count = 0;
}
// 哈希函数
int hash(int key) {
return key % MAX_SIZE;
}
// 插入记录
void insertRecord(HashTable *ht, Record record) {
if(ht->count >= MAX_SIZE) {
printf("哈希表已满,无法插入!\n");
return;
}
int i, j, k;
i = k = hash(record.name[0]); // 计算初始位置
j = 1;
while(ht->data[i].name[0] != '\0' && strcmp(ht->data[i].name, EMPTY) != 0) {
i = (k + j) % MAX_SIZE; // 线性探测下一位置
j++;
}
ht->data[i] = record;
ht->key[i] = 1; // 标记有记录
ht->count++;
}
// 根据用户名查找记录
void searchRecord(HashTable ht, char *name) {
int i, j, k;
i = k = hash(name[0]); // 计算初始位置
j = 1;
while(ht.data[i].name[0] != '\0') {
if(strcmp(ht.data[i].name, name) == 0) {
printf("用户名:%s\n电话号码:%s\n住址:%s\n", ht.data[i].name, ht.data[i].number, ht.data[i].address);
printf("查找长度:%d\n", j);
return;
}
i = (k + j) % MAX_SIZE; // 线性探测下一位置
j++;
}
printf("未找到该用户!\n");
}
// 删除记录
void deleteRecord(HashTable *ht, char *name) {
int i, j, k;
i = k = hash(name[0]); // 计算初始位置
j = 1;
while(ht->data[i].name[0] != '\0') {
if(strcmp(ht->data[i].name, name) == 0) {
ht->key[i] = 0; // 标记为空记录
ht->count--;
printf("删除成功!\n");
return;
}
i = (k + j) % MAX_SIZE; // 线性探测下一位置
j++;
}
printf("未找到该用户!\n");
}
// 显示哈希表
void displayHashTable(HashTable ht) {
int i;
printf("哈希表内容如下:\n");
printf("序号\t用户名\t电话号码\t住址\n");
for(i = 0; i < MAX_SIZE; i++) {
if(ht.key[i] == 1) {
printf("%d\t%s\t%s\t%s\n", i, ht.data[i].name, ht.data[i].number, ht.data[i].address);
}
}
}
// 保存哈希表到文件中
void saveHashTableToFile(HashTable ht) {
FILE *fp;
int i;
fp = fopen("hash_table.txt", "w");
if(fp == NULL) {
printf("无法打开文件!\n");
return;
}
fprintf(fp, "序号\t用户名\t电话号码\t住址\n");
for(i = 0; i < MAX_SIZE; i++) {
if(ht.key[i] == 1) {
fprintf(fp, "%d\t%s\t%s\t%s\n", i, ht.data[i].name, ht.data[i].number, ht.data[i].address);
}
}
fclose(fp);
printf("哈希表已保存到文件中!\n");
}
int main() {
HashTable ht;
initHashTable(&ht);
Record record;
int choice;
char name[20];
do {
printf("请选择操作:\n");
printf("1. 插入记录\n");
printf("2. 查找记录\n");
printf("3. 删除记录\n");
printf("4. 显示哈希表\n");
printf("5. 保存哈希表到文件中\n");
printf("6. 退出程序\n");
scanf("%d", &choice);
switch(choice) {
case 1:
printf("请输入电话号码:");
scanf("%s", record.number);
printf("请输入用户名:");
scanf("%s", record.name);
printf("请输入住址:");
scanf("%s", record.address);
insertRecord(&ht, record);
break;
case 2:
printf("请输入要查找的用户名:");
scanf("%s", name);
searchRecord(ht, name);
break;
case 3:
printf("请输入要删除的用户名:");
scanf("%s", name);
deleteRecord(&ht, name);
break;
case 4:
displayHashTable(ht);
break;
case 5:
saveHashTableToFile(ht);
break;
case 6:
printf("程序已退出!\n");
break;
default:
printf("无效操作,请重新选择!\n");
break;
}
} while(choice != 6);
return 0;
}
```
注意:该程序中的哈希表保存到文件中的功能仅供参考,实际应用中可能需要根据具体需求进行修改和扩展。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![c](https://img-home.csdnimg.cn/images/20250102104920.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)