我在removeElement()函数中遇到了分段错误。 _buckets是 一个HashTableVoidEntry指针数组。该项目应该实施 一个存储名称的简单哈希表。
GDB告诉我,这个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)
我发现此代码没有任何问题,但您是否可能不小心对项目进行两次哈希处理?
顺便说一句,你不需要else if
子句,因为它与else
子句基本相同。