哈希表的实现及简单应用 数据结构课程设计 实训Word文档格式.docx
《哈希表的实现及简单应用 数据结构课程设计 实训Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈希表的实现及简单应用 数据结构课程设计 实训Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
3)详细设计:
定义相应的存储结构并写出各函数的伪码算法。
4)程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
5)程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
6)结果分析:
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
算法的时间、空间复杂性分析;
7)编写课程设计报告。
3.参考资料
指导教师:
申静教研室负责人:
余冬梅
课程设计评阅
评语:
指导教师签名:
年月日
摘要
利用哈希函数来实现一个小型信息管理系统,其中信息包含用户名,地址,电话等;
能添加用户信息,并能保存该信息;
查询管理系统中的信息:
可通过姓名查找,也可通过电话查找等两种方式;
能散列管理系统中的信息,保存信息等功能。
关键词:
数据结构;
哈希表;
查询管理系统
目录
一课题描述1
二设计目的与任务2
2.1课程设计的目的2
2.2课程设计的任务2
三设计方案和实施3
3.1算法流程图3
3.2程序代码4
四运行结果13
五结论与致谢17
一课题描述
数据结构是一门专业基础课,它对学习者的要求很明确:
学会分析、研究计算机加工的数据结构的特性,以便为应用设计所需的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。
其次,该课程的学习过程也是复杂程序设计的训练过程,要求学习者编写的程序结构或设计的程序结构体清楚、正确、易读,符合软件工程的规范。
哈希表是一种重要的存储方式,也是一种常见的检索方法。
其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。
检索时采用检索关键码的方法。
本设计采用目前最通用的程序设计语言之一—C语言作为数据结构和算法的描述语言。
二设计目的与任务
2.1课程设计的目的
建立一个小型信息管理系统,使用哈希表查找表存储信息,实现查找、插入、删除、统计、输出。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题。
训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2.2课程设计的任务
1)任务说明
三设计方案和实施
3.1算法流程图如下
3.1算法流程图
3.2算法详细代码
#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);
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++;
姓名哈希表已成功建立!
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);
=-1)
电话号码哈希表已成功建立!
voidSearch_tel(pHashTableh,precorda)//查找并显示指定电话号的记录
请输入要查找的电话:
chartelphone[20];
//i统计比较次数
telphone;
address=Hash(telphone);
n=-1;
//初始化线性增量
=-1&
strcmp(telphone,a[h->
elem[address]].tel)!
=0)
elem[address]].tel)==0)
无此电话,查找失败!
voidDelet(pHashTableh,precorda)
1----按电话号码删除\n"
2----按姓名删除\n"
intm;
m;
if(m==1)
请输入要删除的电话:
intaddress,i,j;
//初始化线性增量
=0)
{j=h->
elem[address];
elem[address]=-1;
for(i=j;
Number-1;
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)
请输入要删除的姓名:
elem[address]].name)==0)
{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(