哈希表及其应用课程设计.docx
- 文档编号:29581723
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:21
- 大小:914.45KB
哈希表及其应用课程设计.docx
《哈希表及其应用课程设计.docx》由会员分享,可在线阅读,更多相关《哈希表及其应用课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
哈希表及其应用课程设计
1概述………………………………………………………………………4
2设计目的…………………………………………………………………4
3设计功能说明……………………………………………………………4
4详细设计说明……………………………………………………………5
5流程图……………………………………………………………………5
6程序代码…………………………………………………………………6
7程序运行结果……………………………………………………………15
8总结………………………………………………………………………19
参考文献……………………………………………………………………19
成绩评定表…………………………………………………………………20
1概述
数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。
通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实际动手能力。
为学生后继课程的学习打下良好的基础。
2设计目的
《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。
促使学生养成良好的编程习惯。
1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
2.培养学生综合运用所学知识独立完成程序课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
3设计功能分析
本设计的功能如下:
1、利用哈希函数来实现一个小型信息管理系统,其中信息包含用户名,地址,电话等。
2、能添加用户信息,并能保存该信息。
3、查询管理系统中的信息:
可通过姓名查找,也可通过电话查找等两种方式。
4、能散列管理系统中的信息,保存信息等功能。
4详细设计说明
哈希表是一种重要的存储方式,也是一种常见的检索方法。
其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。
检索时采用检索关键码的方法。
(1)假定每个记录有下列数据项:
用户名、电话号码、地址。
(2)初始记录为空,通过不断添加记录,并保存到数据文件telphone.txt
中。
(3)分别采用线性和平方探测解决冲突。
(4)查找并显示给定电话号码的记录;查找并显示给定用户
名的记录。
5流程图
6程序代码
#include
#include
#include
#include
usingnamespacestd;
#defineMaxsize57
structrecord
{charname[20];
chartel[20];
charadd[20];};
typedefrecord*precord;
structHashTable
{intelem[Maxsize];//存放数组a[]的下标
intcount;};
typedefHashTable*pHashTable;
intNumber;//统计当前数组a[]中的记录总数
voidGetdata(precorda)//从文件telphone.txt中读取数据存放到数组a[]
{Number=0;
ifstreaminfile("telphone.txt",ios:
:
in|ios:
:
binary);
if(!
infile){cout<<"文件打开失败!
\n";exit
(1);}
while(!
infile.eof()&&infile.get()!
=EOF)//文件不为空并且文件指针没有指到结束符
{infile.seekg(Number*sizeof(a[Number]),ios:
:
beg);//定位文件指针
infile.read((char*)&a[Number],sizeof(a[Number]));
Number++;}
infile.close();}
voidAdd(precorda)//添加记录
{inti,num;
cout<<"当前文件内已有"< cout<<"请输入添加的个数: "; cin>>num; ofstreamofile("telphone.txt",ios: : app); if(! ofile){cout<<"文件打开失败! ";exit (1);} for(i=0;i {cout<<"请输入第"< cin>>a[Number].name; cout<<"请输入第"< cin>>a[Number].tel; cout<<"请输入第"< cin>>a[Number].add; ofile.seekp(ios: : end); ofile.write((char*)&a[Number],sizeof(a[Number])); Number++;} ofile.close();} voidPrint(precorda)//显示所有记录 {inti; for(i=0;i {cout<<"姓名: "< cout<<"电话: "< cout<<"地址: "< } intHash(charstr[])//除留取余 {longval=0;charp[20],*p1; strcpy(p,str); p1=p; while(*p1! ='\0') val=val+*p1++;//将字符串中的所有字符对应的ASCII值相加 return(val%Maxsize); } intderter;//线性增量 intLine_Sollution(intaddress)//采用线性探测解决冲突 { derter++; if(derter==Maxsize)return(-1); elsereturn((address+derter)%Maxsize); } intn; intSquare_Sollution(intaddress)//采用平方探测法解决冲突 {intj;derter++; if(derter==Maxsize)return-1; n=n*(-1); j=(int(pow((float)derter,2))*n+address)%Maxsize; return(j);} voidInit_Hash(pHashTableh)//初始化哈希表 {inti; for(i=0;i h->elem[i]=-1; } intmenu; voidCreathash_Name(pHashTableh,precorda)//以员工姓名为关键字创建哈希表 {cout<<"------------------------------------------------------------------------\n"; cout<<"1----以线性探测建表\n"; cout<<"2----以平方探测建表\n"; cout<<"------------------------------------------------------------------------\n"; inti,address; cout<<"请选择: "; cin>>menu; Init_Hash(h); for(i=0;i {derter=0;n=-1; address=Hash(a[i].name); while(h->elem[address]! =-1) {if(menu==1)address=Line_Sollution(address); elseaddress=Square_Sollution(address); if(address==-1)break;} if(address! =-1){h->elem[address]=i;h->count++;} } cout<<"姓名哈希表已成功建立! \n"; } voidSearch_Name(pHashTableh,precorda)//查找并显示指定姓名的记录 {cout<<"请输入要查找的姓名: "; charnam[20];intaddress,i=1; cin>>nam; address=Hash(nam); derter=0;n=-1; while(h->elem[address]! =-1&&strcmp(nam,a[h->elem[address]].name)! =0) {if(menu==1)address=Line_Sollution(address); elseaddress=Square_Sollution(address); i++; if(address==-1)break;} if(h->elem[address]! =-1&&strcmp(nam,a[h->elem[address]].name)==0) {cout<<"你要查找的信息为: \n"; cout<<"姓名: "<elem[address]].name< cout<<"电话: "<elem[address]].tel< cout<<"地址: "<elem[address]].add< cout<<"比较次数为"< elsecout<<"无此姓名,查找失败! "; } voidCreathash_tel(pHashTableh,precorda)//以电话号为关键字创建哈希表 {cout<<"---------------------------------------------------------\n"; cout<<"1----以线性探测建表\n"; cout<<"2----以平方探测建表\n"; cout<<"---------------------------------------------------------\n"; inti,address; cout<<"请选择: "; cin>>menu; Init_Hash(h); for(i=0;i {derter=0;n=-1; address=Hash(a[i].tel); while(h->elem[address]! =-1) {if(menu==1)address=Line_Sollution(address); elseaddress=Square_Sollution(address); if(address==-1)break;} if(address! =-1){h->elem[address]=i;h->count++;} } cout<<"电话号码哈希表已成功建立! \n";} voidSearch_tel(pHashTableh,precorda)//查找并显示指定电话号的记录 {cout<<"请输入要查找的电话: "; chartelphone[20];intaddress,i=1;//i统计比较次数 cin>>telphone; address=Hash(telphone); derter=0;n=-1;//初始化线性增量 while(h->elem[address]! =-1&&strcmp(telphone,a[h->elem[address]].tel)! =0) {if(menu==1)address=Line_Sollution(address); elseaddress=Square_Sollution(address); i++; if(address==-1)break;} if(h->elem[address]! =-1&&strcmp(telphone,a[h->elem[address]].tel)==0) {cout<<"你要查找的信息为: \n"; cout<<"姓名: "<elem[address]].name< cout<<"电话:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 及其 应用 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)