C ++链接列表分段错误

时间:2011-09-16 21:49:23

标签: c++ c

我在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;
    }
}

1 个答案:

答案 0 :(得分:0)

我发现此代码没有任何问题,但您是否可能不小心对项目进行两次哈希处理?

顺便说一句,你不需要else if子句,因为它与else子句基本相同。