数据结构课程设计--哈希表实验报告Word格式.doc
- 文档编号:15186709
- 上传时间:2022-10-28
- 格式:DOC
- 页数:18
- 大小:434KB
数据结构课程设计--哈希表实验报告Word格式.doc
《数据结构课程设计--哈希表实验报告Word格式.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计--哈希表实验报告Word格式.doc(18页珍藏版)》请在冰豆网上搜索。
姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;
在查找的过程中给出比较的次数。
完成按姓名查询的操作。
运行的环境:
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){
printf("
第%d记录无法解决冲突"
i+1);
//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
H->
elem[pp]=&
(a[i]);
//求得哈希地址,将信息存入
count++;
第%d个记录冲突次数为%d。
\n"
i+1,c);
//需要显示冲突次数时输出
printf("
\n建表完成!
\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n"
HASHSIZE,H->
count);
(3)查找哈希表
voidSearchHash1(HashTable*H,intc)//在通讯录里查找姓名关键字,若查找成功,显示信息
{intp,pp;
NAstr;
//c用来记录冲突次数,查找成功时显示冲突次数
\n请输入要查找记录的姓名:
scanf("
%s"
str);
p=Hash1(str);
pp=p;
while((H->
=NULL)&
&
(eq(str,H->
elem[pp]->
name)==-1))
pp=collision(p,c);
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;
system("
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;
printf("
\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"
请输入一个任务选项>
>
"
scanf("
%d"
&
num);
switch(num){
case1:
getin(a);
break;
case2:
ShowInformation(a);
case3:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 哈希表 实验 报告