哈希表及其应用课程设计Word文件下载.docx
《哈希表及其应用课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈希表及其应用课程设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
尝试使用多种哈希函数和冲突解决方法,并通过实际运行测试给出自己的评价
四、基本要求
1.界面友好,函数功能要划分好
2.程序要加必要的注释
3.要提供程序测试方案
教研室主任签名:
年月日
目录
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<
stdlib.h>
fstream>
iostream>
cmath>
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<
当前文件内已有"
Number<
条记录\n"
请输入添加的个数:
cin>
>
num;
ofstreamofile("
app);
ofile){cout<
}
for(i=0;
i<
i++)
{cout<
请输入第"
Number+1<
个人的姓名"
endl;
a[Number].name;
个人的电话"
a[Number].tel;
个人的地址"
a[Number].add;
ofile.seekp(ios:
end);
ofile.write((char*)&
ofile.close();
voidPrint(precorda)//显示所有记录
{inti;
Number;
姓名:
a[i].name;
电话:
a[i].tel;
地址:
a[i].add<
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;
if(derter==Maxsize)return-1;
n=n*(-1);
j=(int(pow((float)derter,2))*n+address)%Maxsize;
return(j);
voidInit_Hash(pHashTableh)//初始化哈希表
Maxsize;
h->
elem[i]=-1;
intmenu;
voidCreathash_Name(pHashTableh,precorda)//以员工姓名为关键字创建哈希表
------------------------------------------------------------------------\n"
1----以线性探测建表\n"
2----以平方探测建表\n"
inti,address;
请选择:
menu;
Init_Hash(h);
{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++;
姓名哈希表已成功建立!
voidSearch_Name(pHashTableh,precorda)//查找并显示指定姓名的记录
{cout<
请输入要查找的姓名:
charnam[20];
intaddress,i=1;
nam;
address=Hash(nam);
derter=0;
=-1&
strcmp(nam,a[h->
elem[address]].name)!
=0)
{if(menu==1)address=Line_Sollution(address);
i++;
if(h->
elem[address]].name)==0)
你要查找的信息为:
a[h->
elem[address]].name<
elem[address]].tel<
elem[address]].add<
比较次数为"
elsecout<
无此姓名,查找失败!
voidCreathash_tel(pHashTableh,precorda)//以电话号为关键字创建哈希表
---------------------------------------------------------\n"
address=Hash(a[i].tel);
电话号码哈希表已成功建立!
voidSearch_tel(pHashTableh,precorda)//查找并显示指定电话号的记录
请输入要查找的电话:
chartelphone[20];
//i统计比较次数
telphone;
address=Hash(telphone);
n=-1;
//初始化线性增量
=-1&
strcmp(telphone,a[h->
elem[address]].tel)!
elem[address]].tel)==0)
无此电话,查找失败!
voidDelet(pHashTableh,precorda)
1----按电话号码删除\n"
2----按姓名删除\n"
intm;
m;
if(m==1)
请输入要删除的电话:
intaddress,i,j;
{j=h->
elem[address];
elem[address]=-1;
for(i=j;
Number-1;
{strcpy(a[i].name,a[i+1].name);
strcpy(a[i].tel,a[i+1].tel);
strcpy(a[i].add,a[i+1].add);
Number=Number-1;
if(m==2)
请输入要删除的姓名:
{j=h->
voidMenu()//功能菜单函数
员工管理查询系统\n"
'
\n'
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n"
★1-------添加☆\n"
☆2-------显示所有★\n"
★3-------以姓名建立哈希表☆\n"
☆4-------以电话号码建立哈希表★\n"
★5-------按员工姓名查找☆\n"
☆6-------按电话号码查找★\n"
★7-------删除员工信息☆\n"
☆0-------退出★\n"
使用说明:
1.添加新纪录后,如要进行查找请先进行3或4操作\n"
2.按员工姓名查找之前,请先进行3操作建立用户名哈希表\n"
3.按电话号码查找之前,请先进行4操作建立电话号码哈希表\n"
voidexit()
for(i=1;
=4;
◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◇◆◇\n"
◆◆\n"
◇员工管理查询系统◇\n"
◇谢谢您的使用!
◇\n"
◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆\n"
system("
pause"
);
intmain()
{recorda[Maxsize];
pHashTableH=newHashTable;
Getdata(a);
//将文件中的数据读入到数组a中
colorBD"
start:
Menu();
intmenu1;
menu1;
switch(menu1)
{case0:
cls"
exit();
break;
case1:
Add(a);
gotostart;
case2:
Print(a);
case3:
Creathash_Name(H,a);
case4:
Creathash_tel(H,a);
case5:
Search_Name(H,a);
case6:
Search_tel(H,a);
case7:
Delet(H,a);
default:
请输入正确的操作选项!
return0;
7程序运行结果
主界面
添加记录
显示所有
建立哈希表
查找
删除
退出
8总结
数据结构是计算机学科非常重要的一门必修课程,它与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。
同时数据结构还是一门实践性极强的理论技术基础课。
这次数据结构课程设计为我们提供了与众不同的学习方法和学习机会,让我们从被动授学转变为主动求学,从死记硬背的模式中脱离出来,转变为在实践中学习。
在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。
参考文献
[1]苏仕民.数据结构课程设计北京:
机械工业出版社.2005
[2]C++面向对象程序设计教程/陈维兴,林小茶编著北京:
清华大学出版社,2009.6
[3]C语言版/严蔚敏,吴伟民北京:
清华大学出版社,2007
[4]徐孝