哈希表的设计与实现课程设计报告.docx

上传人:小飞机 文档编号:3365709 上传时间:2023-03-12 格式:DOCX 页数:18 大小:41.92KB
返回 下载 相关 举报
哈希表的设计与实现课程设计报告.docx_第1页
第1页 / 共18页
哈希表的设计与实现课程设计报告.docx_第2页
第2页 / 共18页
哈希表的设计与实现课程设计报告.docx_第3页
第3页 / 共18页
哈希表的设计与实现课程设计报告.docx_第4页
第4页 / 共18页
哈希表的设计与实现课程设计报告.docx_第5页
第5页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《哈希表的设计与实现课程设计报告.docx》由会员分享,可在线阅读,更多相关《哈希表的设计与实现课程设计报告.docx(18页珍藏版)》请在三一办公上搜索。

1、哈希表的设计与实现 课程设计报告一 : 需求分析 . 2 三: 详细设计 . 4 1. 程序描述: . 4 2具体步骤 . 4 四 调试分析和测试结果 . 7 五,总结. 9 六.参考文献; . 10 七.致谢. 10 八.附录. 11 一 : 需求分析 问题描述:设计哈希表实现电话号码查询系统。 基本要求 1、设每个记录有下列数据项:电话号码、用户名、地址 2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表; 3、采用再哈希法解决冲突; 4、查找并显示给定电话号码的记录; 5、查找并显示给定用户名的记录。 6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长

2、度的变化。 二: 概要设计 进入主函数,用户输入1或者2,进入分支选择结构:选1:以链式方法建立哈希表,选2:以再哈希的方法建立哈希表,然后用户输入用户信息,分别以上述确定的方法分别以用户名为检索以及以以电话号码为检索将用户信息添加到哈希表,.当添加一定量的用户信息后,用户接着输入用户名或者电话号码分别以用户名或者电话号码的方式从以用户名或电话号码为检索的哈希表查找用户信息.程序用链表的方式存储信息以及构造哈希表。 具体流程图如下所示: 主函数 输入1 输入2 链式法构造哈希表表 再哈希法构造哈希表 输入用户信息 输入用户信息 分别以电话和姓名为检索将信息存储到哈希表 输入1 输入电 话 输入

3、2 输 入 姓 名 分别以电话和姓名为检索将信息存储到哈希表 输入1 输入电 话 输入2 输 入 姓 名 以电话为索引查找用户信息 以姓名为索引查找用户信息 以电话为索引查找用户信息 以姓名为索引查找用户信息 程序结束 三: 详细设计 1. 程序描述: 本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括电话号码、用户名、地址;用结构体存储 struct node string phone; /电话号码 string name; /姓名 string address;/地址 node *next; /链接下一个地址的指针 ; 2具体步骤 1. 要求主要用在哈希法解决冲突,并且至少尝试

4、用两种方法解决冲突,定义两个指针数组存储信息node *infor_phoneMAX; node *infor_nameMAX;前者以电话号码为关键字检索哈希表中的信息,后者以姓名为关键字检索哈希表中的信息 用链式法和再哈希法解决冲突: int hash(string key) /以姓名或者电话号码的前四位运算结果作为哈 /希码 int result=1,cur=0,i; if(key.size=0;i-) cur=keyi-0; result=result*9+cur; result%=(MOD); return result; 2.得到输入信息的哈希码以后,将相应的信息插入对应的地址,若产

5、生冲突,则循环到这个地址的最后一个节点,然后再将节点插入到这个位置,这样就避免了冲突,在查找的时候便可直接找到这个地址然后快速的查找到信息: void add_infor_phone(string phone,string name,string address) int value=hash(phone); node *infor=build_infor(phone,name,address); if(infor_phonevalue=NULL) infor_phonevalue=infor; else node *cur=infor_phonevalue; while(cur-next)

6、cur=cur-next; cur-next=infor; 3. 再哈希法也是解决冲突的常见方法,当同义词产生地址冲突时计算另一个哈希函数地址,知道冲突不再发生,这种方法不易产生聚义,但是增加了计算时间: int hash_agin(int numble,int key) /将关键字的前四位数经过计算的结果 /模上一个定义的数然后返回的数字为 return numble%key; /哈希码 int create(string key) int result=1,cur=0,i; if(key.size=0;i-) cur=keyi-0; result=result*9+cur; return

