广工第四单元

【题目】假设哈希表长为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;i<n;i++) { 
    stand = Hash(H,es[i]);
    HLink h = (HLink)malloc(sizeof(HNode));
    //判断是否可以直接插入
    if(NULL==H.rcd[stand]) {
      h->data = 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舔猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值