散列表的设计与实现报告Word文档下载推荐.docx
- 文档编号:16460731
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:15
- 大小:152.87KB
散列表的设计与实现报告Word文档下载推荐.docx
《散列表的设计与实现报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《散列表的设计与实现报告Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
以姓名建立哈希表;
以电话号码建立哈希表;
查找并显示给定用户名的记录;
查找并显示给定电话号码的记录;
清屏以及保存功能;
处理流程示意图:
3.功能模块设计:
.运用main函数输出电话本信息系统的整体界面,在调试运行后如下:
.利用添加功能voidgetin(Record*a)实现用户信息的录入,在调试运行后如下:
.利用哈希函数CREATEHASH1.2来构造哈希表并用Statuscollision函数的相应功能来查找并解决冲突:
.利用voidSearchHash1(HashTable*H,int&
c)在通讯录里查找姓名关键字,若查找成功,显示信息,c用来记录冲突次数,查找成功时显示冲突次数:
三、详细设计与实现部分:
定义头文件及基本属性
#include<
stdio.h>
iostream.h>
stdlib.h>
string>
#include<
windows.h>
#defineMAXSIZE20//电话薄记录数量
#defineMAX_SIZE20//人名的最大长度
#defineHASHSIZE53//定义表长
#defineSUCCESS1
#defineUNSUCCESS-1
#defineLENsizeof(HashTable)
typedefintStatus;
typedefcharNA[MAX_SIZE];
定义结构体
typedefstruct{//记录
NAname;
NAtel;
NAadd;
}Record;
typedefstruct{//哈希表
Record*elem[HASHSIZE];
//数据元素存储基址
intcount;
//当前数据元素个数
intsize;
//当前容量
}HashTable;
关键字比较功能的实现
Statuseq(NAx,NAy){//关键字比较,相等返回SUCCESS;
否则返回UNSUCCESS
if(strcmp(x,y)==0)
returnSUCCESS;
elsereturnUNSUCCESS;
}
记录个数功能的实现
StatusNUM_BER;
//记录的个数
输入信息功能
voidgetin(Record*a){//键盘输入各人的信息
cout<
<
"
输入要添加的个数:
\n"
;
cin>
>
NUM_BER;
inti;
for(i=0;
i<
i++){
cout<
请输入第"
i+1<
个记录的用户名:
cin>
a[i].name;
个记录的电话号码:
a[i].tel;
个记录的地址:
a[i].add;
//gets(str2);
显示输入信息的实现
voidShowInformation(Record*a)//显示输入的用户信息
{
for(i=0;
i++)
\n第"
个用户信息:
\n姓名:
a[i].name<
\n电话号码:
a[i].tel<
\n联系地址:
a[i].add<
}
清屏功能的实现
voidCls(Record*a){
*"
system("
cls"
);
longfold(NAs){//人名的折叠处理
char*p;
longsum=0;
NAss;
strcpy(ss,s);
//复制字符串,不改变原字符串的大小写
strupr(ss);
//将字符串ss转换为大写形式
p=ss;
while(*p!
='
\0'
)
sum+=*p++;
\nsum===================="
sum;
returnsum;
构造哈希函数
intHash1(NAstr){//哈希函数
longn;
intm;
n=fold(str);
//先将用户名进行折叠处理
m=n%HASHSIZE;
//折叠处理后的数,用除留余数法构造哈希函数
returnm;
//并返回模值
intHash2(NAstr){//哈希函数
n=atoi(str);
//把字符串转换成整型数.
//用除留余数法构造哈希函数
冲突处理函数,用于解决冲突
Statuscollision(intp,int&
c){//冲突处理函数,采用二次探测再散列法解决冲突
inti,q;
i=c/2+1;
while(i<
HASHSIZE){
if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>
=0)returnq;
elsei=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
returnUNSUCCESS;
voidbenGetTime();
voidCreateHash1(HashTable*H,Record*a){//建表,以人的姓名为关键字,建立相应的散列表benGetTime();
inti,p=-1,c,pp;
i++){
c=0;
p=Hash1(a[i].name);
pp=p;
while(H->
elem[pp]!
=NULL){
pp=collision(p,c);
if(pp<
0){
第"
记录无法解决冲突"
//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
H->
elem[pp]=&
(a[i]);
//求得哈希地址,将信息存入
count++;
个记录冲突次数为"
c<
.\n"
\n建表完成!
\n此哈希表容量为"
HASHSIZE<
当前表内存储的记录个数为"
H->
count<
benGetTime();
查找功能的实现
voidSearchHash1(HashTable*H,int&
c){//在通讯录里查找姓名关键字,若查找成功,显示信息
NAstr;
\n请输入要查找记录的姓名:
str;
intp,pp;
p=Hash1(str);
pp=p;
while((H->
=NULL)&
&
(eq(str,H->
elem[pp]->
name)==-1))
if(H->
=NULL&
eq(str,H->
name)==1){
\n查找成功!
\n查找过程冲突次数为"
.以下是您需要要查找的信息:
\n\n"
姓名:
name<
\n电话号码:
tel<
\n联系地址:
add<
elsecout<
\n此人不存在,查找不成功!
voidbenGetTime(){
SYSTEMTIMEsys;
GetLocalTime(&
sys);
sys.wYear<
sys.wMonth<
sys.wDay<
sys.wHour<
sys.wMinute<
sys.wSecond<
sys.wMilliseconds;
voidCreateHash2(HashTable*H,Record*a){//建表,以电话号码为关键字,建立相应的散列表
p=Hash2(a[i].tel);
。
voidSearchHash2(HashTable*H,int&
c){//在通讯录里查找电话号码关键字,若查找成功,显示信息
NAtele;
\n请输入要查找记录的电话号码:
tele;
p=Hash2(tele);
(eq(tele,H->
tel)==-1))
eq(tele,H->
tel)==1){
存盘功能的实现:
voidSave(){
FILE*fp;
if((fp=fopen("
c:
\test.txt"
"
w"
))==NULL){
printf("
\nERRORopeningcustometfile"
fclose(fp);
主界面功能的实现:
intmain(intargc,char*argv[]){
intc,flag=1;
HashTable*H;
H=(HashTable*)malloc(LEN);
for(inti=0;
HASHSIZE;
i++)
elem[i]=NULL;
size=HASHSIZE;
count=0;
Recorda[MAXSIZE];
while
(1){
\n┏━━━━━━━━━━━━━━━━━━━━━┓"
\n┃欢迎使用电话号码查找系统┃"
\n┏〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┓"
\n┃★★★★★★★哈希表的设计与实现★★★★★★★┃"
\n┃【1】.添加用户信息┃"
\n┃【2】.读取所有用户信息┃"
\n┃【3】.以姓名建立哈希表(再哈希法解决冲突)┃"
\n┃【4】.以电话号码建立哈希表(再哈希法解决冲突)┃"
\n┃【5】.查找并显示给定用户名的记录┃"
\n┃【6】.查找并显示给定电话号码的记录┃"
\n┃【7】.清屏┃"
\n┃【8】.保存┃"
\n┃【9】.退出程序┃"
\n┃温馨提示:
┃"
\n┃Ⅰ.进行5操作前请先输出3┃"
\n┃Ⅱ.进行6操作前请先输出4┃"
\n┗〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓┛"
请输入一个任务选项>
intnum;
num;
switch(num){
case1:
getin(a);
break;
case2:
ShowInformation(a);
case3:
CreateHash1(H,a);
/*以姓名建立哈希表*/
case4:
CreateHash2(H,a);
/*以电话号码建立哈希表*/
case5:
SearchHash1(H,c);
case6:
SearchHash2(H,c);
case7:
Cls(a);
case8:
Save();
case9:
return0;
default:
你输错了,请重新输入!
pause"
四、程序测试
1、程序经测试后大部分功能正常,但是在建立哈希表后存盘出现错误,经仔细查找发现是由于定义时范围过小造成的溢出现象,经处理后程序功能一切运行正常。
2、调试后的界面:
五、总结
课程设计顺利完成,在这几天的程序测试中,虽然是按照课程设计所要求的功能进行编程,但是还是有一些功能的实现不尽人意,比如在处理冲突时,遇到寻址失败利用再哈希法解决冲突的过程中会有一些异常现象的产生。
同时经过这阶段的课程设计可以体会出团队合作的重要性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 列表 设计 实现 报告