哈希查找实现。函数不变,探测序列也不变。
输入:
8 \\key的个数
22 41 53 46 30 13 1 67
输出:
0 22
1 67
2 41
3 30
4 0
5 53
6 46
7 0
8 13
9 0
10 1
#include <stdio.h>
#include <stdlib.h>
#define len 11
//老师声明这不是抄的,自己课下提前调好写出来的
typedef struct s
{
int key;
}kk;
typedef struct ss
{
kk data;
}datatype;
void CreatSeqHTbl(int SeqHTbl[],int m,datatype *eptr,int n)
{
int d,i,count=1,k=0;
for(i=0; i<m; i++)
SeqHTbl[i]=0;
while(k<n)//遍历关键码,n为关键码个数
{
d=(3*eptr->data.key)%m;//哈希函数转换关键码值,求其存储的地址
count=0;
while(SeqHTbl[d]!=0)
{
d=((3*eptr->data.key)%m+count*((7*(eptr->data.key))%10+1))%m;//d=(d+count*((7*(eptr->data.key))%10+1))%m;//计算步长移位
count++;
}
SeqHTbl[d]=eptr->data.key;//散列表对应存储位置保存关键码值
eptr++;
k++;
}
for(i=0; i<m; i++)
printf("%d %d\n",i,SeqHTbl[i]);//输出散列表
}
int main()
{
int SeqHTbl[len],nums,i;//num为输入的关键码个数,SeqHTbl[len]为散列表
datatype arr[len];
scanf("%d",&nums);
// scanf("%d",&arr[0].data.key);
// while(nums<num)
// {
// num++;scanf("%d",&arr[num].data.key);//输入关键码
// }
for(i=0; i<nums; i++)
scanf("%d",&arr[i].data.key);//输入关键码
datatype *eptr=&arr[0];
CreatSeqHTbl(SeqHTbl,len,eptr,nums);
return 0;
}