说明:
由于本人能力有限,本文难免有错误之处,希望各位同学不吝赐教,共同进步!
题目:哈希表
问题描述:
用除留余数法和线性探测再散列的冲突解决方法构造哈希表。
输入:
输入数据第一行为两个正整数分别为:哈希表表长m(m<100)和除数p(p<=m)。后面每一行是一个整数关键字,以-1作为输入的结束。
输出:
若输入的关键字在哈希表中已存在,则输出该关键字在哈希表中的位置,继续等待输入下一个关键字。
若输入的关键字在哈希表中不存在,则判断当前哈希表中关键字的个数是否等于m-1,若相等,则输出“Table full”,程序结束;否则将关键字插入哈希表,并输出该关键字插入在哈希表中的位置,继续等待输入下一个关键字。
示例输入:
5 3
1
2
3
4
5
-1
示例输出:
1
2
0
3
Table full
C代码:
#include <stdio.h>
int main()
{
int p=0,m=0,i=0,j=0,len=0,t=0;
int in[100]={0},hash[100]={0};
scanf("%d%d",&m,&p);
for(j=0;j<100;j++)//先初始化,为-1则未使用
hash[j]=-1;
while(1)
{
scanf("%d",&in[i]);
if(in[i]==-1)
{
break;
}
for(t=0,j=0;in[i]!=hash[j]&&t<len;j++)//在已有关键词中查找
{
if(hash[j]!=-1)//有元素则增1
t++;
}
if(t==len)//无相同关键词
{
if(len==m-1)//表满退出
{
printf("Table full\n");
break;
}
j=in[i]%p;//从第一个可能插入位置开始寻找
while(hash[j]!=-1)
{
j=(j+1)%m;
}
hash[j]=in[i];
printf("%d\n",j);
len++;
}
else//有相同关键词,输出位置
{
printf("%d\n",j);
}
i++;
}
return 0;
}