C语言基于哈希表实现通讯录
时间:2019-04-13
本文章向大家介绍C语言基于哈希表实现通讯录,主要包括C语言基于哈希表实现通讯录使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下
1.需求分析
本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。
(1)按提示输入相应的联系人的相关资料;
(2)以相应的输出形式输出所存储的的联系人的资料;
(3)程序可以达到建立、添加、查找、打印的功能;
(4)程序可以判断用户输入的非法数据并引导正确的输入。
2.概要设计
存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相对应,那么在进行查找时,根据这个对应关系f就可以找到给定值K的像f(K)。若存储结构中存在关接找到所查记录。这个对应关系f称为哈希(Hash)函数或散列函数。按照以上思路建立的表称为哈希表或散列表。本案例设计主要考察散列表的建立、查找和修改。。
3.详细设计
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct node { char num[11],name[15],address[20],city[15],etp[20]; struct node *next; }NUM; struct NUM *num_list[19]; int hash(char num[]) { int i,k=0; for(i=0;num[i]!='\0';i++) { k=10*k+num[i]-48; //字符转化为数字 } k=(k%19); //除余法求散列地址 return k; }//c除留余数法处理电话号码 void create() { struct node *p1; int k1,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); k1=hash(p1->num);//用num数组值作为参数传递给哈希函数得到k1 p1->next=num_list[k1];//??1得到的值作为数组的储存地址赋值给头结点的下一个节点 num_list[k1]=p1;//再??1的数据传递给数组,故p1可以释放作为下一个节点产生 printf("结束请按1,再次输入请按0\n"); scanf("%d",&m); } printf("通讯表已经创建\n"); } 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",f->num,f->name,f->address,f->city,f->etp); find=1; } f=f->next; } if(find=0) printf("没有找到要删除的节点!"); } 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; } } } 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",num,name,address); 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"); } void search() { char num[11]; int k1; int find=0; struct node *f; printf("请输入查询人的电话号码:"); 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("此联系人没有找到!"); } void main() { int i; char x; for(i=0;i<19;i++) { num_list[i]=NULL; } while(1) { // system("cls"); printf("\n"); printf("★★★★★★★★★通讯录★★★★★★★★★\n"); printf("★◆----------------------------------◆★\n"); printf("★| 1.建立 |★\n"); printf("★| |★\n"); printf("★| 2.查找 |★\n"); printf("★| |★\n"); printf("★| 3.添加 |★\n"); printf("★| |★\n"); printf("★| 4.修改 |★\n"); printf("★| |★\n"); printf("★| 5.打印 |★\n"); printf("★| |★\n"); printf("★| 6.结束 |★\n"); printf("★◆----------------------------------◆★\n"); printf("★★★★★★★★★★★★★★★★★★★★★\n"); // x=getchar(); 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"); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 使用Identity Server 4建立Authorization Server (5)
- 多库多事务降低数据不一致概率
- 利用Python实现DGA域名检测
- 一个“爆款”成功的API,都离不开这8条设计准则
- RavenDb学习(八)高级特性上半部分
- 微信钱包中58到家首页为什么这么快
- hbase源码系列(二)HTable 探秘
- hbase源码系列(三)Client如何找到正确的Region Server
- hbase源码系列(五)Trie单词查找树
- 如何在特定的渗透测试中使用正确的Burp扩展插件
- hbase源码系列(十一)Put、Delete在服务端是如何处理?
- 大数据如何帮飞机节油?
- hbase源码系列(十二)Get、Scan在服务端是如何处理?
- OpenStack:建立虚拟的渗透测试实验环境 – 网络篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 通用封装函数——四则运算
- 打造自己最喜爱的 Windows10 —— 系统与软件配置优化篇
- 编译安装 IgBinary 扩展
- Python3入门学习二.md
- 编译安装 Yaml 扩展
- 一行代码不用写,就可以训练、测试、使用模型,这个star量1.5k的项目帮你做到
- 打造自己最喜爱的 Windows10 —— 纯命令安装系统篇
- Ubuntu18.04 切换 Python 版本
- Python3入门学习三.md
- Yur 主题 MarkDown 展示
- Python3入门学习一.md
- 前后端分离探索——MVC 项目升级的一个过渡方案
- Python3配置和入坑.md
- 别再被叫linux小白了,你跟linux高手只差这8个快捷键命令?
- CentOS7 手动部署 BBR