原题:https://pintia.cn/problem-sets/15/problems/889
本题是考察对哈希表的理解,这里面哈希函数是用的除留余数法。【H(key)=key%p】除留余数法的关键在于找到那个余数p;题中已经给出。
规定处理哈希冲突的方法是线性探测法,就是简单地加一就行了。
#include<stdio.h>
#include<stdlib.h>
typedef struct h{
int *data;
int TableSize;
}*HashList;
HashList creat(int p)
{
int i;
HashList H=(HashList)malloc(sizeof(HashList));
H->TableSize=p;
H->data=(int*)malloc(sizeof(int)*H->TableSize);
for(i=0;i<p;i++)H->data[i]=0;//初始化0是空
return H;
}
int Findindex(HashList H,int key)//线性探测处理哈希冲突,找到合适的位置,并且返回它
{
int index=key%H->TableSize;
//找空位,如果在找的过程中碰到它本身,直接退出就行了。
while(H->data[index]!=0&&H->data[index]!=key)
{
index++;
if(index==H->TableSize)index=0;//如果满了就从头开始找
}
return index;
}
int insert(HashList H,int key)
{
int index=Findindex(H,key);//先找一个合适的位置
H->data[index]=key;
return index;
}
int main()
{
int i,N,P,key;
scanf("%d%d",&N,&P);
HashList H=creat(P);
for(i=0;i<N;i++)
{
scanf("%d",&key);
int x=insert(H,key);
if(i==0)
printf("%d",x);
else
printf(" %d",x);
}
return 0;
}