哈希查找数据结构实验报告1.docx

上传人:b****6 文档编号:6464678 上传时间:2023-01-06 格式:DOCX 页数:13 大小:33.89KB
下载 相关 举报
哈希查找数据结构实验报告1.docx_第1页
第1页 / 共13页
哈希查找数据结构实验报告1.docx_第2页
第2页 / 共13页
哈希查找数据结构实验报告1.docx_第3页
第3页 / 共13页
哈希查找数据结构实验报告1.docx_第4页
第4页 / 共13页
哈希查找数据结构实验报告1.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

哈希查找数据结构实验报告1.docx

《哈希查找数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《哈希查找数据结构实验报告1.docx(13页珍藏版)》请在冰豆网上搜索。

哈希查找数据结构实验报告1.docx

哈希查找数据结构实验报告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;isize;i++)

h->elem[i].key=-1;

printf("inputdata:

\n");

for(j=0;jlength;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&&isize/2)

{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&&isize/2)

{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&&csize/2)

{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;isize;i++)

printf("%-4.2d",i);

printf("\n");

for(i=0;i<2*h->size;i++)

printf("--");

printf("\n");

for(i=0;isize;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;isize;i++)

h->elem[i].key=-1;

printf("inputdata:

\n");

for(j=0;jlength;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&&isize/2)

{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&&isize/2)

{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&&csize/2)

{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;isize;i++)

printf("%-4.2d",i);

printf("\n");

for(i=0;i<2*h->size;i++)

printf("--");

printf("\n");

for(i=0;isize;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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1