问题描述

空表开始,将输入元素按照输入顺序逐个插入个哈希表生成哈希表。之后查找元素输出探测序列输出查找过程中经过的结点的数据。表长为m,哈希函数为Hash(key)=key mod P (P<=m),用二次探测再散列法处理冲突,即探测序列为Hi=(Hash(key)+di) mod m,其中增量序列为di = 1, -1, 2, -2,3,-3 …, k, -k (km/2)

输入说明

第一行三个整数nmPn输入元素的个数,m为哈希表的表长,P为哈希函数Hash(key)=key mod PP第二行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);
	}
}
12-25 23:18