【题目】假设哈希表长为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); */
本题并不难,之所以写下本题是因为博主在实际花的时间远大于一般该难度所花时间,主要原因是对于冲突处理模块的处理,读者可以适当注意前后的联系;
答案仅供参考:
int BuildHashTab(ChainHashTab &H, int n, HKeyType es[]){
/* 直接调用下列函数 */
/* 哈希函数: */
/* int Hash(ChainHashTab H, HKeyType k); */
/* 冲突处理函数: */
/* int Collision(ChainHashTab H, HLink &p); */
//简单的错误处理;
if(n<0) {
return -1;
}
H.rcd = (HLink*)malloc(sizeof(HLink)*H.size);
if(H.rcd==NULL) {
return -1;
} else {
H.count = 0;
}
int stand = 0;
//哈希表的常规构造法
for(int i=0;idata = es[i];
h->next = H.rcd[stand];
H.rcd[stand] = h;
H.count++;
} else {
//判断是否已有该元素
HLink s = H.rcd[stand];
while(s!=NULL) {
if(s->data==es[i]) {
break;
} else {
s = s->next;
}
}
if(s==NULL) {
//冲突写入
Collision(H,h);
h->data = es[i];
h->next = H.rcd[stand];
H.rcd[stand] = h;
H.count++;
}
}
}
return OK;
}