《算法解析:C语言描述》中关于哈希表实现的疑问

发布于 2022-09-04 06:20:39 字数 3767 浏览 25 评论 0

在此书中实现的哈希表算法中,无法插入大于一个字节的整数(如3213),其原因在于哈希函数提取插入数据的一个字节作为键。如果最左边位为1,就会被识别为负数,这就造成最后生成的哈希值小于0,于是便会索引到并不存在的的桶(链表)。请问这是书中的错误吗?如果是,如何解决?

我的解决方法是判断最后得到的bucket小于0的话,取绝对值。这样就不会索引到不存在的桶(链表)了

/*****************************************************************************
*                                                                            *
*  ----------------------chtbl.c(链式哈希表实现代码) ------------------------  *
*                                                                            *
*****************************************************************************/

#include <stdlib.h>
#include <string.h>

#include "list.h"
#include "chtbl.h"

int chtbl_init(CHTbl *htbl, int buckets, int (*h)(const void *key), int    (*match)(const void *key1, const void *key2), void (*destroy)(void*data)) {

int                i;

if ((htbl->table = (List *)malloc(buckets * sizeof(List))) == NULL)    return -1;
htbl->buckets = buckets;
for (i = 0; i < htbl->buckets; i++)    list_init(&htbl->table[i], destroy);
htbl->h = h; htbl->match = match; htbl->destroy = destroy;
htbl->size = 0;

return 0;

}


void chtbl_destroy(CHTbl *htbl) {

int                i;   

for (i = 0; i < htbl->buckets; i++) {

   list_destroy(&htbl->table[i]);

}



free(htbl->table);



memset(htbl, 0, sizeof(CHTbl));

return;

}



int chtbl_insert(CHTbl *htbl, const void *data) {

void               *temp;

int                bucket,
                   retval;   

temp = (void *)data;

if (chtbl_lookup(htbl, &temp) == 0)    return 1;



bucket = htbl->h(data) % htbl->buckets;


if ((retval = list_ins_next(&htbl->table[bucket], NULL, data)) == 0)   htbl->size++;

return retval;

}


int chtbl_remove(CHTbl *htbl, void **data) {

ListElmt           *element,
                   *prev;

int                bucket;   

bucket = htbl->h(*data) % htbl->buckets;


prev = NULL;

for (element = list_head(&htbl->table[bucket]); element != NULL; element =    list_next(element)) {

   if (htbl->match(*data, list_data(element))) {


      if (list_rem_next(&htbl->table[bucket], prev, data) == 0) {

         htbl->size--;
         return 0;

         }

      else {

         return -1;

      }

   }

   prev = element;

}



return -1;

}



int chtbl_lookup(const CHTbl *htbl, void **data) {

ListElmt           *element;

int                bucket;   

bucket = htbl->h(*data) % htbl->buckets;


for (element = list_head(&htbl->table[bucket]); element != NULL; element =    list_next(element)) {

   if (htbl->match(*data, list_data(element))) {



      *data = list_data(element);
      return 0;

   }

}


return -1;

}

 /*****************************************************************************
*                                                                            *
*  -------------------------------- match_char(查找函数) -------------------  *
*                                                                            *
*****************************************************************************/

static int match_char(const void *char1, const void *char2) {

        return (*(const char *)char1 == *(const char *)char2);

}

/*****************************************************************************
*                                                                            *
*  -------------------------------- h_char(哈希函数) -----------------------  *
*                                                                            *
*****************************************************************************/

static int h_char(const void *key) {

    return *(const char *)key % TBLSIZ;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文