2017-02-26 72 views
2

我正在使用由C++中的链接列表表示的数组和存储桶构建哈希表。当我尝试清除哈希表时,我遇到了一些非常奇怪的事情,如果有人能解释为什么会发生这种情况,我将不胜感激。在C++中删除哈希表

此代码工作正常:

for(int i = 0; i < bins; i++) 
{ 
    while(map[i]->next != nullptr) 
    { 
     LN* toDelete = map[i]; 
     map[i] = map[i]->next; 
     delete toDelete; 
    } 
} 

但是由于某种原因,如果我这样做,它不会删除任何东西了:

for(int i = 0; i < bins; i++) 
{ 
    LN* node = map[i] 
    while(node->next != nullptr) 
    { 
     LN* toDelete = node; 
     node = node->next; 
     delete toDelete; 
    } 
} 

每个木桶是由拖车链表的代表为什么我要检查node-> next不是节点。从我对指针的正确理解中,节点应该引用与map[i]相同的东西,所以当我调用节点上的删除时,它应该删除map[i]和节点引用的对象。

谢谢您提前

+1

请[编辑]你的问题提供了[MCVE。 –

+0

我假设你正在做这个散列表作为练习?否则,你应该使用['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map)。 –

+1

您的代码(两个示例)都不会删除* all *节点,它不会删除最后一个节点。 –

回答

3

您的代码确实会删除所有内容。它不会做的是将map[i]指针更改为指向一个空列表元素(next设置为nullptr),因此它最终指向一个已删除的对象。

这意味着map[i]悬挂。解引用它是未定义的行为。这可以通过固定分配map[i]node循环后的值:

LN* node = map[i]; 
while(node->next != nullptr) 
{ 
    LN* toDelete = node; 
    node = node->next; 
    delete toDelete; 
} 
map[i] = node; 
+0

每个桶都由一个拖尾链表来表示,所以如果bucket map中没有值,那么map [i]应该指向一个空节点。我认为我没有清楚的是这个代码没有在析构函数中实现,它被用来清除链表的内容。我的问题是说,节点* =地图[我]是一样的使用地图[我]。出于某种原因,我的问题中的第二块代码没有按预期运行。 –

+0

@KareemAboughazala我编辑了解决这个问题的答案。 – dasblinkenlight

+0

请阅读我上面的评论 –