东华大学数据结构哈希表查找的设计Word文档下载推荐.docx
《东华大学数据结构哈希表查找的设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《东华大学数据结构哈希表查找的设计Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
typedefstruct
{
intkey;
}Elemtype;
2、定义哈希表元素:
typedefstruct
{
Elemtypeelem;
//存储域
inttag;
//标识部分
}HashItem;
3、哈希表:
HashItemtable[TableSize];
intcount;
//当前哈希表存储量
}HashTable;
4、程序调用关系:
1、插入函数:
intInsert(HashTable*h,Elemtypex,intp)
调用Search函数
判断i的取值,进行有关插入的操作。
main()2、查找函数:
intSearch(HashTableh,Elemtypex,intp)
通过除留余数法以及线性探测再散列法进行查找。
通过结构体中标识元素“tag”判断存储元素有无。
3、结束程序
6、详细设计:
#include<
stdio.h>
conio.h>
malloc.h>
#defineTableSize20//哈希表长20,可变。
#defineSUCCESS1
#defineUNSUCCESS0
#defineDUPLICATE-1
//哈希表存储元素
//哈希表元素
//哈希表
voidsurface()//用户界面显示程序,增加程序可读性
inti;
for(i=0;
i<
=25;
i++)printf("
*"
);
printf("
数据结构课程设计"
\n"
=5;
=20;
"
课题四哈希表查找设计"
=75;
}
intInitiate(HashTable*h)
{//哈希表初始化
i<
TableSize;
i++)
(*h).table[i].tag=0;
(*h).table[i].elem.key=NULL;
}
(*h).count=0;
returnSUCCESS;
}//初始化为空表。
{//查找元素操作
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)//元素已存在
该元素在哈希表的第%d位\n"
j);
return-j;
//返回位置的负数下标
else//元素不存在
哈希表中未查找到%d\n"
returnj;
//返回其位置的下标
{//插入元素操作
inti=Search(*h,x,p);
//利用查找操作返回相关值,取值规则详见上方注释
if(i<
0)//元素已存在
{printf("
元素已存在,无法再插入,操作失败!
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("
成功插入!
returnSUCCESS;
else
if(i==TableSize)//哈希表已满时,插入失败
{
printf("
哈希表已满,无法再插入,操作失败!
returnUNSUCCESS;
}
intmain()
{
inti,n;
charc;
//选择变量
HashTableh;
//哈希表h
intdivider;
//除留余数法的除数
Initiate(&
h);
//初始化哈希表(空表)
surface();
//运行界面
请输入一个小于20的质数作为除数:
scanf("
%d"
&
divider);
while
(1)
1、录入元素\n2、查找指定元素在表中的位置\n"
3、输入其他:
退出\n"
请输入相关功能的选择序号:
getchar();
scanf("
%c"
c);
switch(c)
case'
1'
:
{printf("
请输入需要输入的元素个数n(n<
=20):
"
n);
Elemtype*pi;
pi=(Elemtype*)malloc(n*sizeof(Elemtype));
//根据元素个数分配地址
请[依次]输入%d个元素的值:
n);
for(i=0;
n;
i++)
{
scanf("
pi[i].key);
Insert(&
h,pi[i],divider);
//插入
}
已返回主界面,请重新选择:
break;
}
case'
2'
请输入需要查找的元素的值:
Elemtypea;
//所需查找的元素
a.key);
Search(h,a,divider);
//查找
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)结束程序