用C语言实现:对关键字码构成哈希表并输出,输出操作次数,输出平均查找长度,输入一个数,输出所在哈希表位置

此代码可以正常运行,下附有运行区

#include
#define LEN 10//常量用大写 
#define keynum 8
typedef int Elemtype;

int GetPrimeNum(int a)  //求最大素数(质数)
{
	int t=a;
	while(t>0)  //>1也可
	{
		t--;
		int flag=1;
		for(int i=2;i<t;i++)
		{
			if(t%i==0)
			{
				flag=0;
				break;
			}
		}
		if(flag)
		    break;
	}
	return t;
}

void Hashtable(Elemtype key[],Elemtype Hash[],int Count[],int p)//关键字组,哈希表组,计数组 
{
	for(int i=0;i<keynum;i++)
	{
		Elemtype t=key[i]%p;
		if(Hash[t]==0)   //为空,直接存放
		{
			Hash[t]=key[i];
			Count[t]=1;
		}
		else   //解决冲突
			for(int j=1;j<LEN;j++)
			{
				t=(key[i]%p+j)%LEN;
				if(Hash[t]==0)
				{
					Hash[t]=key[i];
					Count[t]=1+j;
					break;
				}
			}
	}
}

float GetASL(int Count[])   //求平均查找长度
{
	float sum=0; 
	for(int i=0;i<LEN;i++)
	{
		sum+=Count[i];
	}
	float asl=sum/keynum; 
	return asl;
}

int Locate(Elemtype Hash[],Elemtype key,int p)
{
	Elemtype t=key%p;
	int flag=-1;
	if(Hash[t]==key)
	   flag=t+1;
	else
		for(int j=1;j<LEN;j++)
		{
			if(Hash[t+j]==key)
			{
			   flag=t+j+1;
			   break;  //找到一个就行
			}
		}	
	return flag;
}
main()
{
	Elemtype key[keynum],Hash[LEN]={0},count[LEN]={0}; 
	int p=GetPrimeNum(LEN);

	printf("输入%d个关键字(空格隔开)\n",keynum);
	for(int i=0;i<keynum;i++)
	   scanf("%d",&key[i]);
	Hashtable(key,Hash,count,p);
	printf("哈希表数据:\n");
	for(i=0;i<LEN;i++)
		printf("%4d",Hash[i]);
	printf("\n次数统计为:    \n");
	for( i=0;i<LEN;i++)
		printf("%4d",count[i]);
	printf("\n各自的位置为:\n");
	for( i=1;i<=LEN;i++)
	    printf("%4d",i);
	printf("\n");

	printf("平均查找长度为:%f\n",GetASL(count));

	 

	int flag=1,b;
	while(flag)  //运行一次,查找多次
	{
		printf("输入你想查找的非零整数:\n");
		scanf("%d",&b);
		if(Locate(Hash,b,p)!=-1)
			printf("处在第%d个位置\n",Locate(Hash,b,p));
		else
			printf("没找到\n");
		printf("输入大于0的数可以重复查找,输入0终止运行\n");
	    scanf("%d",&flag);
	    if(flag==0)
	        break;
	}
	
}


/*输入示例:
9 1 23 14 55 20 84 27
哈希表:
14 1 9 23 84 0 55 20 27 0
*/

用C语言实现:对关键字码构成哈希表并输出,输出操作次数,输出平均查找长度,输入一个数,输出所在哈希表位置_第1张图片

你可能感兴趣的:(查找)