您的位置:首页 > 其它

算法学习 之链表

2017-05-09 00:00 10 查看
/**********开放定址哈希表的存储结构**********/
int hashsize[ ] = { 997, ... }; // 哈希表容量递增表一个合适的素数序列
typedef struct
{
ElemType *elem; // 数据元素存储基址,
int count; // 当前数据元素个数
int sizeindex;// sizeindex为当前容量
} HashTable;
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
Status SearchHash (HashTable H, KeyType Key, int &p, int &c)
{ // 在开放定址哈希表H中查找关键码为K的元素,
// 若查找成功,以p指示待查数据元素在表中位置,
// 并返回SUCCESS;否则,以p指示插入位置,
// 并返回UNSUCCESS, c用以计冲突次数,其初值
// 置零,供建表插入时参考
p = Hash(Key);  //求得哈希地址
while ( H.elem[p].key != NULLKEY &&K != H.elem[p].key)
// 该位置中填有记录并且关键字不相等
collision(p, ++c); // 求得下一探查地址p
if ((Key== H.elem[p].key) return SUCCESS;
// 查找成功,p返回待查数据元素位置
else return UNSUCCESS; // 查找不成功,p返回的是插入位置
} // SearchHash

通过调用查找算法实现了开放定址哈希表的插入操作。

Status InsertHash (HashTable &H, Elemtype e)
{ // 查找不成功时插入数据元素e到开放定址哈希表H
// 中,并返回OK;若冲突次数过大,则重建哈希表
c = 0;
if ( HashSearch ( H, e.key, p, c ) == SUCCESS )
return DUPLICATE;  //表中已有与e有相同关键字的元素
else if ( c < hashsize[H.sizeindex]/2 )
{  // 冲突次数c未达到上限,(阀值c可调)
H.elem[p] = e; ++H.count; return OK; // 插入e
}
else RecreateHashTable(H);     // 重建哈希表
} // InsertHash
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