問題描述
從空表開始,將輸入元素按照輸入順序逐個插入一個哈希表,以生成哈希表。之后查找元素,輸出探測序列,即輸出查找過程中經過的結點中的數據。表長為m,哈希函數為Hash(key)=key mod P (P<=m),用二次探測再散列法處理沖突,即探測序列為Hi=(Hash(key)+di) mod m,其中增量序列為di = 12, -12, 22, -22,32,-32 …, k2, -k2 (k≤m/2)。
輸入說明
第一行為三個整數n、m、P,n為輸入元素的個數,m為哈希表的表長,P為哈希函數Hash(key)=key mod P中的P。第二行為n個整數,為輸入數據。后面每一行是一個要查找的整數,以-1結束。最后的-1不查找。
輸出說明
對於每個要查找的數字,在一行上輸出探測序列,即輸出查找過程中經過的結點中的數據,中間以空格隔開。對於哈希表中不存在的數字,探測到最后一個空位置時,要輸出字符串“NULL”。每個數字的探測序列后面要換行。
輸入樣例
11 14 13
62 42 53 69 100 26 87 74 56 61 48
48
30
8
56
87
61
35
-1
輸出樣例
100 62 87 74 56 69 26 61 48
69 56 42 87 26 74 100 NULL
87 100 48 NULL
69 56
100 62 87
100 62 87 74 56 69 26 61
#include <stdio.h>
int m,n,P;
int *list;
int search(int x,bool print)
{
int h,hi;
h=hi=x%P;
for (int i=2;i<=m/2*2+2;i++)
{
if (list[hi]==x || list[hi]==-1)
break;
if (print)
printf("%d ",list[hi]);
if (i%2==0)
hi=(h+(i/2)*(i/2))%m;
else
hi=((h-(i/2)*(i/2))%m+m)%m;
}
if (print)
{
if (list[hi]==-1)
printf("NULL\n");
if (list[hi]==x)
printf("%d\n",x);
}
return hi;
}
void insert(int x)
{
int location;
location=search(x,0);
if (list[location]==x)
return;
if (list[location]==-1)
list[location]=x;
else
printf("Table FULL!\n");
}
int main()
{
int i,x;
scanf("%d%d%d",&n,&m,&P);
list=new int[m];
for (i=0;i<m;i++)
list[i]=-1;
for (i=0;i<n;i++)
{
scanf("%d",&x);
insert(x);
}
/*
printf("List is: ");
for (i=0;i<m;i++)
printf("%d ",list[i]);
printf("\n");
*/
for(;;)
{
scanf("%d",&x);
if (x==-1)
return 0;
search(x,1);
}
}
