ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:58.23KB ,
资源ID:16551485      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16551485.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新版哈希表的设计与实现毕业论文Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最新版哈希表的设计与实现毕业论文Word下载.docx

1、(2) 如何分别以电话号码和用户名为关键字建立哈希表。(3) 如何利用线性探测再散列法解决冲突。(4) 如何实现用哈希法查找并显示给定电话号码的记录。(5) 如何查找并显示给定用户的记录。2.2基本要求(哈希表的设计与实现的问题)设计哈希表实现电话号码查询系统。设计程序完成以下要求:(1)、设每个记录有下列数据项:电话号码、用户名、地址;(2)、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)、采用再哈希法解决冲突(4)、查找并显示给定电话号码的记录;(5)、查找并显示给定用户的记录。要完成以上要求,设计哈希表实现电话号码查询系统。2.3数据结构本设计涉及到的数据结构为:哈希

2、表。要求输入电话号码、用户名、地址三个信息,并要求分别以电话号码和用户名为关键字进行查找,所以本问题要用到两个哈希函数,进行哈希查找。typedef struct char name20;名字 char num20;电话号码 char add30;地址Record;Record InfM;辅助数组Record HM;哈希表3、设计思路 主要算法的流程图如下:1、创建辅助数组流程图: 2、以姓名为关键字的哈希函数流程图:3、以姓名为关键字创建哈希表流程图:4、以电话号码为关键字的哈希函数流程图:5、以电话号码为关键字创建哈希表流程图:6、以姓名为关键字的哈希表按姓名查找函数流程图:7、以电话号码

3、为关键字的哈希表按号码查找函数流程图:8、以姓名为关键字的哈希表按姓名插入函数流程图:9、以号码为关键字的哈希表按号码插入函数流程图:10、以姓名为关键字的哈希表按姓名删除函数流程图:11、主函数调用函数流程图:4、测试的实验结果和测试过程4.1详细设计 首先定义结构体类型,在线性探测法中,每个结构体元素对应一个数组位置,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该数组的元素它由三个域组成:name20num20address30其中name20和num20是分别为以电话号码和用户名为关键字域(key),存放关键字;address30为元素的数据域(data

4、),用来存储用户的地址信息。4.2屏幕截图主界面如图图11、给出一组测试数据及运行结果如下:输入数据后按姓名散列结果如下:图2每个元素的哈希地址正是用名字中每个字母的ASCII码值相加再对小于哈希表长的最大素数求余得到的,根据输入数据计算和书上ASCII值计算出结果相比对,数据正确,刚开始老师检查时,觉得我的程序缺少输出哈希地址的步骤,回来后我又加以改进,把哈希地址正常输出。图3输入数据后按号码散列结果如下:每个元素的哈希地址正是用号码中每个字符的ASCII码值相加再对小于哈希表长的最大素数求余得到的,根据输入数据计算和书上ASCII值计算出结果相比对,数据正确。刚开始调试时运行删除功能时,发

5、现删除元素后,哈希地址也在该位置而却往后移动的元素不能回到该位置,然后我又分析算法,进行改进,现在算法可以在删除元素后将哈希地址在该位置的而又移到后面的元素依次向前移动。5、课程设计体会及问题分析课程设计的过程是艰辛的,但是收获确实另人欣喜的,这次课程设计我主要是应用我们以前学习的C语言及C+中的知识来完成的,虽然这个程序功能还很不完善,但自己从中却学到了很多东西.首先,综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识,再次,我在课程设计中碰到了很多的问题,我通过查阅相关书籍,资料,通过自己钻研,特别是得到了老师的谆谆教导,老师给予了我很大的帮助

