给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例:
4 5
24 15 61 88
输出样例:
4 0 1 3
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 1001
typedef struct TblNode *HashTable;
struct TblNode{
int TableSize;
int *data;
};
HashTable CreateHash(int TableSize){
HashTable H = (HashTable)malloc(sizeof(struct TblNode));
int i;
H->TableSize = TableSize;
H->data = (int *)malloc(H->TableSize*sizeof(int));
for(i=0;i<H->TableSize;i++)
H->data[i] = -1;
return H;
}
int Hash(int key, int P){
return key%P;
}
int Find(HashTable H, int key){
int pos;
pos = Hash(key,H->TableSize);
while((H->data[pos]!=-1)&&(H->data[pos]!=key)){
pos++;
if(pos == H->TableSize)
pos-=H->TableSize;
}
return pos;
}
void Insert(HashTable H, int x){
int pos = Find(H,x);
if(H->data[pos]==-1){
H->data[pos] = x;
}
}
int main(void){
int i,N,P;
scanf("%d %d",&N,&P);
int a[N];
HashTable H = CreateHash(P);
for(i=0;i<N;i++){
scanf("%d",&a[i]);
Insert(H,a[i]);
}
int flag = 0;
for(i=0;i<N;i++){
if(flag) printf(" ");
else flag = 1;
printf("%d",Find(H,a[i]));
}
return 0;
}