散列查找 ⑴ 对于给定的一组整数和散列函数,采用线性探测法处理冲突构造散列表;⑵ 设计查找算法,验证查找性能。

散列查找

⑴ 对于给定的一组整数和散列函数,采用线性探测法处理冲突构造散列表;

⑵ 设计查找算法,验证查找性能。

#include 

int H(int k){
	int x;
	x=k%19;//除留余数法 19为最接近表长的素数 
	return x;
}

int HashSearch1(int ht[ ], int k, int *p)	/*形参p传指针,返回位置*/
{
	int i, j, flag = 0;						/*flag=0表示散列表未满*/
	j = H(k);								/*计算散列地址*/
	i = j;									/*记载比较的起始位置*/
	while (ht[i] != -1 && flag == 0)
	{
		if (ht[i] == k) 
		{						/*比较若干次查找成功*/
			*p = i; 
			return 1;
		}          
		else 
			i = (i + 1) % 20;					/*向后探测一个位置*/
		if (i == j) 
			flag = 1;					/*表已满*/
	}
	if (flag == 1) 
	{
		return -1;
	}		/*表满,产生溢出*/
	else 
	{								/*比较若干次查找不成功,插入*/
		ht[i] = k; 
		*p = i; 
		return 0;
	}
}

int InitHashTable(int ht[ ],int x)
{
	int i,j,flag=0;//flag标记表是否满 
	i=H(x);
	j=i;
	if(ht[i]==-1){
		ht[i]=x;	
		return 0;
	}
	else{
		while (ht[i] != -1 && flag == 0)//寻找x应该存储的位置 
		{        
			i = (i + 1) % 20;					/*向后探测一个位置*/
			if (i == j) 
				flag = 1;					/*表已满*/
		}
		if (flag == 1) 
		{
			return -1;
		}		/*表满,产生溢出*/
		else 
		{								/*比较若干次查找不成功,插入*/
			ht[i]=x;	
			return 0;
		}
	}
}

int main()
{
	int ht[20];//散列表表长为20 
	for(int t=0;t<20;t++){
		ht[t]=-1; //将散列表初始化为-1
	}
	int p;
	int x,i;
	printf("请输入散列表中的原始数据,以-1010停止\n"); 
	scanf("%d",&x); 
	while(x!=-1010){
		i=InitHashTable(ht,x);
		if(i==-1){
			printf("表已满,溢出\n");
			break;
		}
		scanf("%d",&x); 
	}
	printf("请输入要查找的元素,以-1010停止\n"); 
	scanf("%d",&x); 
	while(x!=-1010){
		i=HashSearch1(ht,x,&p);
		if(i==-1){
			printf("表已满,溢出\n");
		}
		else if(i==1){
			printf("查找成功,在散列表中的第%d位\n",p+1);
		}
		else{
			printf("查找失败,已插入,在散列表中的第%d位\n",p+1);
		}
		scanf("%d",&x);
	}
	return 0;
}

你可能感兴趣的:(散列查找 ⑴ 对于给定的一组整数和散列函数,采用线性探测法处理冲突构造散列表;⑵ 设计查找算法,验证查找性能。)