6、,不仅给了我思路上的开阔,还让我认识到了自己对以前所学知识的不足方面。首先,综合课程设计让我把以前学习的知识得到了加深与巩固,对自己学习的知识有了一次全面的认识,也给自己指明了以后复习的重点与方向,再次,在程序设计中遇到的一些问题,我通过查阅资料,请教老师与同学,提高了自己解决问题的能力。但由于还有很多问题无法解决,导致很多功能不能实现,未能达到预期的目的。 随着社会的不断发展,计算机在各领域也得到广泛的应用,同时对软件的要求也越来越高,只有不断的利用新的知识来更新程序,才能满足社会的需求。但是,对于一个初学者来说,要想编译一个完美的程序是十分困难的。本程序就有许多的不足,以及编译时出现的困难

7、。列如:(1)在准备资料时,选取及设计适合的哈希函数,成首要难题,也是整个程序关键。因为在设计哈希函数时,要做到最大的减少冲突,确定在记录的储存位置和他个关键字之间建立一个取得对应关系,使没关键字和结构中的一个惟一的储存位置相对应,这是以个比较复杂的过程。(2)冲突是使用哈希表不可避免的问题。对不同的关键字却可能得到同一哈希地址,并且在一般情况下,冲突只能尽可能避免而不能完全避免。因此,在建造哈希表时不仅要设定以个好的哈希函数,而且要设定一种处理冲突的方法。在泵系统的开发过程中,主要采用了开放地址法中的二次探测法。通过这次课程设计,我发现了自身的很多不足,在以后的学习中,我会不断完善自我.不断

8、进取,使自己在编程这方面的能力得到更进一步的提高.6、参考文献1 谭浩强.C程序设计(第三版).北京:清华大学出版社.20052 刘斌.王忠.面向对象程序设计 Visual C+.北京:清华大学出版社.20033 严蔚敏.吴伟民.数据结构(C语言版).北京:清华大学出版社.20074 谭浩强编著.C+程序设计.北京:清华大学出版社,2004.5 美S巴斯计算机算法:设计和分析引论.朱洪等译.上海:复旦大学出版社.1985.6 Huddard J R.Prohramming with C+(英文版,第二版).北京:机械工业出版社.2002.87 陈华生.CV+程序设计基础.江苏:苏州大学出版社.

9、20027、源程序清单*程序源代码*#includestdio.); printf( * 哈希表 *n * 1. 创建哈希表 *n * 2. 按姓名散列 *n * 3. 按号码散列 *n * 0. 结束程序 *n *n printf(请选择您要运行的选项按(0-3): scanf(%d,&c); *读入选择* getchar(); while(c3); return(c); *返回选择*int Create(Record HM)创建辅助数组 int i; for(i=0;i30;i+)初始化哈希表 strcpy( Hi.add,0 strcpy( Hi.num, strcpy( Hi.name

10、, i=0; char sign; while(sign!=n&sign!N)请输入名字n scanf(%s,Infi.name);请输入号码n,Infi.num);请输入地址n,Infi.add);ttt还需要继续输入吗?(YN)ttt%csign); *输入判断* i+; return i;int Hash_name(char name20)以姓名为关键字的哈希函数 int i=0; int a=0; while(namei!0)计算姓名中每个字符的ASCII码值相加 a=a+namei; i+; a=a%29;对小于哈希表的最大素数求余,此处哈希表长为30,对29求余 return(a)

11、;void input_name(Record InfM,int m,Record HM)以姓名为关键字创建哈希表 int j,key=0; for(j=0;jm;j+) key=Hash_name(Infj.name);计算哈希地址 while(1) if(strcmp(Hkey.name,NULLKEY)=0)判断该位置是否为空,不为空就把辅助数组中的元素存到该位置 strcpy(Hkey.name,Infj.name); strcpy(Hkey.num,Infj.num); strcpy(Hkey.add,Infj.add); break; else key+;如果为空,采用线性探测法,

12、将元素后移 int Hash_num(char num20)以姓名为关键字的哈希函数 int b=0; while(numi!)计算电话号码中每个字符的ASCII码值相加 b=b+numi; b=b%29; return(b);void input_num(Record InfM,int m,Record HM)以电话号码为关键字创建哈希表 key=Hash_num(Infj.num); if(strcmp(Hkey.num,NULLKEY)=0)判断该位置是否为空,不为空就把辅助数组中的元素存到该位置 break; int Search_name(Record H,char name20)以

