【题目】假设哈希表长为m,哈希函数为H(x),用链地址法
处理冲突。试编写输入一组关键字并建造哈希表的算法。
哈希表的类型ChainHashTab定义如下:
#define NUM 7
#define NULLKEY -1
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
typedef char HKeyType;
typedef struct HNode {
HKeyType data;
struct HNode* next;
}*HLink;
typedef struct {
HLink *rcd; // 指针存储基址,动态分配数组
int count; // 当前表中含有的记录个数
int size; // 哈希表的当前容量
}ChainHashTab; // 链地址哈希表
int Hash(ChainHashTab H, HKeyType k) { // 哈希函数
return k % H.size;
}
Status Collision(ChainHashTab H, HLink &p) {
// 求得下一个探查地址p
if (p && p->next) {
p = p->next;
return SUCCESS;
} else return UNSUCCESS;
}
**********/
int BuildHashTab(ChainHashTab &H, int n, HKeyType es[])
/* 直接调用下列函数 */
/* 哈希函数: */
/* int Hash(ChainHashTab H, HKeyType k); */
/* 冲突处理函数: */
/* int Collision(ChainHashTab H, HLink &p); */
{
ChainHashTab *N;
N=&H;
HLink O;
int i, addres, index;
H.rcd = (HLink*)malloc(NUM*sizeof(HLink));
H.size = 7;
H.count = 0;
for(i=0;i<n;i++){
addres = Hash( H, es[i]);
O= H.rcd[addres];
HLink newHNode;
newHNode = (HNode*)malloc(sizeof(HNode));
if(newHNode == NULL) return UNSUCCESS;
if(O == NULL){
H.rcd[addres] = newHNode;
}else{
index = 1;
while(index != 0){
index = Collision(H, O);
}
}
O->next = newHNode;
newHNode->next = NULL;
}
return SUCCESS;
}
{
int i,k,j;
HLink p,q,p1;
H.rcd = (HLink*)malloc(7*sizeof(HLink));
H.size = 7;
H.count = 0;
for(i = 0;es[i] >= 'A';i++)
{
p = (HNode*)malloc(sizeof(HNode));
p->next = NULL;
p->data = es[i];
k = Hash( H, p->data) ;
if(NULL !=H.rcd[k])
{ // 判断其中是否有相同的HKeyType
p1 = H.rcd[k];
while(NULL != p1)
{ //用j作为标记,如果j = 0表示没有相同的,插入p
if(p1->data == p->data)
j = 1;
p1 = p1->next;
}
if(j == 0)
{
q = H.rcd[k];
p->next = q;
H.rcd[k] = p;
}
j = 0;
}
else
H.rcd[k] = p; //为什么H.rcd[k]->next = p;不会报错
H.count++;
}
}
---------------------
作者:lzc394049722
来源:CSDN
原文:https://blog.csdn.net/lzc394049722/article/details/51836980
版权声明:本文为博主原创文章,转载请附上博文链接!