我在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'分配吗? –