哈希表(开放定址法处理冲突)
采用除留余数法(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;
}