数据结构课程设计哈希表设计.doc

上传人:土8路 文档编号:10290383 上传时间:2021-05-05 格式:DOC 页数:12 大小:186KB
返回 下载 相关 举报
数据结构课程设计哈希表设计.doc_第1页
第1页 / 共12页
数据结构课程设计哈希表设计.doc_第2页
第2页 / 共12页
数据结构课程设计哈希表设计.doc_第3页
第3页 / 共12页
数据结构课程设计哈希表设计.doc_第4页
第4页 / 共12页
数据结构课程设计哈希表设计.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《数据结构课程设计哈希表设计.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计哈希表设计.doc(12页珍藏版)》请在三一文库上搜索。

1、哈希表设计 一 需求分析 1.1 针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序. 1.2 人名为汉语拼音形式,最长不超过19个字符(如:庄双双 zhuangshuangshuang). 1.3 假设待填入哈希表的人名有30个,平均查找长度为2。哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。 1.4 测试数据:1)输入数据:zengqinhui,mayuelong,chenzhicheng,sunpeng,wanghui,liqingbo,liujunpeng,jiangquanlei,xingzhengchuan,luzhaoqian,gaow

2、enhu,zhuhaoyin,chenlili,wuyunyun,huangjuanxia,wangyan,zhoutao,jiangzhenyu,liuxiaolong,wangziming,fengjunbo,lilei,wangjia,zhangjianguo,zhuqingqing,huangmin,haoyuhan,zhoutao,zhujiang,lixiaojun.2)D. 显示哈希表地址 关键字 搜索长度 H(key) 姓名0 0 1 0 (null)1 1505 1 1 xingzhengchuan2 1083 1 2 wangziming3 755 1 3 wanghui4

3、 991 1 4 zhuhaoyin5 757 1 5 wangyan6 1272 2 3 jiangquanlei7 853 1 7 liqingbo8 1089 1 8 liujunpeng9 855 1 9 huangmin10 527 1 10 lilei11 0 12 0 (null)12 979 3 39 lixiaojun13 1084 3 3 luzhaoqian14 1283 1 14 huangjuanxia15 861 1 15 haoyuhan16 768 1 16 sunpeng17 0 0 0 18 1193 1 18 zengqinghui19 862 2 16

4、gaowenhu20 1195 1 20 liuxiaolong21 1196 1 21 jiangzhenhu22 1285 2 16 zhangjianguo23 864 2 18 zhujiang24 0 0 025 0 0 026 778 1 26 zhuotao27 958 2 18 fengjunbo28 0 0 029 0 0 030 1205 1 30 zhuqingqing31 0 0 032 737 1 32 wangjia33 0 0 034 0 0 035 778 2 26 zhuotao36 0 0 037 977 1 37 mayuelong38 0 0 039 9

5、32 1 39 wuyunyun40 1262 1 40 chenzhicheng41 840 1 41 chenlili42 0 0 043 0 0 044 0 0 045 0 0 046 0 0 047 0 0 048 0 0 049 0 0 0平均查找长度:ASL(30)= 1.766667F. 查找请输入姓名的拼音:wangjia结果:姓名:wangjia 关键字:737 查找长度为:1请输入姓名的拼音:luzhaoqian结果:姓名:luzhaoqian 关键字:1084 查找长度为:3请输入姓名的拼音:luzhao结果:无此记录Q. 退出y结果:Press ang key to c

6、ontinue二. 概要设计2.1 基本操作 void InitNameList() 姓名(结构体数组)初始化 操作结果:名字以拼音的形式够成字符串,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。 void CreateHashList() 建立哈希表 操作结果: (1) 用除留余数法构建哈希函数 (2) 用伪随机探测再散列法处理冲突 void FindList() 查找哈希表 操作结果:在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度 void Display() 操作结果:显示哈希表的的格式:n地址t关键字tt搜索长度tH(key)

7、t 姓名n void main() 主函数设计 操作结果:主函数显示格式:D. 显示哈希表nF. 查找nQ. 退出n请选择:2.2 主程序Void main() 初始化; While(命令!=退出) 接受命令; 处理命令;2.3 模块调用关系主函数模块显示模块查找模块哈希表模块初始化模块三 详细设计 3.1 存储结构设计typedef struct char *py; /名字的拼音 int k; /拼音所对应的整数NAME; typedef struct /哈希表 char *py; /名字的拼音 int k; /拼音所对应的整数 int si; /查找长度HASH; 3.2 姓名(结构体数组

8、)初始化 名字以拼音的形式够成字符串,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。void InitNameList() char *f; int r,s0,i; NameList0.py=zengqinghui; NameList1.py=mayuelong; NameList2.py=chenzhicheng; NameList3.py=sunpeng; NameList4.py=wanghui; NameList5.py=liqingbo; NameList6.py=liujunpeng; NameList7.py=jiangquanlei; NameLis