7、result; 4. 同样用链表为储存信息的数据结构,当产生冲突时,将模数减去一然后再寻找地址直到不再产生冲突: void add_infors(string phone,string name,string address) int numble_phone=create(phone),key=MOD,pos_phone,pos_name; while(infor_phonepos_phone=hash_agin(numble_phone,key)!=NULL) key-; key=MOD; int numble_name=create(name); while(infor_namepos_

8、name=hash_agin(numble_name,key)!=NULL) key-; node *inforphone=new node; node *inforname=new node; inforphone-name=inforname-name=name; inforphone-phone=inforname-phone=phone; inforphone-address=inforname-address=address; inforphone-next=inforname-next=NULL; infor_phonepos_phone=inforphone; infor_nam

9、epos_name=inforname; 5 .帮主函数bool usersayyes,返回一个bool值,要求用户输入一个正确的选项,减少程序因错误输入而出现的问题: bool usersayyes string sig; bool continu=true; 四 调试分析和测试结果 1.用链式法将用户信息添加到哈希表: coutsig&(sig!=Y&sig!=y)&(sig!=N&sig!=n) cout输入错误,请重新输入!endl; return sig=Y|sig=y; 2.以姓名为关键字检索用户信息: 3.当哈希表中不存在此项记录时: 4再哈希法将用户信息添加到哈希表: 5以姓名

10、为检索在哈希表中查找用户信息: 6.以电话为检索在哈希表中查询信息: 使用哈希表能在较短的时间内查找出数据,程序的结果基本和理论相符合。 五,总结 通过做这个课程设计,使我们对如何去解决分析一个没有接触过的问题有深刻的认识,我们开始对题目有很多误解,根本没有思路,经过老师的几次讲解和我们自己很多的讨论,最终把问题进行转换,老师的要求是为了一个映射关系,我们找到了一个算法,算法和公式是可以相互转换的,在这个过程我们发现自己的程序有很多问题,经过我们不断对算法进行修改使得我们的程序运行的更快。哈希表的设计与实现这一算法始终围绕怎样解决冲突和怎样快速查找数据为目的,要求用在哈希法和链式法设计和实现哈

11、希表,经过查阅资料请教同学问题渐渐的变得清晰,在分析问题,思考问题和解决问题的过程中,很大程度上培养了我们的动手和动脑的能力,开始选择一个合适的数据结构,然后依据算法编码,调试,最后得出正确结论,整个过程虽然遇到了很多问题,特别是指针的冲突,这样在不知不觉中培养了我的耐性,“数据结构与算法”课程是计算机专业的一门十分重要的核心基础课程。这次的课程设计,拓广了我解决实际问题的程序设计的思路,也培养了对于问题进行深入探究的习惯。我更加深刻的体会到各种路由算法的特点,以及性能的优劣。为我今后专业课程的学习奠定了坚实的理论基础! 六.参考文献; 1. 数据结构 严蔚敏,吴伟明清华大学出版社 2. 算法

12、导论 Thoms.H.Cormen , Charles E.Leiserson , Ronald L.Rivest, Clifford Stein著 潘金贵,顾铁成,李成法译 第二版 机械工业出版社 3. 数据结构基础(C语言版)(第2版) Ellis Horowitz,Sartaj Sahni,Susan Anderson-Freed 著 朱仲涛译 清华大学出版社 4. 数据结构与算法分析:C语言描述(英文版.第2版) Mark Allen Weiss 著 机械工业出版社 5. 算法之道 邹恒明 (第2版) 机械工业出版社 七.致谢 在这次课程设计的撰写过程中,我得到了许多人的帮助。 首先我

13、要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。 其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。同时也感谢学院为我提供良好的做毕业设计的环境。 最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学 八.附录 #include #include using namespace std; #define MAX 10000 #define MOD 9873 struct no

14、de /定义储存学生信息的结构体 string phone; ; node *infor_phoneMAX; /存放信息的指针数组 node *infor_nameMAX; void init /初始化初始化指针数组 bool usersayyes /帮助函数要求用户输入正确的选项 string sig; for(int i=0;iMAX;i+) infor_phonei=NULL; infor_namei=NULL; string name; string address; node *next; bool continu=true; coutsig&(sig!=Y&sig!=y)&(sig

15、!=N&sig!=n) cout输入错误,请重新输入!endl; return sig=Y|sig=y; /再哈希法 int hash_agin(int numble,int key) /再哈希法获得地址的函数 return numble%key; int create(string key) int result=1,cur=0,i; if(key.size=0;i-) cur=keyi-0; result=result*9+cur; return result; void add_infors(string phone,string name,string address) /再希法添/加

