数据结构 :电话号码查询系统的设计与实现
#include
#include
#include
#define MAX_NAME 10
#define TABLE_SIZE 10
typedef char KeyType[MAX_NAME];
typedef long long int InfoType;
typedef struct HNode {
KeyType name;
InfoType otherinfo;
struct HNode* next;
} HNode;
typedef HNode* HashTable[TABLE_SIZE];
void Create_HT(HashTable HT) {
for (int i = 0; i < TABLE_SIZE; i++)
{
HT[i] = NULL;
}
}
int hash(KeyType name) {
int hashval = 0;
for (int i = 0; name[i] != ‘\0’; i++) {
hashval = (hashval * 33 + name[i]) % TABLE_SIZE;
}
return hashval;
}
//插入新记录
void Insert_HT(HashTable HT) {
HNode* p = (HNode*)malloc(sizeof(HNode));
if (p == NULL) {
printf(“内存分配失败\n”);
return;
}
printf(“请输入姓名:”);
scanf(“%s”, p->name);
printf(“请输入电话号码:”);
scanf(“%lld”, &p->otherinfo);
p->next = NULL;
int address = hash(p->name);
if (HT[address] == NULL) {
HT[address] = p;
}
else {
p->next = HT[address];
HT[address] = p;
}
}
//删除
void Delete_HT(HashTable HT, KeyType key) {
int address = hash(key);
HNode* p = HT[address];
HNode* pre = NULL;
while (p != NULL) {
if (strcmp(p->name, key) == 0) {
if (pre == NULL) {
HT[address] = p->next;
}
else {
pre->next = p->next;
}
free(p);
printf(“删除成功\n”);
return;
}
pre = p;
p = p->next;
}
printf(“未找到对应记录\n”);
}
//查找
void Search_HT(HashTable HT, KeyType key) {
int address = hash(key);
HNode* p = HT[address];
while (p != NULL) {
if (strcmp(p->name, key) == 0) {
printf(“姓名:%s, 电话号码:%lld\n”, p->name, p->otherinfo);
return;
}
p = p->next;
}
printf(“未找到对应记录\n”);
}
//修改
void Modify_HT(HashTable HT, KeyType key) {
int address = hash(key);
HNode* p = HT[address];
while (p != NULL) {
if (strcmp(p->name, key) == 0) {
printf(“请输入新的电话号码:”);
scanf(“%d”, &p->otherinfo);
printf(“修改成功\n”);
return;
}
p = p->next;
}
printf(“未找到对应记录\n”);
}
//打印
void Print_HT(HashTable HT) {
printf(“——用户记录如下——\n”);
int a=0;
for (int i = 0; i < TABLE_SIZE; i++)
{
HNode* p = HT[i];
while(p != NULL) {
a=1;
printf(“姓名:%s, 电话号码:%lld\n”, p->name, p->otherinfo);
p = p->next;
}
}
if(a==0)
{
printf(“无用户记录\n”);
}
}
int OperateMenu() {
int choice;
printf(“——–菜单——–\n”);
printf(“1. 插入新记录\n”);
printf(“2. 删除记录\n”);
printf(“3. 查找记录\n”);
printf(“4. 修改记录\n”);
printf(“5. 打印记录\n”);
printf(“0. 退出\n”);
printf(“——————–\n”);
printf(“请选择操作:”);
scanf(“%d”, &choice);
return choice;
}
int main() {
HashTable HT;
Create_HT(HT);
int choice = 1;
while (choice != 0) {
choice = OperateMenu();
switch (choice) {
case 1:
Insert_HT(HT);
break;
case 2: {
KeyType key;
printf(“请输入要删除的姓名:”);
scanf(“%s”, &key);
Delete_HT(HT, key);
break;
}
case 3: {
KeyType key;
printf(“请输入要查找的姓名:”);
scanf(“%s”, &key);
Search_HT(HT, key);
break;
}
case 4: {
KeyType key;
printf(“请输入要修改的姓名:”);
scanf(“%s”, &key);
Modify_HT(HT, key);
break;
}
case 5:
Print_HT(HT);
break;
default:
if (choice != 0) {
printf(“请输入正确的操作代码!\n”);
}
break;
}
}
return 0;
}


这段代码实现了一个基于哈希表的简单电话录入程序。以下是一些注意事项:
-
代码中使用了一个 HashTable 结构体数组,每个元素都指向一个 HNode 链表。每个 HNode 结构体存储一个姓名和电话号码。
-
定义了常量 MAX_NAME 和 TABLE_SIZE,分别表示姓名的最大长度和哈希表的大小。
-
Create_HT 函数用于创建一个空的哈希表,初始化所有链表头节点为空。
-
hash 函数根据姓名计算出对应的哈希值,用于确定应该将元素插入到哈希表的哪个位置。
-
Insert_HT 函数用于向哈希表中插入新的记录。它首先从用户输入中读取一个新的姓名和电话号码,然后根据姓名计算哈希值,将新节点插入到对应的链表头。
-
Delete_HT 函数根据姓名从哈希表中删除对应的记录。它首先计算姓名的哈希值,然后遍历对应的链表,找到对应节点并删除。
-
Search_HT 函数根据姓名在哈希表中查找对应的记录。它首先计算姓名的哈希值,然后遍历对应的链表,找到对应节点并打印其姓名和电话号码。
-
Modify_HT 函数根据姓名修改哈希表中对应的记录的电话号码。它首先计算姓名的哈希值,然后遍历对应的链表,找到对应节点并修改电话号码。
-
Print_HT 函数用于打印哈希表中的所有记录。
-
OperateMenu 函数用于显示操作菜单,并返回用户选择的操作代码。
-
main 函数是程序的入口点,它初始化哈希表,然后根据用户选择执行不同的操作,直到用户选择退出为止。
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://www.net2asp.com/9dbb30243d.html
