2011-09-16 45 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