哈希表(开放定址法处理冲突)

哈希表(开放定址法处理冲突)

采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测。

输入

	第一行为哈希表的长度n; 第二行为关键字的个数; 第三行为关键字集合; 第三行为要查找的数据。

输出

如果查找成功,输出关键字所哈希表中的地址和比较次数;如果查找不成功,输出-1。

样例输入

13
11
16 74 60 43 54 90 46 31 29 88 77
16

样例输出

3,1

先水一下,可以用简单的纯C语言数组来做。
代码如下:

#include<stdio.h>
#define Max 1000
int main()
{
	int n,m,a[Max],e;
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++)
		scanf("%d",&a[i]);
	scanf("%d",&e);
	for(int i=0;i<n;i++)
		if(a[i]==e)//判断是否存在e,输出地址和次数
		{
			printf("%d,%d",e%n,i+1);
			return 0;
		}
	printf("-1");//不存在就输出-1
	return 0;
}

用除数留余法建立哈希表,再判断。开放地址法是找到地址有空的就存入,如果n>m,那就一定有空闲单位。
代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
	int count;
}list;
void init(list q[],int n)
{
	for(int i=0;i<n;i++)//初始哈希表的每个单位都为空,以count=0来作为标志
		q[i].count=0;
}
void creat(list q[],int n,int e)
{
	int t=e%n;
	if(q[t].count==0)//如哈希表有空就存入e,并让这个单位不为空,以count=1来作为标志
	{
		q[t].data=e;
		q[t].count=1;
	}
	else
	{
		t=(t+1)%n;
		if(q[t].count=0)//同上
		{
			q[t].data=e;
			q[t].count=1;
		}
	}
}
void find(list q[],int n,int e)
{
	int t=e%n;
	int p=0;
	for(int i=0;i<n;i++)
	{
		if(q[t].data==e)//判断是否等于e,在确定是否输出
		{
			printf("%d,%d",t,i+1);
			p=1;
			break;
		}
		else
			t=(t+1)%n;
	}
	if(p==0)
		printf("-1");//不存在,就输出-1
}
int main()
{
	int n,m,num,e;
	scanf("%d %d",&n,&m);
	list q[n];//建立哈希表
	init(q,n);
	for(int i=0;i<m;i++)
	{
		scanf("%d",&e);
		creat(q,n,e);
	}
	scanf("%d",&num);
	find(q,n,num);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值