2017-02-26 71 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

請閱讀我上面的評論 –