哈希表的设计与实现 课程设计报告_第1页
哈希表的设计与实现 课程设计报告_第2页
哈希表的设计与实现 课程设计报告_第3页
哈希表的设计与实现 课程设计报告_第4页
哈希表的设计与实现 课程设计报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、 为索引查找用户信息以姓名为索引查找用户信息 程序结束三: 详细设计(含代码分析)1. 程序描述: 本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括 号码、用户名、地址;用结构体存储struct node string phone; / 号码string name; /姓名string address;/地址node *next; /链接下一个地址的指针;2具体步骤1. 要求主要用在哈希法解决冲突,并且至少尝试用两种方法解决冲突,定义两个指针数组存储信息node *infor_phoneMAX; node *infor_nameMAX;前者以 号码为关键字检索哈希表中的信息,后者

4、以姓名为关键字检索哈希表中的信息用链式法和再哈希法解决冲突:int hash(string key) /以姓名或者 号码的前四位运算结果作为哈 /希码int result=1,cur=0,i;if(key.size()<=4)i=key.size()-1;else i=4;for(;i>=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) cur=cur->next; cur->next=infor;3. 再哈希法也是解

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

7、+cur; return 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(inf

8、or_namepos_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;

9、 infor_phonepos_phone=inforphone; infor_namepos_name=inforname;5 .帮主函数bool usersayyes(),返回一个bool值,要求用户输入一个正确的选项,减少程序因错误输入而出现的问题:bool usersayyes() string sig; bool continu=true; cout<<"请输入(N/n)或(Y/y),(N/n)代表退出,(Y/y)代表继续:" while(cin>>sig&&(sig!="Y"&&sig!

10、="y")&&(sig!="N"&&sig!="n") cout<<"输入错误,请重新输入!"<<endl; return sig="Y"|sig="y"四 调试分析和测试结果1.用链式法将用户信息添加到哈希表:2.以姓名为关键字检索用户信息:3.当哈希表中不存在此项记录时:4再哈希法将用户信息添加到哈希表:5以姓名为检索在哈希表中查找用户信息:6.以 为检索在哈希表中查询信息:使用哈希表能在较短的时间内查找出数据,程序

11、的结果基本和理论相符合。五,总结通过做这个课程设计,使我们对如何去解决分析一个没有接触过的问题有深刻的认识,我们开始对题目有很多误解,根本没有思路,经过老师的几次讲解和我们自己很多的讨论,最终把问题进行转换,老师的要求是为了一个映射关系,我们找到了一个算法,算法和公式是可以相互转换的,在这个过程我们发现自己的程序有很多问题,经过我们不断对算法进行修改使得我们的程序运行的更快。哈希表的设计与实现这一算法始终围绕怎样解决冲突和怎样快速查找数据为目的,要求用在哈希法和链式法设计和实现哈希表,经过查阅资料请教同学问题渐渐的变得清晰,在分析问题,思考问题和解决问题的过程中,很大程度上培养了我们的动手和动

12、脑的能力,开始选择一个合适的数据结构,然后依据算法编码,调试,最后得出正确结论,整个过程虽然遇到了很多问题,特别是指针的冲突,这样在不知不觉中培养了我的耐性,“数据结构与算法”课程是计算机专业的一门十分重要的核心基础课程。这次的课程设计,拓广了我解决实际问题的程序设计的思路,也培养了对于问题进行深入探究的习惯。我更加深刻的体会到各种路由算法的特点,以及性能的优劣。为我今后专业课程的学习奠定了坚实的理论基础!六.参考文献;1. 数据结构 严蔚敏,吴伟明(c语言版)清华大学出版社2. 算法导论 Thoms.H.Cormen , Charles E.Leiserson , Ronald L.Rive

13、st, Clifford Stein著潘金贵,顾铁成,李成法译 第二版 机械工业出版社3. 数据结构基础(C语言版)(第2版) Ellis Horowitz,Sartaj Sahni,Susan Anderson-Freed 著 朱仲涛译 清华大学出版社4. 数据结构与算法分析:C语言描述(英文版.第2版) Mark Allen Weiss 著 机械工业出版社 5. 算法之道 邹恒明 (第2版) 机械工业出版社在这次课程设计的撰写过程中,我得到了许多人的帮助。首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术

14、上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计商的难题。同时也感谢学院为我提供良好的做毕业设计的环境。最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学#include<iostream>#include<string>using namespace std;#define MAX 10000#define MOD 9873struct node /定义储存学生信息的结构体 string phone;string name;string

15、 address;node *next;node *infor_phoneMAX; /存放信息的指针数组node *infor_nameMAX;void init() /初始化初始化指针数组for(int i=0;i<MAX;i+)infor_phonei=NULL;infor_namei=NULL;bool usersayyes() /帮助函数要求用户输入正确的选项 string sig; bool continu=true; cout<<"请输入(N/n)或(Y/y),(N/n)代表退出,(Y/y)代表继续:" while(cin>>sig

16、&&(sig!="Y"&&sig!="y")&&(sig!="N"&&sig!="n") cout<<"输入错误,请重新输入!"<<endl; return sig="Y"|sig="y"/再哈希法int hash_agin(int numble,int key) /再哈希法获得地址的函数 return numble%key;int create(string key)

17、 int result=1,cur=0,i; if(key.size()<=4)ize()-1; else i=4; for(;i>=0;i-) cur=keyi-'0' result=result*9+cur; return result;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_a

18、gin(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; inforphone->name=inforname->name=name; inforphone->phone=inforname->phone=phone; inforphone->

19、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,pos_name; while(true) pos_name=hash_agin(numble_name,key); if(infor_name

20、pos_name=NULL) cout<<"不存在你要查找的信息!"<<endl;cout<<"-"<<endl;return; if(infor_namepos_name->name=name) cout<<"姓名:" cout<<infor_namepos_name->name<<endl; cout<<" :"cout<<infor_namepos_name->phone<<

21、;endl;cout<<"地址:"cout<<infor_namepos_name->address<<endl;cout<<"-"<<endl; return ; key-; void find_byphone(string phone) /以 为关键字查询用户信息 int numble_phone=create(phone),key=MOD,pos_phone; while(true) pos_phone=hash_agin(numble_phone,key); if(infor_ph

22、onepos_phone=NULL) cout<<"不存在你要查找的信息!"<<endl;cout<<"-"<<endl;return; if(infor_phonepos_phone->phone=phone) cout<<"姓名:" cout<<infor_phonepos_phone->name<<endl; cout<<" :"cout<<infor_phonepos_phone->

23、phone<<endl;cout<<"地址:"cout<<infor_phonepos_phone->address<<endl;cout<<"-"<<endl; return ; key-; void find() string sig,infor; cout<<"请输入(1)或(2),(1)代表姓名,(2)代表 :" while(cin>>sig&&(sig!="1"&&sig!

24、="2") cout<<"输入错误,请重新输入!"<<endl; cout<<"请输入要查找的信息:" cin>>infor; if(sig="1") find_byname(infor); else find_byphone(infor);/链表法int hash(string key) /链表法获得哈希码 int result=1,cur=0,i; if(key.size()<=4) i=key.size()-1; else i=4; for(;i>=

25、0;i-) cur=keyi-'0' result=result*9+cur; result%=(MOD); return result;node * build_infor(string phone,string name,string address) /存储用户信息到哈希表node *information=new node; information->phone=phone;information->name=name;information->address=address;information->next=NULL;return infor

26、mation;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) cur=cur->next; cur->next=infor;void add_infor_name(string p

27、hone,string name,string address) int value=hash(name);node *infor=build_infor(phone,name,address);if(infor_namevalue=NULL)infor_namevalue=infor;elsenode *cur=infor_namevalue;while(cur->next) cur=cur->next; cur->next=infor;void findinfor() /分别以名字和 为关键字查询用户信息string infor;int sig,pos; cout<

28、<"请输入要供查找的信息代号:1代表 号码,2代表姓名:"while(cin>>sig&&(sig!=1&&sig!=2) cout<<"输入错误,请重新输入!"<<endl;cout<<"请输入要供查找的信息:"cin>>infor; if(sig=1) bool flag=true; pos=hash(infor); node * cur=infor_phonepos; while(cur) if(cur->phone=info

29、r) cout<<"姓名:"<<cur->name<<endl;cout<<" :"<<cur->phone<<endl;cout<<"地址:"<<cur->address<<endl;flag=false;break; cur=cur->next; if(flag) cout<<"不存在要查找的记录!"<<endl; cout<<"-&q

30、uot;<<endl;else if(sig=2) bool flag=true; pos=hash(infor); node * cur=infor_namepos; while(cur) if(cur->name=infor) cout<<"姓名:"<<cur->name<<endl<<" :"<<cur->phone<<endl<<"地址:"<<cur->address<<endl;fl

31、ag=false;break; cur=cur->next; if(flag) cout<<"不存在要查找的记录!"<<endl; cout<<"-"<<endl;elsecout<<"输入错误,请重新输入:"<<endl;cout<<"-"<<endl; findinfor();void hash_frist() int numble; string phone,name,address,sig; init(); cout<<"请输入添

温馨提示

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

最新文档

评论

0/150

提交评论