查找(三)哈希表查找

概念部分不做介绍,具体见严蔚敏《数据结构》。

代码:

//HashSearch.c

#include <stdio.h>
#include <stdlib.h>

//--------------开放定址哈希表存储结构--------

typedef char KeyType;//定义关键字类型
typedef struct{
    KeyType key;
}ElemType;//定义元素类型
int hashsize[] = { 997,... };//哈希表容量递增表,一个合适的素数序列
typedef struct{
    ElemType *elem; //数据元素存储基址
    int count;  //当前数据元素个数
    int sizeindex;  //hashsize[sizeindex]为当前容量
}HashTable;

#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1

//此函数在开放定址哈希表中查找等于关键字key的记录
int SearchHash(HashTable H, KeyType key, int p, int c){
    //在开发定址哈希表H中查找关键字为key的元素。
    //若查找成功,以p指示待查数据元素在在表中的位置,并返回SUCCESS;
    //否则,以p指示插入位置,并返回UNSUCCESS。
    //c用来计冲突次数,其初值为0,供建表时参考

    p = Hash(key);  //求得哈希地址
    while (H.elem[p].key != NULLKEY && key != H.elem[p].key)//地址中有记录,并且关键字不相等
        collision(p, ++c);  //求得下一探查地址p
    if (key == H.elem[p].key)
        return SUCCESS;
    else
        return UNSUCCESS;

}

//data field
int c,p;

//此函数插入数据元素到哈希表
int InsertHash(HashTable H, ElemType e){
    //查找不成功时插入数据元素e到开放定址哈希表H中,并返回SUCCESS
    //若冲突次数过大。则重建哈希表
    c = 0;
    if (SearchHash(H, e.key, p, c))
        return DUPLICATE;//表中已有与e有相同关键字的元素
    else if (c < hashsize[H.sizeindex] / 2){//冲突次数为达到上限,(c的阈值可调)
        H.elem[p] = e;
        H.count++;
        return SUCCESS;
    }
    else{  //重建哈希表
        RecreateHashTable(H);
        return UNSUCCESS;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值