课程设计试验报告材料-哈希表地设计与实现

上传人:无*** 文档编号:82894439 上传时间:2022-04-30 格式:DOC 页数:34 大小:267KB
收藏 版权申诉 举报 下载
课程设计试验报告材料-哈希表地设计与实现_第1页
第1页 / 共34页
课程设计试验报告材料-哈希表地设计与实现_第2页
第2页 / 共34页
课程设计试验报告材料-哈希表地设计与实现_第3页
第3页 / 共34页
资源描述:

《课程设计试验报告材料-哈希表地设计与实现》由会员分享,可在线阅读,更多相关《课程设计试验报告材料-哈希表地设计与实现(34页珍藏版)》请在装配图网上搜索。

1、word数据结构课程设计题目哈希表的设计与实现作者院系信息工程学院专业信息管理与信息系统学号 1514210117 指导教师X慧辩论时间 2016年12月18日目录数据结构课程设计01系统需求分析23331.4 小结42系统设计44452.31以某某为关键字的Hash()函数流程图52.32添加结点信息流程图:72.33按某某查找流程图:78911111112123系统测试1313144总结185附录181系统需求分析在信息化时代的今天,计算机技术已经是开展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。在过去计算机内存容量小,CPU计算速度慢,关于程序设计中的

2、数据结构也因此提出来很多的关于解决这方面的问题。哈希表就是其中之一,哈希表是一个由关键字与值组成的特殊的一种数据结构。它的出现主要是为了解决在结构中查找记录时需要进展一系列和关键字的比拟,这一类查找方法是建立在“比拟的根底上的,在顺序等的查找中,查找的效率是依赖于查找过程中所比拟的次数。理想的情况是希望不经过任何的比拟一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系,使得每个关键字和结构中一个唯一的存储位置相对应。因而在查找时只要根据这个对应关系找到给定的值的像。假如结构中存在关键字和该值相等的记录,如此所要查找的数就必定就是这个所查找到的记录。哈希函数

3、是建立哈希表的一个重要的成员,它的构造方法分为以下几种:直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法。本程序中主要用的是除余取留法,除留取余法主要是取关键字被某个不大于哈希表表长m的数p出后所得余数为哈希地址即:H(key)=key MOD p, pnextq 不为空调用hash()函数中新结点q指向phonekey-next开始开始调用hash2()函数中新结点q指向phonekey-nextq 不为空q=q-nextq不为空输出无记录输出相应记录完毕struct node /建节点 char name8,address20;/节点中要包含用户名,用户地址,以与指向下一个

4、结点的指针char num11; node * next; ; typedef node* pnode; /typedef可以为一个已有的数据类型声明多个别名,这里为该类型声明了两个指针typedef node* mingzi; node *phone; node *nam; node *a;void hash(char num11) /以为关键字建立哈希函数 key=(int)num2; while(numi!=NULL) key+=(int)numi; i+; key=key%20; b) void hash2(char name8) /以用户名为关键字建立哈希函数 int i = 1;

5、key2=(int)name0; while(namei!=NULL) key2+=(int)namei; i+; key2=key2%20; void find(char num11) /在以为关键字的哈希表中查找用户信息 hash(num); node *q=phonekey-next; while(q!= NULL) if(strcmp(num,q-num)=0) break; q=q-next; if(q) printf(%s_%s_%sn,q-name,q-address,q-num);else printf(无此记录n); b)、void find2(char name8) / 在

6、以用户名为关键字的哈希表中查找用户信息 hash2(name); node *q=namkey2-next; while(q!= NULL) if(strcmp(name,q-name)=0) break; q=q-next; if(q) printf(%s_%s_%sn,q-name,q-address,q-num);else printf(无此记录n); 主函数本程序需要创建一个主菜单和一个主函数,主菜单便于用户的使用,主函数中,包括所有功能对应的数值,使之和主菜单相对应。*主函数界面设计如下* 0添加记录 1查找记录 2某某散列 3散列 4清空记录 5退出系统void menu() /菜

