东华大学数据结构哈希表查找的设计.docx

上传人:b****3 文档编号:3543753 上传时间:2022-11-23 格式:DOCX 页数:11 大小:75.51KB
下载 相关 举报
东华大学数据结构哈希表查找的设计.docx_第1页
第1页 / 共11页
东华大学数据结构哈希表查找的设计.docx_第2页
第2页 / 共11页
东华大学数据结构哈希表查找的设计.docx_第3页
第3页 / 共11页
东华大学数据结构哈希表查找的设计.docx_第4页
第4页 / 共11页
东华大学数据结构哈希表查找的设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

东华大学数据结构哈希表查找的设计.docx

《东华大学数据结构哈希表查找的设计.docx》由会员分享,可在线阅读,更多相关《东华大学数据结构哈希表查找的设计.docx(11页珍藏版)》请在冰豆网上搜索。

东华大学数据结构哈希表查找的设计.docx

东华大学数据结构哈希表查找的设计

数据结构

课程设计报告

 

课程名称:

数据结构

设计题目:

哈希表查找设计

专业班级:

电信类1203班

指导教师:

孙韶媛

 

1、设计题目:

哈希表查找设计

2、任务:

 设哈希表长为20,用除留余数法构造一个哈希函数,以开放定址法中的线性探测再散列法作为解决冲突的方法,编程实现哈希表查找、插入和建立算法。

3、功能要求:

1)建立方法:

线性探测再散列法

2)哈希表的存储

3)哈希表的查找

4、需求分析:

本程序中,以哈希表为背景模板,利用线性探测再散列法作为插入和查找的优化方法,实现某特定算法条件下哈希表相应的插入和查找。

 

5、概要设计:

1、定义哈希表存储元素(类似于存储域):

typedefstruct

{

intkey;

}Elemtype;

2、定义哈希表元素:

typedefstruct

{

Elemtypeelem;//存储域

inttag;//标识部分

}HashItem;

3、哈希表:

typedefstruct

{

HashItemtable[TableSize];

intcount;//当前哈希表存储量

}HashTable;

4、程序调用关系:

1、插入函数:

intInsert(HashTable*h,Elemtypex,intp)

调用Search函数

 

判断i的取值,进行有关插入的操作。

main()2、查找函数:

intSearch(HashTableh,Elemtypex,intp)

通过除留余数法以及线性探测再散列法进行查找。

通过结构体中标识元素“tag”判断存储元素有无。

 

3、结束程序

6、详细设计:

#include

#include

#include

#defineTableSize20//哈希表长20,可变。

#defineSUCCESS1

#defineUNSUCCESS0

#defineDUPLICATE-1

typedefstruct

{

intkey;

}Elemtype;//哈希表存储元素

typedefstruct

{

Elemtypeelem;//存储域

inttag;//标识部分

}HashItem;//哈希表元素

typedefstruct

{

HashItemtable[TableSize];

intcount;//当前哈希表存储量

}HashTable;//哈希表

voidsurface()//用户界面显示程序,增加程序可读性

{

inti;

for(i=0;i<=25;i++)printf("*");

printf("数据结构课程设计");

for(i=0;i<=25;i++)printf("*");

printf("\n");

for(i=0;i<=5;i++)printf("*");

for(i=0;i<=20;i++)printf("");

printf("课题四哈希表查找设计");

for(i=0;i<=20;i++)printf("");

for(i=0;i<=5;i++)printf("*");

printf("\n");

for(i=0;i<=75;i++)printf("*");

printf("\n");

}

intInitiate(HashTable*h)

{//哈希表初始化

inti;

for(i=0;i

{

(*h).table[i].tag=0;

(*h).table[i].elem.key=NULL;

}

(*h).count=0;

returnSUCCESS;

}//初始化为空表。

intSearch(HashTableh,Elemtypex,intp)

{//查找元素操作

inti=x.key%p;//除留余数法定哈希地址,p对应主函数的divider

intj=i;

while(h.table[j].tag==1&&h.table[j].elem.key!

=x.key)//已有元素且非所查找元素

{

j=(j+1)%TableSize;//线性探测再散列

if(j==i)//全表遍历

{

printf("哈希表中未找到%d\n",x.key);

returnTableSize;//未搜索到所给元素,返回表长

}

}

if(h.table[j].tag==1)//元素已存在

{

printf("该元素在哈希表的第%d位\n",j);

return-j;//返回位置的负数下标

}

else//元素不存在

{

printf("哈希表中未查找到%d\n",x.key);

returnj;//返回其位置的下标

}

}

intInsert(HashTable*h,Elemtypex,intp)

{//插入元素操作

inti=Search(*h,x,p);//利用查找操作返回相关值,取值规则详见上方注释

if(i<0)//元素已存在

{printf("元素已存在,无法再插入,操作失败!

\n");

returnUNSUCCESS;}

else

{

if(i!

=TableSize&&(*h).table[i].tag!

=1)//哈希表有剩余空间时,进行插入操作

{

(*h).table[i].elem.key=x.key;//插入元素

(*h).table[i].tag=1;//“元素存储”为真

(*h).count++;//存储量加1

printf("成功插入!

\n");

returnSUCCESS;

}

else

if(i==TableSize)//哈希表已满时,插入失败

{

printf("哈希表已满,无法再插入,操作失败!

\n");

returnUNSUCCESS;

}

}

}

intmain()

{

inti,n;

charc;//选择变量

HashTableh;//哈希表h

intdivider;//除留余数法的除数

Initiate(&h);//初始化哈希表(空表)

surface();//运行界面

printf("请输入一个小于20的质数作为除数:

\n");

scanf("%d",÷r);

while

(1)

{

printf("1、录入元素\n2、查找指定元素在表中的位置\n");

printf("3、输入其他:

退出\n");

printf("请输入相关功能的选择序号:

");

getchar();

scanf("%c",&c);

switch(c)

{

case'1':

{printf("请输入需要输入的元素个数n(n<=20):

");

scanf("%d",&n);

Elemtype*pi;

pi=(Elemtype*)malloc(n*sizeof(Elemtype));//根据元素个数分配地址

printf("请[依次]输入%d个元素的值:

\n",n);

for(i=0;i

{

scanf("%d",&pi[i].key);

Insert(&h,pi[i],divider);//插入

}

printf("已返回主界面,请重新选择:

\n");

break;

}

case'2':

{printf("请输入需要查找的元素的值:

\n");

Elemtypea;//所需查找的元素

scanf("%d",&a.key);

Search(h,a,divider);//查找

printf("已返回主界面,请重新选择:

\n");

break;

}

default:

return0;

}

}

getch();

}

7、调试分析:

a.定义常量(表长):

TableSize=20,使得程序便于修改。

b.HashItem引入标识部分“tag”,表明存储情况。

C.初步调试时,进行插入元素步骤后,出现主函数直接结束的情况,由此问题相应地增加了循环结构。

 

8、用户手册:

1)运行环境:

win7,Microsoftvisualc++6.0

2)初步运行界面:

3)插入时候必须元素个数和表长的关系,如果超过表长则需要重新修改程序

9、测试结果(附截图):

测试数据:

哈希函数:

H(key)=key%13

关键字组:

{19,01,23,14,55,20,84,27,68,11,10,77}

1)输入除数(divider)=13

2)输入元素个数:

12

3)依次输入190123145520842768111077

并用空格键隔开

 

4)插入成功后显示:

5)查找元素:

(示例1:

20)

6)查找元素:

(示例2:

29)

7)结束程序

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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