构建哈希表以及在哈希表中元素的查找和插入

程序要求

编写程序构建哈希表的存储结构,并在该结构上实现查找以及插入操作:输入一个整数,若整数存在于哈希表中,返回查找成功提示;否则,返回查找不成功提示,并将该整数插入到哈希表中。

程序代码

#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表之后,查找操作之前的结果
构建Hash表之后,查找操作之前的结果
查找不成功(并进行插入操作后)的结果
查找不成功的结果
查找成功的结果
查找成功的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值