哈希表

本文详细介绍了一种基于哈希表的数据结构实现方法,包括初始化、两种不同的冲突解决策略(一次探测再散列和二次探测再散列)及查找操作。通过具体的C语言代码示例,展示了如何创建和使用哈希表进行数据存储与检索。

#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 = j
j-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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值