东华大学数据结构哈希表查找的设计.docx
《东华大学数据结构哈希表查找的设计.docx》由会员分享,可在线阅读,更多相关《东华大学数据结构哈希表查找的设计.docx(11页珍藏版)》请在冰豆网上搜索。
![东华大学数据结构哈希表查找的设计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/546cd07b-4fed-4fe8-955c-bc746c8d0cc7/546cd07b-4fed-4fe8-955c-bc746c8d0cc71.gif)
东华大学数据结构哈希表查找的设计
数据结构
课程设计报告
课程名称:
数据结构
设计题目:
哈希表查找设计
专业班级:
电信类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)结束程序