2011-09-16 192 views
0

我在removeElement()函數中遇到了分段錯誤。 _buckets是 一個HashTableVoidEntry指針數組。這個項目應該實現 一個存儲名稱的簡單哈希表。C++鏈接列表分段錯誤

GDB告訴我,這個else else else else行在removeElement()函數中是崩潰的地方。任何人都可以指出問題 請嗎?我不知道如何解決這個問題。我試圖設置條件到 檢查元素在鏈接列表中的位置。第一個「if」塊告訴我 我想刪除的元素是否在頭部。 「else if」塊告訴我它是否在末尾,else塊是否在列表中的任何其他位置。我仍然 學習鏈表,所以我敢肯定我犯了一個愚蠢的錯誤。

else 
    { 
     prev->_next = e->_next; 
     delete e; 
     return true; 
    } 
EleHashTableVoid::HashTableVoid() 
{ 
    _buckets = (HashTableVoidEntry**)malloc(TableSize * sizeof(HashTableVoidEntry*)); 
    for(int i = 0; i < TableSize; i++) 
    { 
     _buckets[i] = NULL; 
    } 
} 
// Removes an element in the hash table. Return false if key does not exist. 
bool HashTableVoid::removeElement(const char * key) 
{ 
    int h = hash(key); 
    HashTableVoidEntry * e = _buckets[h]; 
    HashTableVoidEntry * prev = NULL; 
    while((e != NULL) && (strcmp(key, e->_key) != 0)) 
    { 
     prev = e; 
     e = e->_next; 
    } 
    if(e != NULL) 
    { 
     if(prev == NULL) 
     { 
      if(e == _buckets[h]) 
      { 
       _buckets[h] = e -> _next; 
       delete e; 
       return true; 
      } 
     } 
     else if(e -> _next == NULL) 
     { 
      prev->_next = NULL; 
      delete e; 
      return true; 
     } 
     else 
     { 
      prev->_next = e->_next; 
      delete e; 
      return true; 
     } 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

它看起來很好,也許數據已被您調用該函數的時間損壞? –

+0

我有一段時間沒有用過C++,但是你有沒有檢查NULL是否被定義?它不需要用於C++ - 最好是與0比較。 – gnometorule

+0

不要侮辱你的智慧,而是每個HashTableVoidEntry對象分別用'new HashTableVoidEntry'分配嗎? –

回答

0

我看到這個代碼沒有問題,但可能你不小心散列一個項目兩次?

順便說一句,您不需要else if子句,因爲它基本上與else子句相同。

+0

我有另一個處理重複的函數。這工作正常,所以我不認爲這是一個問題。 – Chris

+0

你是什麼意思'else if'基本上是'else'? – quasiverse

+2

這兩個代碼塊基本上執行相同的功能。 – Chris