
用C语言散列表实现电话薄
发布日期:2021-05-07 13:02:57
浏览次数:12
分类:精选文章
本文共 3824 字,大约阅读时间需要 12 分钟。
用C语言实现电话薄
结构体定义
定义了一个struct node
结构体,用于存储电话薄中的联系人信息。包括电话号码、姓名、地址、城市和企业名称等字段,结构体还包含指向下一个节点的指针。电话薄的数据存储在一个大小为19的数组num_list
中,每个位置对应一个哈希表的键值。
typedef struct node { char num[11], name[15], address[20], city[15], etp[20]; struct node *next;} NUM;
哈希函数
使用了除法法则(即余数法)来计算哈希值。将电话号码的每一位数字转换为整数,并根据公式 k = 10*k + (num[i] - '0')
计算哈希值。最后取模19得到最终的哈希值。
int hash(char num[]) { int i, k = 0; for(i = 0; num[i] != '\0'; i++) { k = 10 * k + num[i] - '0'; } k = k % 19; return k;}
创建通讯录
通过create()
函数可以添加新的联系人信息。程序会循环提示用户输入电话号码、姓名、地址、城市和企业名称。然后调用哈希函数计算键值,将节点插入到哈希表中的相应位置。
void create() { struct node *p1; int m = 0; while(m == 0) { printf("请输入你想添加人的信息: num name address city etp,\n"); p1 = (struct node *)malloc(sizeof(struct node)); scanf("%s", p1->num); scanf("%s", p1->name); scanf("%s", p1->address); scanf("%s", p1->city); scanf("%s", p1->etp); int k1 = hash(p1->num); p1->next = num_list[k1]; num_list[k1] = p1; printf("结束请按1,再次输入请按0\n"); scanf("%d", &m); } printf("通讯表已经创建\n");}
删除联系人
dlter()
函数用于删除指定电话号码的联系人信息。程序首先调用哈希函数找到对应的节点,然后释放该节点的内存。
void dlter() { char num[11]; int k1; int find = 0; struct node *f; printf("请查询要修改的联系人的电话:\n"); scanf("%s", num); k1 = hash(num); f = num_list[k1]; while(f != NULL) { if(strcmp(f->num, num) == 0) { printf("查找到了!请输入要修改的人的资料:\n"); scanf("%s%s%s%s%s", f->num, f->name, f->address, f->city, f->etp); find = 1; } f = f->next; } if(find == 0) { printf("没有找到要删除的节点!"); }}
列表显示
list()
函数用于打印通讯录中的所有联系人信息。程序遍历哈希表中的每一个节点,逐个打印联系人的电话号码、姓名、地址、城市和企业名称。
void list() { struct node *f; int i; printf("打印通讯录如下:\n"); for(i = 0; i < 19; i++) { f = num_list[i]; while(f != NULL) { printf("- num:%s\t name:%s\t address:%s\t city:%s\t etp:%s\t \n", f->num, f->name, f->address, f->city, f->etp); f = f->next; } }}
添加联系人
add()
函数用于添加新的联系人信息。程序提示用户输入电话号码、姓名、地址、城市和企业名称,然后将节点插入到哈希表中的相应位置。
void add() { char num[11], name[15], address[20], city[15], etp[20]; struct node *p1; int k1; printf("请输入新添加的人的信息: 电话 姓名 地址 城市 邮箱\n"); p1 = (struct node *)malloc(sizeof(struct node)); scanf("%s%s%s%s%s", num, name, address, city, etp); strcpy(p1->num, num); strcpy(p1->name, name); strcpy(p1->address, address); strcpy(p1->city, city); strcpy(p1->etp, etp); k1 = hash(p1->num); p1->next = num_list[k1]; num_list[k1] = p1; printf("ok\n");}
查询联系人
search()
函数用于查询指定电话号码的联系人信息。程序调用哈希函数找到对应的节点,并打印联系人详情。
void search() { char num[11]; int k1; int find = 0; struct node *f; printf("请输入查询人的电话号码:\n"); scanf("%s", num); k1 = hash(num); f = num_list[k1]; while(f != NULL) { if(strcmp(f->num, num) == 0) { printf("所要查找的联系人信息 : num:%s name:%s address:%s city:%s etp:%s\n", f->num, f->name, f->address, f->city, f->etp); find = 1; } f = f->next; } if(find == 0) { printf("此联系人没有找到!"); }}
主程序
main()
函数作为程序的入口,初始化num_list
数组为NULL
,并提供菜单选项让用户进行操作。
void main() { int i; for(i = 0; i < 19; i++) { num_list[i] = NULL; } while(1) { printf("\n"); printf("通讯录\n"); printf(" ------------------------------------------\n"); printf(" ---- 1. 建立 2. 查找 3. 添加 4. 修改 5. 打印 6. 结束\n"); printf(" ------------------------------------------\n"); char x; scanf("%s", &x); switch(x) { case '1': create(); break; case '2': search(); break; case '3': add(); break; case '4': dlter(); break; case '5': list(); break; case '6': return; default: printf("请重新输入;\n"); } }}
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月31日 03时44分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
将DataFrame作为邮件正文HTML发送 in Python
2019-03-04
理解Python系统下的时间格式
2019-03-04
《经济机器是怎样运行的》笔记(三)
2019-03-04
Python提升回测速度concurrnet.futures模块详解
2019-03-04
Python语言'类'概念再理解
2019-03-04
(2019.6.27)Anaconda清华镜像已恢复使用
2019-03-04
Robomongo使用教程:踩着前辈的路
2019-03-04
Python中Class类与def函数的区别
2019-03-04
OpenAI Gym简介及初级实例
2019-03-04
用Matplotlib和Gym优雅地呈现股票交易智体
2019-03-04
Github上量化交易相关项目汇总
2019-03-04
JS取出两个数组中的不同或相同元素
2019-03-04
Ubuntu 18.04 zip压缩文件及其文件 夹中的所以 内容
2019-03-04
int 转 CString
2019-03-04
Edit编辑框自动换行与长度
2019-03-04
如何在Windows上搭建NFS服务器实现开发板与Windows之间的文件共享
2019-03-04
英语02_单词词性
2019-03-04
C语言12_预处理 #
2019-03-04