哈希查找数据结构实验报告1.docx
- 文档编号:6464678
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:13
- 大小:33.89KB
哈希查找数据结构实验报告1.docx
《哈希查找数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《哈希查找数据结构实验报告1.docx(13页珍藏版)》请在冰豆网上搜索。
哈希查找数据结构实验报告1
南昌航空大学实验报告
课程名称:
数据结构实验名称:
实验九查找
班级:
学生姓名:
学号:
指导教师评定:
签名:
题目:
编程实现哈希表的造表和查找算法。
要求:
用除留余数法构造哈希函数,用二次探测再散列解决冲突。
一、需求分析
1.用户可以根据自己的需求输入一个顺序表(哈希表)
2.通过用除留余数法构造哈希函数,并用开放地址的二次探测再散列解决冲突。
3.在经过排序后显示该哈希表。
4.程序执行的命令包括:
(1)创建哈希表
(2)输出哈希表(3)二次探测再散列解决冲突
二、概要设计
⒈为实现上述算法,需要顺序表的抽象数据类型:
ADTHash{
数据对象D:
D是具有相同特征的数据元素的集合。
各数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系R:
数据元素同属一个集合。
基本操作P:
Creathash(&h)
操作结果:
构造一个具有n个数据元素的哈希查找表h。
destroyhash(&h)
初始条件:
哈希查找表h存在。
操作结果:
销毁哈希查找表h。
displayhash(h)
初始条件:
哈希查找表h存在。
操作结果:
显示哈希查找表h。
hash(h,&k)
初始条件:
哈希查找表h存在。
操作结果:
通过除留余数法得到地址用k返回。
hash2(i,&k)
初始条件:
哈希查找表h存在存在,i是除留余数法得到的地址。
操作结果:
返回二次探测再散列解决冲突得到的地址k。
search(h,key)
初始条件:
哈希查找表h存在。
操作结果:
查找表h中的key,若查找成功,返回其地址,否则返回-1
insert(&h,key)
初始条件:
哈希查找表h存在。
操作结果:
若表h中没有key,则在h中插入key。
search1(h,key,&p)
初始条件:
哈希查找表h存在。
操作结果:
在表h中查找key,若没有,则返回p的插入的地址,否则返回-1。
}ADTHash
2.本程序有三个模块:
⑴主程序模块
main(){
初始化;
{
接受命令;
显示结果;
}
}
⑵创建hash表的模块:
主要建立一个哈希表;
⑶解决冲突模块:
利用开放地址的二次探测再散列解决冲突;
(4)输出哈希表模块:
显示已创建哈希表。
三、详细设计
⒈元素类型,结点类型
typedefstruct
{
intkey;
}keytype;
typedefstruct
{
keytypeelem[100];
intlength;/*当前的长度*/
intsize;/*哈希表的总长*/
}hashtable;
/*全局变量*/
inta=0,b=0;
/*哈希函数*/
2.对抽象数据类型中的部分基本操作的伪码算法如下:
/*哈希函数*/
inthash(hashtable*h,intk)
{
returnk%h->size;
}
/*二次探测再散列解决冲突*/
inthash2(inti,intt)
{if(i%2==0)
t=t+pow(++a,2);
else
t=t-pow(++b,2);
returnt;
}
/*创建哈希表*/
voidcreat(hashtable*h)
{inti,j,key,t,p;
printf("inputhashsizeandlength:
");
scanf("%d%d",&h->size,&h->length);
for(i=0;i
h->elem[i].key=-1;
printf("inputdata:
\n");
for(j=0;j
{scanf("%d",&key);
p=hash(h,key);
if(h->elem[p].key==-1)
h->elem[p].key=key;
else
{i=0;
t=p;
while(h->elem[p].key!
=-1&&h->elem[p].key!
=key&&i
{p=hash2(i,t);
i++;
}
a=b=0;
h->elem[p].key=key;
}
}
}
/*查找哈希表中的元素,返回元素的地址,否则返回-1*/
intsearch(hashtable*h,intkey)
{intp,t,i=0;
p=hash(h,key);
t=p;
while(h->elem[p].key!
=-1&&h->elem[p].key!
=key&&i
{p=hash2(i,t);
i++;
}
if(h->elem[p].key==key)returnp;
elsereturn(-1);
}
/*查找哈希表的元素,返回p的插入的位置*/
voidsearch1(hashtable*h,intkey,int*p)
{intt,s,c=0;
t=hash(h,key);
s=t;
while(h->elem[t].key!
=-1&&h->elem[t].key!
=key&&c
{t=hash2(c,s);
c++;
}
if(h->elem[t].key==key)*p=t;
else
{
t=-1;*p=t;
}
}
/*插入数据元素到开放地址哈希表中*/
voidinsert(hashtable*h,intkey)
{intp;
p=search(h,key);
if(p!
=-1)printf("thelocationis:
%d\n",p);
else
{search1(h,key,&p);
++h->size;
++h->length;
h->elem[h->size].key=key;
}
}
/*输出哈希表*/
voidprinthash(hashtable*h)
{inti;
for(i=0;i
printf("%-4.2d",i);
printf("\n");
for(i=0;i<2*h->size;i++)
printf("--");
printf("\n");
for(i=0;i
printf("%-4.2d",h->elem[i].key);
}
3.主函数和其他函数的伪码算法
/*主函数*/
voidmain()
{hashtablet;
inti,key,key1,c;
creat(&t);
printf("outputthehash:
\n\n");
printhash(&t);
printf("\n\ncurrentthelengthis:
%d\n",t.length);
printf("\ninputasearchkey:
");
scanf("%d",&key);
c=search(&t,key);
if(c!
=-1)
printf("it'slocationis:
%d\n",c);
else
printf("can'tsearchthekey!
\n");
printf("\n\naddthekey:
");
scanf("%d",&key1);
insert(&t,key1);
printf("\n");
for(i=0;i printf("%-4.2d",i); printf("\n"); for(i=0;i<2*t.size;i++) printf("--"); printf("\n"); for(i=0;i printf("%-4.2d",t.elem[i].key); printf("%-4.2d",t.elem[++i].key); printf("\n\ncurrentthelengthis: %d",t.length); getch(); } 4函数调用关系 main creatprinthashinsertsearch hashhash2searchsearch1hashhash2 四、调试分析 ⒈开始的时候在创建哈希表的时候总是得不到相应的结果,最后发现原来是在creat函数中的i重复利用,使得结果混乱了,为解决这个问题我将该函数中的for语句的i该为j,避免与内while的i发生混乱使用。 ⒉在编写hash2函数的时候利用了全局变量a和b,开始的时候在creat函数的镇南关没有加a=b=0;语句使得结果不正确。 3.为使得显示的哈希表比较美观,设计的过程进行了多次的调试。 特别是h->size和h->length有时会用错。 4.算法的时空分析 各操作的算法时间复杂度比较合理 hash,hash2为O (1);creat,search,search1,insert,printhash为O(n), 注: n为哈希表的长度。 (注: 也可用平均查找长度ASL) 5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好的可重用性。 五、用户手册 ⒈本程序的运行环境为windowsxp操作系统,并且在TC2.0中运行,执行文件为Exp9.c; 2.进入演示程序后,完成编译,再点击超级工具集里的中文DOS环境运行选项,进入DOS环境中,用户根据需求键入相应的数据,可以看到相应的结果。 六、测试结果 在dos下输入数据元素: 8864247502156854283961 并且查找数据元素28和插入数据元素27 则在dos界面输入如图所示: 七、附录: 源程序 #include"stdio.h" #include"math.h" #defineSIZE100 typedefstruct { intkey; }keytype; typedefstruct { keytypeelem[100]; intlength;/*当前的长度*/ intsize;/*哈希表的总长*/ }hashtable; /*全局变量*/ inta=0,b=0; /*哈希函数*/ inthash(hashtable*h,intk) { returnk%h->size; } /*二次探测再散列解决冲突*/ inthash2(inti,intt) {if(i%2==0) t=t+pow(++a,2); else t=t-pow(++b,2); returnt; } /*创建哈希表*/ voidcreat(hashtable*h) {inti,j,key,t,p; printf("inputhashsizeandlength: "); scanf("%d%d",&h->size,&h->length); for(i=0;i h->elem[i].key=-1; printf("inputdata: \n"); for(j=0;j {scanf("%d",&key); p=hash(h,key); if(h->elem[p].key==-1) h->elem[p].key=key; else {i=0; t=p; while(h->elem[p].key! =-1&&h->elem[p].key! =key&&i {p=hash2(i,t); i++; } a=b=0; h->elem[p].key=key; } } } /*查找哈希表中的元素,返回元素的地址,否则返回-1*/ intsearch(hashtable*h,intkey) {intp,t,i=0; p=hash(h,key); t=p; while(h->elem[p].key! =-1&&h->elem[p].key! =key&&i {p=hash2(i,t); i++; } if(h->elem[p].key==key)returnp; elsereturn(-1); } /*查找哈希表的元素,返回p的插入的位置*/ voidsearch1(hashtable*h,intkey,int*p) {intt,s,c=0; t=hash(h,key); s=t; while(h->elem[t].key! =-1&&h->elem[t].key! =key&&c {t=hash2(c,s); c++; } if(h->elem[t].key==key)*p=t; else { t=-1;*p=t; } } /*插入数据元素到开放地址哈希表中*/ voidinsert(hashtable*h,intkey) {intp; p=search(h,key); if(p! =-1)printf("thelocationis: %d\n",p); else {search1(h,key,&p); ++h->size; ++h->length; h->elem[h->size].key=key; } } /*输出哈希表*/ voidprinthash(hashtable*h) {inti; for(i=0;i printf("%-4.2d",i); printf("\n"); for(i=0;i<2*h->size;i++) printf("--"); printf("\n"); for(i=0;i printf("%-4.2d",h->elem[i].key); } /*主函数*/ voidmain() {hashtablet; inti,key,key1,c; creat(&t); printf("outputthehash: \n\n"); printhash(&t); printf("\n\ncurrentthelengthis: %d\n",t.length); printf("\ninputasearchkey: "); scanf("%d",&key); c=search(&t,key); if(c! =-1) printf("it'slocationis: %d\n",c); else printf("can'tsearchthekey! \n"); printf("\n\naddthekey: "); scanf("%d",&key1); insert(&t,key1); printf("\n"); for(i=0;i printf("%-4.2d",i); printf("\n"); for(i=0;i<2*t.size;i++) printf("--"); printf("\n"); for(i=0;i printf("%-4.2d",t.elem[i].key); printf("%-4.2d",t.elem[++i].key); printf("\n\ncurrentthelengthis: %d",t.length); getch(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 数据结构 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)