设每个记录有下列数据项:电话号码、用户名、住址。从键盘输入各记录,以用户名为关键字建立哈希表,哈希函数用除留取余数法构造,采用线性探测法解决冲突。可以插入、查找、删除并显示给定用户名的记录,显示哈希表,并计算查找长度, 哈希表保存到文件中。测试数据:取某个单位电话号码簿中的30 个记录。c语言实现
时间: 2024-02-03 15:13:55 浏览: 18
以下是基于题目要求的程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_RECORDS 30 // 最大记录数
#define MAX_USERNAME_LENGTH 20 // 最大用户名长度
#define HASH_TABLE_SIZE 31 // 哈希表大小
struct Record {
char phone_number[12];
char username[MAX_USERNAME_LENGTH];
char address[50];
};
struct Record records[MAX_RECORDS];
int hash_table[HASH_TABLE_SIZE]; // 哈希表
int collision_count = 0; // 碰撞计数器
// 哈希函数
int hash(char* username) {
int hash_value = 0;
for (int i = 0; i < strlen(username); i++) {
hash_value += username[i];
}
return hash_value % HASH_TABLE_SIZE;
}
// 插入记录
void insert(struct Record record) {
int hash_value = hash(record.username);
while (hash_table[hash_value] != -1) { // 线性探测法解决冲突
hash_value = (hash_value + 1) % HASH_TABLE_SIZE;
collision_count++;
}
hash_table[hash_value] = hash_value; // 将记录插入哈希表
records[hash_value] = record; // 将记录保存到数组中
}
// 查找记录
struct Record* search(char* username) {
int hash_value = hash(username);
int search_count = 0;
while (hash_table[hash_value] != -1 && search_count < HASH_TABLE_SIZE) { // 线性探测法查找记录
if (strcmp(records[hash_value].username, username) == 0) {
printf("查找到记录:\n");
printf("电话号码:%s\n", records[hash_value].phone_number);
printf("用户名:%s\n", records[hash_value].username);
printf("住址:%s\n", records[hash_value].address);
printf("查找长度:%d\n", search_count + 1);
return &records[hash_value]; // 返回记录指针
}
hash_value = (hash_value + 1) % HASH_TABLE_SIZE;
search_count++;
}
printf("未找到记录!\n");
return NULL;
}
// 删除记录
void delete(char* username) {
struct Record* record = search(username);
if (record != NULL) { // 找到记录,将哈希表对应位置置为-1
hash_table[hash(username)] = -1;
}
}
// 显示哈希表
void display_hash_table() {
printf("哈希表:\n");
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
printf("%d\t", hash_table[i]);
}
printf("\n");
}
// 保存哈希表到文件
void save_hash_table() {
FILE* fp = fopen("hash_table.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
fprintf(fp, "%d ", hash_table[i]);
}
fclose(fp);
}
int main() {
// 初始化哈希表
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
hash_table[i] = -1;
}
// 输入记录
printf("请输入%d个记录:\n", MAX_RECORDS);
for (int i = 0; i < MAX_RECORDS; i++) {
printf("记录%d:\n", i + 1);
printf("电话号码:");
scanf("%s", records[i].phone_number);
printf("用户名:");
scanf("%s", records[i].username);
printf("住址:");
scanf("%s", records[i].address);
insert(records[i]); // 插入记录到哈希表中
}
// 查找记录
char search_username[MAX_USERNAME_LENGTH];
printf("请输入要查找的用户名:");
scanf("%s", search_username);
search(search_username);
// 删除记录
char delete_username[MAX_USERNAME_LENGTH];
printf("请输入要删除的用户名:");
scanf("%s", delete_username);
delete(delete_username);
// 显示哈希表
display_hash_table();
// 计算碰撞次数
printf("碰撞次数:%d\n", collision_count);
// 保存哈希表到文件
save_hash_table();
return 0;
}
```
这个程序实现了记录的插入、查找、删除,并且采用哈希表保存记录,哈希表使用了线性探测法解决冲突。程序还实现了哈希表的显示和保存到文件中。