<template typename ElemType,typename Keytype>
int ProbeArray[]={997,***}; //一个合适的素数序列用来open addressing
typedef struct
{
ElemType *elem; //数据元素的动态分配首地址
Int count; // 当前数据元素个数
Int sizeindex; // 动态数组的当前容量
}HashTable;
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
#define OK 1;
typedef bool Status;
typedef NULLKEY 0;
Status searchHash(HashTable H,KeyType K,int&p,int&c)
{
p=Hash(k);
while(H.elem[p].key!=NULLKEY&&!EQ(K,H.elem[p].key)) //如果位置p处非空,并且和待插入的关键字不同
collision(p,++c); // 改变p,解决冲突,增加冲突的计数次数c,用来探查下一个槽
if(EQ(K,H.elem[p].key)) return SUCCESS;
return UNSUCESS; // 如果所有的槽都探查完了还没找到,则错误。
}//searchHash
bool collision(int&p,int& c)
{
return true;
}
int Hash(int a)
{
return 1;
}
Status insertHash(HashTable &H,ElemType e) //将 e插入到hash表中
{
int c=0; //冲突次数;
p=Hash(k);
if(searchHash(H,e.key,p,c)) return DUPLICATE; //如果找到该元素,则不需要插入
else if(c<ProbeArray[H.sizeindex]/2) // 如果冲突次数没有达到上界
{
H.elem[p]=e; // 如果没找到,就插入;
++H.count; //数据元素计数增加
return OK;
}//elseif
else //如果冲突次数太多了,hash表盛不了了
{
//recreateHashTable(H); //重建hash表
return UNSUCCESS;
}
}
hash表的openADDRESSing的c语言实现
最新推荐文章于 2021-10-08 21:31:43 发布