程序要求
编写程序构建哈希表的存储结构,并在该结构上实现查找以及插入操作:输入一个整数,若整数存在于哈希表中,返回查找成功提示;否则,返回查找不成功提示,并将该整数插入到哈希表中。
程序代码
#include<stdio.h>
typedef int ElemType;
typedef int KeyType;
typedef int status;
typedef struct {
ElemType elem[7];
int count; // 当前数据元素个数
int sizeindex;// hashsize[sizeindex]为当前容量
} HashTable;
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
int Hash(int a)//哈希函数,用来求哈希地址,参数为a,返回值为存储哈希地址的整型变量
{
return (3*a)%11;
}
void collision(int &p,int i,int K)//冲突处理函数,使用开放定址法——线性探测再散列
{
int di;
di=i*((7*K)%10+1);
p=(p+di)%11;
}
status CreateHash(HashTable &H,int &p,int K)
//哈希表的创建,将从键盘中键入的数据放入哈希表中,参数为哈希表H的引用,整型变量K
//以及整型变量K的哈希地址的引用p
{
int di,i=1;
if(H.elem[p]<0)
//如果在哈希表中,下标为K哈希地址p的元素H.elem[p]小于0
//那么表示此处没有冲突,即这是第一次在这个位置插入K
{
H.elem[p]=K;//将K赋给H.elem[p]
printf("NO collision! p=%d K=H.elem[%d]=%d\n",p,p,H.elem[p]);
//不产生冲突时,输出K的值,K的哈希地址,此时下标为K的哈希地址p的元素的值就是K本身
}
else
//如果在哈希表中,下标为K哈希地址p的元素H.elem[p]不小于0
//那么表示此处有冲突,即之前在这个位置上已经有K插入过了
{
printf("collision! k=%d p=%d H.elem[%d]=%d\n",K,p,p,H.elem[p]);
//产生冲突时,输出K的值,K的哈希地址以及下标为K的哈希地址p的元素的值
collision(p,i,K);//调用collision处理冲突,得到新的p
CreateHash(H,p,K);//调用自身,重复上述过程,直到没有冲突为止
i++;
}
} // CreateHash
status SearchHash(HashTable &H,int &p,int K)
// 在开放定址哈希表H中查找关键码为K的记录,参数为哈希表H的引用,K的哈希地址p的引用以及整型变量K
{
int di,i=1,p1;
p1=p;
while(H.elem[p]>0&&K!=H.elem[p])
//在哈希表中,下标为K哈希地址p的元素H.elem[p]大于0且其值不等于K
{
collision(p,i,K);// 求下一探查地址 p
i++;
}
if (K==H.elem[p])//下标为K哈希地址p的元素H.elem[p]其值等于K,标志着查找成功
return SUCCESS;
else
return UNSUCCESS;// 查找不成功
}
status InsertHash(HashTable &H,ElemType target)
//查找目标元素不成功时,将目标元素target插入到哈希表的对应位置中
//参数为哈希表的引用H,以及整型变量(目标元素target)
{
int p;
if(SearchHash(H,p,target)==SUCCESS)
return DUPLICATE;// 防止target已经存在于hash表中,若存在,返回-1
else
{
p=Hash(target);
//target不存在于hash表中,求得target的哈希地址,调用CreateHash函数
//将目标元素target插入到哈希表的对应位置中
CreateHash(H,p,target);//调用CreateHash将目标元素target插入到哈希表的对应位置
}
} // InsertHash
int main()
{
int i,p,a[7],target;
HashTable H;
for(i=0;i<11;i++)
H.elem[i]=-1;//哈希表初始状态每个表中元素都为-1,插入的数全部为正整数
printf("Please input 7 nums to create a HASH TABLE:\n");
for(i=0;i<7;i++)
{
scanf("%d",&a[i]);//每输入一个K值,就将其插入到Hash表的对应位置
p=Hash(a[i]);// 求得哈希地址
CreateHash(H,p,a[i]);
}
printf("The Hash Table:\n");//输出哈希表
for(i=0;i<11;i++)
printf("%d ",H.elem[i]);
printf("\n");
printf("Please input the target elem:\n");//输入待查找的元素
scanf("%d",&target);
p=Hash(target);//求待查找的元素的哈希地址
if(SearchHash(H,p,target))
//若查找成功,SearchHash的返回值为1,输出成功提示并输出target在哈希表中的下标
printf("SUCCESS,the elem already exists!The position of the elem is %d\n",p);
else
//若查找不成功,SearchHash的返回值为0,输出查找不成功提示
{
printf("UNSUCCESS,the elem DOESN'T exist!Insert:\n");
InsertHash(H,target);
}
for(i=0;i<11;i++)
//输出查找之后的哈希表,如果查找成功则与最初的哈希表一致;
//否则查找失败经过插入操作之后,哈希表长度比原先增加一个。
printf("%d ",H.elem[i]);
}
本题目中数据来自
数据结构习题(C语言版)清华大学出版社 第九章9.19
运行结果
构建Hash表之后,查找操作之前的结果
查找不成功(并进行插入操作后)的结果
查找成功的结果