哈希表及其应用课程设计.docx

上传人:b****8 文档编号:29581723 上传时间:2023-07-24 格式:DOCX 页数:21 大小:914.45KB
下载 相关 举报
哈希表及其应用课程设计.docx_第1页
第1页 / 共21页
哈希表及其应用课程设计.docx_第2页
第2页 / 共21页
哈希表及其应用课程设计.docx_第3页
第3页 / 共21页
哈希表及其应用课程设计.docx_第4页
第4页 / 共21页
哈希表及其应用课程设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

哈希表及其应用课程设计.docx

《哈希表及其应用课程设计.docx》由会员分享,可在线阅读,更多相关《哈希表及其应用课程设计.docx(21页珍藏版)》请在冰豆网上搜索。

哈希表及其应用课程设计.docx

哈希表及其应用课程设计

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<<"电话:

"<elem[address]].tel<

cout<<"地址:

"<elem[address]].add<

cout<<"比较次数为"<

elsecout<<"无此电话,查找失败!

";

}

voidDelet(pHashTableh,precorda)

{cout<<"---------------------------------------------------------\n";

cout<<"1----按电话号码删除\n";

cout<<"2----按姓名删除\n";

cout<<"---------------------------------------------------------\n";

intm;

cout<<"请选择:

";

cin>>m;

if(m==1)

{cout<<"请输入要删除的电话:

";

chartelphone[20];

intaddress,i,j;

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);

if(address==-1)break;}

if(h->elem[address]!

=-1&&strcmp(telphone,a[h->elem[address]].tel)==0)

{j=h->elem[address];

h->elem[address]=-1;

}

for(i=j;i

{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)

{cout<<"请输入要删除的姓名:

";

charnam[20];intaddress,i,j;

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)

{j=h->elem[address];h->elem[address]=-1;}

for(i=j;i

{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;

}

}

voidMenu()//功能菜单函数

{cout<

cout<<"员工管理查询系统\n";

cout<<'\n';

cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n";

cout<<"★1-------添加☆\n";

cout<<"☆2-------显示所有★\n";

cout<<"★3-------以姓名建立哈希表☆\n";

cout<<"☆4-------以电话号码建立哈希表★\n";

cout<<"★5-------按员工姓名查找☆\n";

cout<<"☆6-------按电话号码查找★\n";

cout<<"★7-------删除员工信息☆\n";

cout<<"☆0-------退出★\n";

cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n";

cout<<"使用说明:

\n";

cout<<"1.添加新纪录后,如要进行查找请先进行3或4操作\n";

cout<<"2.按员工姓名查找之前,请先进行3操作建立用户名哈希表\n";

cout<<"3.按电话号码查找之前,请先进行4操作建立电话号码哈希表\n";}

voidexit()

{inti;

for(i=1;i<=4;i++)

cout<

cout<<"◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◇◆◇\n";

cout<<"◆◆\n";

cout<<"◇员工管理查询系统◇\n";

cout<<"◆◆\n";

cout<<"◇谢谢您的使用!

◇\n";

cout<<"◆◆\n";

cout<<"◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆\n";

system("pause");}

intmain()

{recorda[Maxsize];

pHashTableH=newHashTable;

Getdata(a);//将文件中的数据读入到数组a中

system("colorBD");

start:

Menu();

cout<<"请选择:

";

intmenu1;

cin>>menu1;

switch(menu1)

{case0:

system("cls");exit();break;

case1:

Add(a);system("pause");system("cls");gotostart;break;

case2:

Print(a);system("pause");system("cls");gotostart;break;

case3:

Creathash_Name(H,a);system("pause");system("cls");gotostart;break;

case4:

Creathash_tel(H,a);system("pause");system("cls");gotostart;break;

case5:

Search_Name(H,a);system("pause");system("cls");gotostart;break;

case6:

Search_tel(H,a);system("pause");system("cls");gotostart;break;

case7:

Delet(H,a);system("pause");system("cls");gotostart;break;

default:

cout<<"请输入正确的操作选项!

\n";system("cls");gotostart;break;}

return0;

}

7程序运行结果

主界面

 

添加记录

 

显示所有

 

建立哈希表

 

 

查找

删除

退出

8总结

数据结构是计算机学科非常重要的一门必修课程,它与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。

同时数据结构还是一门实践性极强的理论技术基础课。

这次数据结构课程设计为我们提供了与众不同的学习方法和学习机会,让我们从被动授学转变为主动求学,从死记硬背的模式中脱离出来,转变为在实践中学习。

在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。

参考文献

[1]苏仕民.数据结构课程设计北京:

机械工业出版社.2005

[2]C++面向对象程序设计教程/陈维兴,林小茶编著北京:

清华大学出版社,2009.6

[3]C语言版/严蔚敏,吴伟民北京:

清华大学出版社,2007

[4]徐孝凯.数据结构实用教程(C/C++描述)[M].(第一版)北京:

清华大学出版社.1999

[5]陈慧南.数据结构(使用C++语言描述)[M].(第一版)南京:

东南大学出版社.2001

[6]殷人昆,陶永雷,谢若阳等.数据结构(用面向对象方法与C++描述)[M].(第一版)北京:

清华大学出版社.1999

数据结构课程设计成绩评定表

姓名

吴浪

性别

专业班级

网络工程

课程设计题目:

哈希表及其应用

课程设计答辩或质疑记录:

1、请简单概括一下你对哈希查找的理解

哈希查找就是在记录的存储位置和他的关键字之间建立一个确定的对应关系f,使每个关键字和结构中的一个唯一的存储位置相对应,在查找是只要根据这个对应关系f找到对应的像f(K)即可。

2、程序解决哈希冲突的方法

考虑到算法的时间复杂度,减小查找次数,程序采用了两种解决哈希冲突的方法,线性探测和平方探测,可任选其一。

 

成绩评定依据:

 

最终评定成绩(以优、良、中、及格、不及格评定)

 

 

指导教师签字:

年月日

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

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1