7、单 system(color 2d);printf(*n);printf(ttt*欢迎使用*tttn);printf(n);printf(tttt 0.添加记录ttttn); printf(tttt 1.查找记录ttttn); printf(tttt 2.某某散列ttttn); printf(tttt 3.散列ttttn); printf(tttt 4.清空记录ttttn); printf(tttt 5.退出系统ttttn); 3系统测试1首先键入0,添加结点信息,然后按1进展查找,分别进展和某某查找,最后可在主菜单中,选择散列和某某散列,由此查看程序运行结果。2语法错误与修改:程序是分块写的

8、,调试时可以使用分步调试的方式进展,以便能查找看程序是在哪出错了。本算法使用了链表结构和链地址法解决冲突的问题,在以某某为关键字的哈希表中要注意涉与ASCLL码的类型转换,要注意输出不能是“%d,否如此不能输出结果。编写程序时要多注意程序中各种指针的使用,还有各类变量的定义,函数的使用。这些问题均可以根据编译器的警告提示,对应的将其解决。3逻辑问题修改和调整:链表结构方法虽然方便了运行,但是增加了对算法过程的认识难度。在本程序中每一个函数中都需要涉与到指针的操作。所以需要仔细分析函数中的指针指向。在插入结点,查找结点时尤为突出。对于主菜单和主函数的对应,一定要一致,这样才能保证运行时不会出错。

9、4时间,空间性能分析:散列法本质上是一种通过关键字直接计算存储地址的方法。在理想情况下,散列函数可以把结点均匀地分布到散列表中,不发生冲突,如此查找过程无需比拟,其时间复杂度On=1。但在实际使用过程中,为了将X围广泛的关键字映射到一组连续的存储空间,往往会发生同义词冲突,这时在查找过程中就需要进展关键字比拟。因此散列法的查找性能取决于3个因素:散列函数、冲突处理方法和填充因子。采用链地址法,可以从根本上杜绝“二次聚集的发生,从而提高散列表的均匀度,提高查找性能,不过也会“浪费一局部散列表的空间。当散列函数和冲突处理方法固定时,散列法的查找性能就取决于散列表的填充因子。填充因子a=表中已有的结

10、点数/表的长度。填充因子a标志表的添满程度。很显然,a越小如此发生冲突的机会就越小;反之,a越大冲突的机会就越大,查找的性能也就越低。哈希表链地址法查找成功的平均查找长度SNc=1+a/2。链地址法查找不成功的平均查找长度Un满足:Unc=a+e-a.由以上可以看出,散列表的平均查找长度是填充因子的函数,和散列表的长度没有关系,因此在实际应用中,我们应该选择一个适当的填充因子,以便把平均查找长度控制在一个尽量小的X围内。程序主菜单添加记录:分别按和某某查找:分别输出按某某和散列的结果:清空记录:4总结经过为期两周的课程设计,此次课程设计时间虽然比拟短暂,但是我通过这次实践学到了很多知识,也了解

11、了自己的很多的不足之处。我是一名信息工程学院的学生,数据结构对于我来说就显得尤为重要,这也是我必须认真学懂的一门课程。在课程设计之前,我们已经学习C语言这门课程已经一个学期,对其有了一定的了解,但是更多的还是停留在学习了解的X围,对里面的好多东西还是很陌生,并不是很熟练,有着许多欠缺,更多的在运用起来的时候还是感到很不好动手。C语言课堂上许多关于C语言的语法规如此,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用C语言这个工具解决实际问题,又必须掌握它。通过屡次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的根底上就会自然而然地掌握C语言的语法规定。对于一些内容自

