我在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;
}
}
它看起來很好,也許數據已被您調用該函數的時間損壞? –
我有一段時間沒有用過C++,但是你有沒有檢查NULL是否被定義?它不需要用於C++ - 最好是與0比較。 – gnometorule
不要侮辱你的智慧,而是每個HashTableVoidEntry對象分別用'new HashTableVoidEntry'分配嗎? –