2013-01-24 216 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 
    }