13、姓名为关键字的哈希表的查找函数 int key=0; key=Hash_name(name); while(strcmp(Hkey.name,name)!=0)如果元素不在该位置,将元素后移再判断 if(strcmp(Hkey.name,NULLKEY)=0)遇到空格表示该元素不存在 printf(查找名字不存在!n return(-1); return(key);返回查找到的哈希地址int Search_num(Record H,char num20)以电话号码为关键字的哈希表的查找函数 key=Hash_num(num); while(strcmp(num,Hkey.num)! if(st

14、rcmp(Hkey.num,NULLKEY)=0)遇到空格表示该元素不存在查找号码不存在n return(key);void Insert_name(Record HM,char name20,char num20,char add30)以姓名为关键字哈希表的插入函数 int key; while(1) if(strcmp(Hkey.name,NULLKEY)=0)如果该位置为空,把元素存到该位置 strcpy(Hkey.name,name); strcpy(Hkey.num,num); strcpy(Hkey.add,add);如果该位置不为空,向后移插入元素void Insert_num(

15、Record HM,char name20,char num20,char add30)以电话号码为关键字的哈希表插入函数 if(strcmp(Hkey.num,NULLKEY)=0)如果该位置为空,把元素存到该位置void Print_name(Record HM)以姓名为关键字的哈希表的输出函数t哈希地址t姓名tt号码tt地址ni+) if(strcmp(Hi.name,)!=0) printf(t%dtt%stt%stt%sn,i,Hi.name,Hi.num,Hi.add);void Print_num(Record HM)以电话号码为关键字的哈希表的输出函数 if(strcmp(Hi

16、.num, void Del_name(Record HM,char name20)以姓名为关键字的哈希表的删除函数 int key,t=0;设置t为标志位,如果该元素被删除了,把t置为1 int i,k; i=key; if(strcmp(Hkey.name,name)=0)如果元素存在该位置,将该位置置空 t=1; strcpy(Hkey.name, strcpy(Hkey.num, strcpy(Hkey.add, k=key; while(key30) key+; if(Hash_name(Hkey.name)=i)然后将哈希地址在该位置的存在后面的元素依次前移 strcpy(Hk.n

17、ame,Hkey.name); strcpy(Hk.num,Hkey.num); strcpy(Hk.add,Hkey.add); k=key; strcpy(Hkey.name, 如果元素不在该位置,向后移查找该元素再删除 if(t=0)t为0表示没有执行删除操作该姓名不存在!void Del_num(Record HM,char num20)以电话号码为关键字的哈希表的删除函数 int key=0,t=0; if(strcmp(Hkey.num,num)=0)如果元素存在该位置,将该位置置空 if(Hash_num(Hkey.num)=i)然后将哈希地址在该位置的存在后面的元素依次前移 如

18、果元素不在该位置,向后移查找该元素再删除 if(t=0)t为0表示没有执行删除操作该号码不存在!void main()主函数 char name20,num20; char a020,b020,c030; char a120,b120,c120; int m,i,g; int w,k; int flag=0; switch(menu_select() ) case 1: m=Create(H);创建辅助数组 case 2: input_name(Inf,m,H);以姓名为关键字创建哈希表 Print_name(H); while(1) flag=0; printf(1:查找n2:插入n3:删除

19、n0:返回n输入(0-3): scanf(g); switch(g) case 1:n请输入要查找的名字: scanf(,name); k=Search_name(H,name);查找该人的信息是:该人的姓名是:%sn,Hk.name);该人的电话号码是:,Hk.num);该人的地址是:,Hk.add); break; case 2:n请输入要插入的信息:插入的姓名是:,a0);插入的电话是:,b0);插入的地址是:,c0); Insert_name(H,a0,b0,c0);插入后的结果: Print_name(H); case 3:请输入要删除的名字: Del_name(H,name);删除后的信息: Print_name(H); case 0: flag=1;break; if(flag=1) break;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1