12、己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,更加巩固了学过的知识,而且在设计的时候学要系统的知识,也是一个较大的挑战,某一方面知识的欠缺都将影响到整个程序的设计。我从原来的对这门课程的不懂,到目前的能够独立完成一个小型程序。这次课程设计,重温了和学习了许多有关c语言的知识,还掌握了一些现实中编程的一些小技巧,实际的编程能力也得到了历练,本次课程设计对我帮助很多。5附录*程序源代码*#include#include #define NULL 0 unsigned int key; /定义两个关键字unsigned int key2; int *p; struct node /建节点每

13、个结点包括用户某某、地址、以与指向下一个结点的指针char name8,address20; char num11; node * next; ; typedef node* pnode; /typedef可以为一个已有的数据类型声明多个别名,这里为该类型声明了两个指针typedef node* mingzi; node *phone; node *nam; node *a; void hash(char num11) /哈希函数,以为关键字建立哈希函数 /哈希函数的主旨是将的十一位数字全部加起来int i = 3; key=(int)num2; while(numi!=NULL) key+=

14、(int)numi; i+; key=key%20; void hash2(char name8) /哈希函数以用户名为关键字建立哈希函数/利用强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数int i = 1; key2=(int)name0; while(namei!=NULL) key2+=(int)namei; i+; key2=key2%20; node* input() /输入节点信息,建立结点,并将结点的next指针指空node *temp; temp = new node; /new的功能是动态分配内存,语法形式:new 类型名T初值列表temp-ne

15、xt=NULL; printf(请输入某某:n);scanf(%s,temp-name);printf(输入地址: n);scanf(%s,temp-address);printf(输入:n);scanf(%s,temp-num);return temp; /对于指针类型返回的是地址int apend() /添加节点node *newphone; node *newname; newphone=input(); newname=newphone; newphone-next=NULL; newname-next=NULL; hash(newphone-num); /利用哈希函数计算出对应关键字

16、的存储地址hash2(newname-name); newphone-next = phonekey-next; /利用为关键字插入phonekey-next=newphone; /是采用链地址法,拉链法处理冲突的散列表结构newname-next = namkey2-next; /利用用户名为关键字插入namkey2-next=newname; return 0; void create() /新建节点int i; phone=new pnode20;/动态创建对象数组for(i=0;inext=NULL; void create2() /新建节点int i; nam=new mingzi2

17、0; for(i=0;inext=NULL; void list() /显示列表int i; node *p; for(i=0;inext; while(p) printf(%s_%s_%sn,p-name,p-address,p-num);p=p-next; void list2() /显示列表int i; node *p; for(i=0;inext; while(p) printf(%s_%s_%sn,p-name,p-address,p-num);p=p-next; void find(char num11) /在以为关键字的哈希表中查找用户信息hash(num); node *q=p

18、honekey-next; while(q!= NULL) if(strcmp(num,q-num)=0) break; q=q-next; if(q) printf(%s_%s_%sn,q-name,q-address,q-num);else printf(无此记录n); void find2(char name8) / 在以用户名为关键字的哈希表中查找用户信息hash2(name); node *q=namkey2-next; while(q!= NULL) if(strcmp(name,q-name)=0) break; q=q-next; if(q) printf(%s_%s_%sn,

19、q-name,q-address,q-num);else printf(无此记录n); void menu() /菜单printf(0.添加记录n); printf(1.查找记录n); printf(2.某某散列n); printf(3.散列n); printf(4.清空记录n); printf(5.退出系统n); int main() char num11; char name8; create(); create2() ; int sel; while(1) menu(); scanf(%d,&sel); if(sel=1) printf(6查询,7某某查询n); int b; scanf

20、(%d,&b); if(b=6) printf(请输入:n); scanf(%s,num);printf(输出查找的信息:n); find(num); else printf(请输入某某:n); scanf(%s,name); printf(输出查找的信息:n); find2(name); if(sel=2) printf(某某散列结果:n); list2(); if(sel=0) printf(请输入要添加的内容:n); apend(); if(sel=3) printf(散列结果:n); list(); if(sel=4) printf(列表已清空:n); create();create2(); if(sel=6) return 0; return 0; 文案大全

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!