16、用户信息到哈希表 int numble_phone=create(phone),key=MOD,pos_phone,pos_name; while(infor_phonepos_phone=hash_agin(numble_phone,key)!=NULL) key-; key=MOD; int numble_name=create(name); while(infor_namepos_name=hash_agin(numble_name,key)!=NULL) key-; node *inforphone=new node; node *inforname=new node; inforph

17、one-name=inforname-name=name; inforphone-phone=inforname-phone=phone; inforphone-address=inforname-address=address; inforphone-next=inforname-next=NULL; infor_phonepos_phone=inforphone; infor_namepos_name=inforname; void find_byname(string name) /以名字为关键字查询用户信息 int numble_name=create(name),key=MOD,po

18、s_name; while(true) pos_name=hash_agin(numble_name,key); if(infor_namepos_name=NULL) cout不存在你要查找的信息!endl; cout-name=name) cout姓名:; coutnameendl; cout电话:; coutphoneendl; cout地址:; coutaddressendl; cout-endl; return ; key-; void find_byphone(string phone) /以电话为关键字查询用户信息 int numble_phone=create(phone),k

19、ey=MOD,pos_phone; while(true) pos_phone=hash_agin(numble_phone,key); if(infor_phonepos_phone=NULL) cout不存在你要查找的信息!endl; cout-phone=phone) cout姓名:; coutnameendl; cout电话:; coutphoneendl; cout地址:; coutaddressendl; cout-endl; return ; key-; void find string sig,infor; coutsig&(sig!=1&sig!=2) cout输入错误,请重

20、新输入!endl; coutinfor; if(sig=1) find_byname(infor); else find_byphone(infor); /链表法 int hash(string key) /链表法获得哈希码 int result=1,cur=0,i; if(key.size=0;i-) cur=keyi-0; result=result*9+cur; result%=(MOD); return result; node * build_infor(string phone,string name,string address) /存储用户信息到哈希表 void add_inf

21、or_phone(string phone,string name,string address) int value=hash(phone); node *information=new node; information-phone=phone; information-name=name; information-address=address; information-next=NULL; return information; node *infor=build_infor(phone,name,address); if(infor_phonevalue=NULL) infor_ph

22、onevalue=infor; else node *cur=infor_phonevalue; while(cur-next) cur=cur-next; cur-next=infor; void add_infor_name(string phone,string name,string address) int value=hash(name); node *infor=build_infor(phone,name,address); if(infor_namevalue=NULL) infor_namevalue=infor; else node *cur=infor_namevalu

23、e; while(cur-next) cur=cur-next; cur-next=infor; void findinfor /分别以名字和电话为关键字查询用户信息 string infor; int sig,pos; coutsig&(sig!=1&sig!=2) cout输入错误,请重新输入!endl; coutinfor; if(sig=1) bool flag=true; pos=hash(infor); node * cur=infor_phonepos; while(cur) if(cur-phone=infor) cout姓名:namenext; cout电话:phoneend

24、l; cout地址:addressendl; flag=false; break; if(flag) cout不存在要查找的记录!endl; cout-name=infor) cout姓名:nameendl else cout输入错误,请重新输入:endl; cout-next; flag=false; break; 电话:phoneendl 地址:addressendl; if(flag) cout不存在要查找的记录!endl; cout-endl; findinfor; void hash_frist int numble; string phone,name,address,sig; i

25、nit; coutnumble; while(numble-) coutname; coutphone; coutaddress; cout-endl; add_infor_phone(phone,name,address); add_infor_name(phone,name,address); do findinfor; while(usersayyes); void hash_second int numble; string phone,name,address,sig,infor; init; coutnumble; while(numble-) coutname; coutphone; coutaddress; cout-endl; add_infors(phone,name,address); do find; while(usersayyes); int main /主函数 string chois; coutchois&(chois!=1&chois!=2) cout输入错误,请重新输入!endl; if(chois=1) hash_frist; if(chois=2) hash_second; return 0;

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号