数据结构课程设计哈希表实验报告Word下载.docx
《数据结构课程设计哈希表实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计哈希表实验报告Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
通过要查找的关键字用哈希函数计算出相应的地址来查找人名。
通过循环语句调用数组中保存的数据来显示哈希表。
三、设计
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);
a[i].tel);
voidShowInformation(Record*a)
voidCls(Record*a){
*"
longfold(NAs)
intHash1(NAstr)
intHash2(NAstr)
n=atoi(str);
Statuscollision(intp,intc)
voidCreateHash1(HashTable*H,Record*a)
}
voidSearchHash1(HashTable*H,intc)
voidbenGetTime(){
SYSTEMTIMEsys;
GetLocalTime(&
sys);
printf("
%4d/%02d/%02d%02d:
%02d:
%02d.%03d\n"
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,intc)
{NAtele;
intp,pp;
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){
\nERRORopeningcustometfile"
fclose(fp);
五、测试数据及测试结果:
1、主界面
2、添加用户信息
添加后自动跳转到主界面
3、查询所有用户信息(并且自动跳转到主界面)
4、以为关键字建立哈希表,查找并显示给定用户名的记录
查找用户名heziwen
5、清屏功能使用
六、课程设计总结及心得体会:
通过这一周的课程设计,加深我对《算法与数据结构》这门课程所学容的进一步的理解与掌握;
同时,通过对哈希表的设计,使得我将计算机课程所学知识与实际问题很好的相在一起。
在这次课程设计中,培养了我开发一个中小型程序的能力。
在课程设计中,出现了蛮多错误的,最多的错误是,提示我的变量i,p等没有进行定义,但是我看了代码确实已经有inti;
等代码,然后我将inti;
放到清屏函数前就解决了问题。
程序最关键的部分就是哈希表的设计,冲突解决,和关键字查找。
考虑到会重叠,关键字以来查找时出现的问题,所以加上了一段的折叠处理。
用线性探测在散列法进行解决冲突,用除留函数法来构造哈希函数。
在课程设计的过程中我遇到了许多课外的知识,这便促使我去查阅更多的课外资料来充实自己的容,同时学会在面对困难时药耐心的分析它细心地解决它以及通过合作更完美的深入了解剖析它以便的到提高。
细心、耐心、求知,是我这次课程设计最大的收获。