9、t8.py=xingzhengchuan; NameList9.py=luzhaoqian; NameList10.py=gaowenhu; NameList11.py=zhuhaoyin; NameList12.py=chenlili; NameList13.py=wuyunyun; NameList14.py=huangjuanxia; NameList15.py=wangyan; NameList16.py=zhoutao; NameList17.py=jiangzhenyu; NameList18.py=liuxiaolong; NameList19.py=wangziming; Na

10、meList20.py=fengjunbo; NameList21.py=lilei; NameList22.py=wangjia; NameList23.py=zhangjianguo; NameList24.py=zhuqingqing; NameList25.py=huangmin; NameList26.py=haoyuhan; NameList27.py=zhoutao; NameList28.py=zhujiang; NameList29.py=lixiaojun; for(i=0;iNAME_NO;i+) s0=0; f=NameListi.py; for(r=0;*(f+r)!

11、=0;r+) */将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/ s0=*(f+r)+s0; NameListi.k=s0; 3.3 建立哈希表 (1) 用除留余数法构建哈希函数 (2) 用伪随机探测再散列法处理冲突void CreateHashList() int i; for(i=0; iHASH_LENGTH;i+) HashListi.py=; HashListi.k=0; HashListi.si=0; for(i=0;iHASH_LENGTH;i+) int sum=0; int adr=(NameListi.k)%M; /哈希函数 int d=adr

12、; if(HashListadr.si=0) /如果不冲突 HashListadr.k=NameListi.k; HashListadr.py=NameListi.py; HashListadr.si=1; else /冲突 do d=(d+NameListi.k%10+1)%M; /伪随机探测再散列法处理冲突 sum=sum+1; /查找次数加1 while (HashListd.k!=0); HashListd.k=NameListi.k; HashListd.py=NameListi.py; HashListd.si=sum+1; 3.4 查找哈希表 在哈希表中进行查找,输出查找的结果和

