关闭

查找(三)哈希表查找

标签: 哈希查找
213人阅读 评论(0) 收藏 举报
分类:

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

代码:

//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;
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:107222次
    • 积分:3712
    • 等级:
    • 排名:第8697名
    • 原创:264篇
    • 转载:40篇
    • 译文:0篇
    • 评论:8条
    最新评论