我正在尝试实施 基本 哈希表。我使用链表来解决冲突。
我的获取和设置方法给我带来了一些麻烦,而且我不确定问题是什么。我相信我正确地重载了运营商。我认为当我附加到链接列表时会出现问题。
class HashTable {
struct Node{
int key;
int value;
Node *next;
};
Node **table;
int hash_func(int key) const {
return key % TABLE_SIZE;
}
public:
HashTable() {
table = new Node*[TABLE_SIZE]();
for (int i = 0; i < TABLE_SIZE; ++i)
table[i] = nullptr;
}
int& operator[](int const key) {
int h_key = hash_func(key);
while(table[h_key]) {
table[h_key] = table[h_key]->next;
}
table[h_key] = new Node;
table[h_key]->key = key;
table[h_key]->next = table[h_key];
return table[h_key]->value;
}
int operator[](int const key) const {
int h_key = hash_func(key);
while (table[h_key]) {
if (table[h_key]->key == key) {
return table[h_key]->value;
}
table[h_key] = table[h_key]->next;
}
return 0;
}
};
答案 0 :(得分:3)
您的问题是,您在获取和设置方法中的while
循环中覆盖数据。
执行table[h_key] = table[h_key]->next;
时,永久丢失最初存储在h_key
位置的内容。而是使用占位符,如下所示:
Node * curr = table[h_key];
while (curr->next)
{
curr = curr->next;
}
Node * new_node = new Node;
new_node->key = key;
curr->next = new_node;
你的get方法遇到了类似的问题。
答案 1 :(得分:2)
在你的setter中,你想在最后插入一个新元素。所以首先你会发现这样的结局:
while(table[h_key]) {
table[h_key] = table[h_key]->next;
}
然后,你设置:
table[h_key]->next = table[h_key];
相反,您必须设置:
table[h_key]->next = nullptr;
否则,您在循环中的条件不起作用。
考虑一下@ bpachev答案补遗的答案。我的代码只使用错误的代码说明了问题,而不是一个简单的解决方案。
答案 2 :(得分:0)
我同意bpachev。因为这是C ++,所以你应该考虑使用这样的模板(去除杂乱和重用)。使用模板类的开销很小,此过程在编译期间完成。