哈希表的类型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); */
#include "allinclude.h" //DO NOT edit this line
HLink Search(ChainHashTab &H, int i, HKeyType h)
{
int num=Hash(H,h);
HLink t;
t=(HLink)malloc(sizeof(HLink));
for(t=H.rcd[num];t!=NULL;t=t->next)
if(t->data==h) return t;
return NULL;
}
int BuildHashTab(ChainHashTab &H, int n, HKeyType es[])
{ // Add your code here
int i;
H.rcd = (HLink*)malloc(H.size * sizeof(HLink));//初始化
H.count = 0;
for (i = 0; i < H.size; i++)
{
H.rcd[i] = NULL;
}
int num;
HLink p;
HLink t;
HKeyType h;
for(i=0;i<n;i++)
{
p=(HLink)malloc(sizeof(HLink));
num=Hash(H,es[i]);
p->data=es[i];
h=es[i];
if(Search(H,i,h)==NULL)
{
p->next=H.rcd[num];//插入
H.rcd[num]=p;
H.count++;
}
}
}