13、关键字,并计算和输出查找成功的平均查找长度void FindList() char name20=0; int s0=0,r,sum=1,adr,d; printf(请输入姓名的拼音:); scanf(%s,name); for(r=0;r20;r+) /求出姓名的拼音所对应的整数(关键字) s0+=namer; adr=s0%M; /使用哈希函数 d=adr; if(HashListadr.k=s0) /分3种情况进行判断 printf(n姓名:%s 关键字:%d 查找长度为: 1,HashListd.py,s0); else if (HashListadr.k=0) printf(无此记录

14、!); else int g=0; do d=(d+s0%10+1)%M; /伪随机探测再散列法处理冲突 sum=sum+1; if(HashListd.k=0) printf(无此记录! ); g=1; if(HashListd.k=s0) printf(n姓名:%s 关键字:%d 查找长度为:%d,HashListd.py,s0,sum); g=1; while(g=0); 3.5 显示哈希表 显示哈希表的的格式: n地址t关键字tt搜索长度tH(key)t 姓名nvoid Display() int i; float average=0; printf(n地址t关键字tt搜索长度tH(k

15、ey)t 姓名n); /显示的格式 for(i=0; i50; i+) printf(%d ,i); printf(t%d ,HashListi.k); printf(tt%d ,HashListi.si); printf(tt%d ,HashListi.k%M); printf(t %s ,HashListi.py); printf(n); for(i=0;i&ch1;switch(ch1)case D:Display(); coutendl;break;case F:FindList();coutendl;break;case Q:exit(0); cout&ch1;while(ch1!=

16、n); 四. 调试分析 4.1 本次作业比较简单,只有一个核心算法就是构造散列函数的算法,在调试的时候发现 string的问题(系统自带的),输入的人名不应该含有空格字符,否则回出现逻辑错误,这是程序的一个问题,如果要修改成char型处理方法类似就没改。在调试其他代码时候没有出现问题,比较顺利的调试成功。 4.2 有些函数不写系统会自己生成,为了避免出错自己写了上去只是声名并没有定义,如果用了编译器会报错。 4.3 算法改进:伪随机探查法能够消除基本聚集,但是如果两个关键子有相同的基位置,那么他们就有同样的探查序列。采用双散列法能够避免这样,双散列函数使用两个和散列函数,第一个探查序列的起始值

17、,第二个计算下一个位置的探查步长。 4.4 问题的发现与解决:题目中明确规定了用除留余数法创建哈希函数和用伪随机探测再散列法处理冲突,程序设计的方法几乎已经被规定,只要按照题目要求写程序不会太难。不过在写程序过程中还是发现了一些小问题,主要是因为自己上机试验少,以后多上机实践能够避免的。 4.5 经验体会:借助DEBUG调试器和数据观察窗口,可以加快找到程序中的错误,采用软件工程的方法将程序划分层次结构使得代码设计时思路清晰,实现时调试顺利,得到了一次良好的程序设计训练。五. 用户手册5.1 本程序的运行环境为DOS 操作系统,执行文件为:yun.exe。5.2 进入演示程序后即显示文本方式的

18、用户界面:哈希表设计 D. 显示哈希表 F. 查找 Q. 退出 请选择:5.3 进入用户界面后,即提示键入操作符号,结束符为“回车符”。5.4 接受其他命令后即执行相应操作和显示相应结果。六. 测试结果测试用例程序运行结果如下 程序运行后显示如下6.1 选择D 查找,显示哈希表和平均查找长度,其中平均查找长度小于2,符合题目要求6.2 选择F 查找, 输入要查找的人的姓名,若存在则显示名字和对应的关键字以及查找长度;若不存在则显示无此记录6.3 选择Q 退出 , 如要继续可按任意键七. 附录 碧云.cpp 哈希表的定义与主程序八. 参考文献1严蔚敏,吴伟民.数据结构M.北京:清华大学出版社,2

19、0062谭浩强,C语言程序设计M.北京:高等教育出版社,2006 3李春葆,数据结构教程M .北京:清华大学出版社,2005 4数据结构c+语言描述William Ford和William Topp著,刘卫东和沈官林译,清华大学出版社,2009九. 心得与体会经过这次课程设计的学习,让我明白了编写程序的思路是很重要的。在你编写一个程序之前,如果你的脑袋里面没有思路,根本就不可能编出好的程序。就算能编出程序来,相信编出的程序的逻辑性也不会很强,因为你是想到什么就编什么,不系统。因此在我们编程序之前一定要做好充分的准备,首先要理清自己的思路,然后再将思路分划成几个模块,一块一块的编写,最后再将所有

20、的模块联系起来,组成一个完整的程序。在上机实验之前,最好将程序编写好在草稿纸上,这样在编译的时候也比较有效率。借助DEBUG调试器和数据观察窗口,可以加快找到程序中的错误,采用软件工程的方法将程序划分层次结构使得代码设计时思路清晰,实现时调试顺利,得到了一次良好的程序设计训练。 其实在这次课程设计的过程中,我也遇到了很多难题。在种种的困难中,我明白了耐心在编写程序时的重要性。如果你没有耐心就肯定编不出好的程序,特别是在调试的过程中。我们初次写的程序在电脑上调试的时候也许会出项几百个错误,这时候我们应该耐心的检查出错的地方和原因,并予以改正。而不是抱怨自己写的程序太烂错误太多,就此放弃。相信再强

21、的人也不可能一次就能编译成功,总会有一些问题出现。其实只要有耐心,你就会发现,在你修改了一个错误之后,其它有的错误也会跟着消失,所以在编译的时候一定要有耐心。这段时间的课程设计,我也认识到数据结构是一门比较难的课程,需要花很多的时间去练习和实践。要想把这门课程学好学精不是一件容易的事,但是相信事在人为,只要肯下功夫就一定能学好。总的来说,这次程序设计让我获益匪浅,相信在以后的学习生活中我也能从中获得启发。最后,此次课程设计引导我们尽可能多地运用所学过的知识,同时也用到了课外的知识,灵活的完成编码通过问题分析和任务定义体现了分析问题的能力;通过设计体现我们抽象思维的能力;通过详细设计程序编码体现我们解决问题的能力;通过程序调试与测试体现我们动手能力和发现问题并完善问题的能力;通过编写课程设计报告体现我们书写程序文档的能力。同时此次课程设计也让我更加全面的认识到自己专业知识的缺乏和在解决一个实际问题上的不足方面,比如粗心,心浮气躁等等,更加激励自己以后要努力学习专业知识,提高自身素质,从各方面提高解决问题的能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1