(上机)哈希表的生成与查找(二次探测再散列)

问题描述

从空表开始,将输入元素按照输入顺序逐个插入一个哈希表,以生成哈希表。之后查找元素,输出探测序列,即输出查找过程中经过的结点中的数据。表长为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);
	}
}

 

上一篇:87 设计模式(二)——单例模式


下一篇:PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)