数据结构课程设计哈希表实验报告Word格式.docx
《数据结构课程设计哈希表实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计哈希表实验报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
运行的环境:
MicrosoftVisualC++6.0
二、算法基本思想描述
设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。
建立哈希表并且将其显示出来。
通过要查找的关键字用哈希函数计算出相应的地址来查找人名。
通过循环语句调用数组中保存的数据来显示哈希表。
三、设计
1、数据结构的设计和说明
(1)结构体的定义
typedefstruct//记录
{
NAname;
NAxuehao;
NAtel;
}Record;
录入信息结构体的定义,包含姓名,学号,电话号码。
typedefstruct//哈希表
Record*elem[HASHSIZE];
//数据元素存储基址
intcount;
//当前数据元素个数
intsize;
//当前容量
}HashTable;
哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计
(1)姓名的折叠处理
longfold(NAs)//人名的折叠处理
char*p;
longsum=0;
NAss;
strcpy(ss,s);
//复制字符串,不改变原字符串的大小写
strupr(ss);
//将字符串ss转换为大写形式
p=ss;
while(*p!
='
\0'
)
sum+=*p++;
printf("
\nsum====================%d"
sum);
returnsum;
}
(2)建立哈希表
1、用除留余数法构建哈希函数
2、用线性探测再散列法处理冲突
intHash1(NAstr)//哈希函数
longn;
intm;
n=fold(str);
//先将用户名进行折叠处理
m=n%HASHSIZE;
//折叠处理后的数,用除留余数法构造哈希函数
returnm;
//并返回模值
}Statuscollision(intp,intc)//冲突处理函数,采用二次探测再散列法解决冲突
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)//建表,以人的姓名为关键字,建立相应的散列表
{inti,p=-1,c,pp;
system("
cls"
);
//若哈希地址冲突,进行冲突处理
benGetTime();
for(i=0;
i<
NUM_BER;
i++){
c=0;
p=Hash1(a[i].name);
pp=p;
while(H->
elem[pp]!
=NULL){
pp=collision(p,c);
if(pp<
0){
第%d记录无法解决冲突"
i+1);
//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
H->
elem[pp]=&
(a[i]);
//求得哈希地址,将信息存入
count++;
第%d个记录冲突次数为%d。
\n"
i+1,c);
\n建表完成!
\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n"
HASHSIZE,H->
count);
(3)查找哈希表
voidSearchHash1(HashTable*H,intc)//在通讯录里查找姓名关键字,若查找成功,显示信息
{intp,pp;
NAstr;
//c用来记录冲突次数,查找成功时显示冲突次数
\n请输入要查找记录的姓名:
scanf("
%s"
str);
p=Hash1(str);
while((H->
=NULL)&
&
(eq(str,H->
elem[pp]->
name)==-1))
if(H->
=NULL&
eq(str,H->
name)==1){
\n查找成功!
\n查找过程冲突次数为%d.以下是您需要要查找的信息:
\n\n"
c);
姓名:
%s\n学号:
%s\n电话号码:
%s\n"
H->
name,H->
xuehao,H->
tel);
elseprintf("
\n此人不存在,查找不成功!
(4)显示哈希表
voidShowInformation(Record*a)//显示输入的用户信息
{inti;
for(i=0;
i++)
\n第%d个用户信息:
\n姓名:
%s\n学号:
%s\n电话号码:
i+1,a[i].name,a[i].xuehao,a[i].tel);
(5)主函数的设计
voidmain(intargc,char*argv[])
{Recorda[MAXSIZE];
intc,flag=1,i=0;
HashTable*H;
H=(HashTable*)malloc(LEN);
HASHSIZE;
elem[i]=NULL;
size=HASHSIZE;
count=0;
while
(1)
{intnum;
\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"
请输入一个任务选项>
>
"
%d"
&
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"
3、模块结构图及各模块的功能:
四、源程序清单:
#include<
stdio.h>
stdlib.h>
string.h>
#include<
windows.h>
#defineMAXSIZE20
#defineMAX_SIZE20
#defineHASHSIZE53
#defineSUCCESS1
#defineUNSUCCESS-1
#defineLENsizeof(HashTable)
typedefintStatus;
typedefcharNA[MAX_SIZE];
typedefstruct
Statuseq(NAx,NAy)
if(strcmp(x,y)==0)
returnSUCCESS;
elsereturnUNSUCCESS;
StatusNUM_BER;
voidgetin(Record*a)
输入要添加的个数:
NUM_BER);
{
请输入第%d个记录的姓名:
a[i].name);
请输入%d个记录的学号:
a[i].xuehao);
请输入第%d个记录的电话号码:
a[i].tel);
void