#include<stdio.h>
#include<stdlib.h>
#define HASHSIZE 12
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *hash;
ElemType sum[HASHSIZE];
int numsize;
int hashsize;
}Hash;
Status Chushihua(Hash &H){
H.hash = (ElemType )malloc(HASHSIZEsizeof(ElemType));
H.numsize = 8;
H.hashsize = 12;
for(int i=0;i<H.hashsize;i++)
{
H.hash[i] = 0;
H.sum[i] = 0;
// printf("%d",H.hash[i]);
}
return OK;
}
Status Chuangjianhash1(Hash &H){
int num[8] = {12,33,54,41,22,76,19,16};
int t,n,h,s;
n = H.numsize;
h = H.hashsize;
for(int i=0;i<n;i++)
{
s = 0;
t = num[i]%h;
while(H.hash[t]!=0)
{
t++;
s++;
if(t>=h)
t = 0;
}
s++;
H.hash[t] = num[i];
H.sum[t] = s;
}
return OK;
}
Status Chuangjianhash2(Hash &H){
int num[8] = {12,33,54,41,22,76,19,16};
int j,t1,t2,n,h,s;
n = H.numsize;
h = H.hashsize;
for(int i=0;i<n;i++)
{
s = 0;
j = 0;
t1 = num[i]%h;
t2 = t1;
while(H.hash[t2]!=0)
{
j++;
t2 = t1+jj;
s++;
if(t2>=h)
t2 = jj-h+t2;
if(H.hash[t2]==0)
break;
t2 = t1-j*j;
s++;
if(t2<0)
t2 = h-j*j+t2;
}
s++;
H.hash[t2] = num[i];
H.sum[t2] = s;
}
return OK;
}
Status Chazhao(Hash H,int e){
int t,h,k;
k = 1;
h = H.hashsize;
t = e%h;
while(H.hash[t]!=e)
{
t++;
k++;
if(k>h)
break;
if(t>=h)
t = 0;
}
if(H.hash[t]!=e)
return -1;
else
return t;
}
void Print(Hash H){
int h;
h = H.hashsize;
printf("散列地址");
for(int i=0;i<h;i++)
printf("%4d",i);
printf("\n");
printf("关键字 ");
for(int i=0;i<h;i++)
printf("%4d",H.hash[i]);
printf("\n");
printf("探测次数");
for(int i=0;i<h;i++)
printf("%4d",H.sum[i]);
}
int main(){
int e;
Hash H1,H2;
Chushihua(H1);
Chushihua(H2);
printf(“一次探测再散列的结果为:\n”);
Chuangjianhash1(H1);
Print(H1);
printf("\n\n二次探测再散列的结果为:\n");
Chuangjianhash2(H2);
Print(H2);
printf("\n\n请输入要查找的关键字:\n");
scanf("%d",&e);
e=Chazhao(H1,e);
if( e == -1)
printf("\n查找失败!:\n");
else printf("\n查找成功!该元素所在哈希表的位置为hash[%d]:\n",e);
return 0;
}
本文详细介绍了一种基于哈希表的数据结构实现方法,包括初始化、两种不同的冲突解决策略(一次探测再散列和二次探测再散列)及查找操作。通过具体的C语言代码示例,展示了如何创建和使用哈希表进行数据存储与检索。
2646

被折叠的 条评论
为什么被折叠?



