概念部分不做介绍,具体见严蔚敏《数据结构》。
代码:
//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;
}
}