2013-01-24 219 views
4

我创建了一个哈希表,我想从链接列表中删除一个节点。该代码适用于删除第一个节点,但不适用于删除其他节点。删除链接列表中的节点

void intHashTable::remove(int num){ 
int location = ((unsigned)num) % size; 
Node * runner = table[location]; 
int checker; 

if(runner->next == NULL){ 
    if(num == table[location]->num){ 
     table[location] = NULL; 
    } 
}else{ 
    if(table[location]->num == num){ 
     table[location] = table[location]->next; 
    }else{ 
     //This part doesn't seem to be working. 
     Node *temp = runner->next; 
     while(temp != NULL){ 
      if(temp->num == num){ 
       runner->next = temp->next; 
       delete(temp); 
       break; 
      } 
     } 
    } 
} 

}

+0

但是你试过了吗?你发现了什么?要求无偿支持时请付出一些努力。 –

+0

@phresnel我不要求无偿支持。我的代码在那里 - 这是我的努力。 – user1965283

+0

那么,你已经尝试过什么?你发现了什么? “它行不通”显示没有问题。它不会编译?它是否会因异常而崩溃?你有无限循环吗?你的内存不足吗?调试器说什么?仅举几个例子。 –

回答

2

您还没有更新temp指向循环中的下一个项目:

temp = temp->next; 

也似乎代表与您的表NULL指针的空行,但在代码中不能正确处理这种情况 - 如果runnerNULL,那么当您尝试在第一次检查中访问runner->next时,就会崩溃。另外,在某些情况下,您无法删除节点。

要解决这些问题,您可以更新您的代码是这样的:

void intHashTable::remove(int num) 
{ 
    int location = ((unsigned)num) % size; 
    Node * runner = table[location]; 

    if (runner != NULL) { 
     if (runner->num == num) { 
      delete runner; 
      table[location] = NULL; 
     } else { 
      while (runner->next != NULL) { 
       if (runner->next->num == num) { 
        Node *temp = runner->next; 
        runner->next = runner->next->next; 
        delete temp; 
        break; 
       } 
       runner = runner->next; 
      } 
     } 
    } 
} 

另外请注意,我从delete,这是一个C++的关键字,而不是一个功能去掉括号。

如果你使用双向链表(即先前指针和下一个指针),那么你可以简化这个代码一点,虽然对于像散列表这样的东西,你只倾向于在一个方向上迭代它是可能不值得花费额外的指针(64位系统上的每个项目多出8个字节)。

+0

他在删除后跳出循环。 –

+1

还有'runner = temp'在你的线路之前。虽然通常情况下,不是用'temp'超前,我认为这是为了记住'prev'(但它应该以任何方式工作)。 – jimhark

+0

这不行。当前指针更新必须在'if'之外完成 – Rost

1

你没有更新的内部循环temprunner变量:

while(temp != NULL) 
    { 
     if(temp->num == num) 
     { 
      runner->next = temp->next; 
      delete temp; 
      break; 
     } 
     runner = temp;  // Keep previous element to change its next pointer when num found 
     temp = temp->next; // Advance current pointer to next element 
    }