《算法解析:C语言描述》中关于哈希表实现的疑问
在此书中实现的哈希表算法中,无法插入大于一个字节的整数(如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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论