2012-07-30 82 views
-2

由於某種原因,我從列表中間刪除節點的功能是刪除第一個節點,而不是用戶指定的節點。這裏是我的功能:C++從列表中部刪除節點

template< class NODETYPE > 
bool List<NODETYPE>::removeMiddle(NODETYPE &value, int i) 
{ 
    ListNode <NODETYPE> * tempPtr = firstPtr; 
    int counter=1; 

    if (isEmpty()) 
     return false; 
    if (i <= 0) 
     return false; 

    while (tempPtr != 0 && counter < i){ 
     counter++; 
     if (firstPtr == lastPtr) 
      firstPtr = lastPtr = 0; 
     else 
      firstPtr = firstPtr->nextPtr; 

     if (counter == i){ 
      value = tempPtr->data; // data being removed 
      delete tempPtr; 
     } 

    } 

    return true; 
    RecordCounter--; 
} 

任何人都可以幫助指向正確的方向嗎?

回答

1

我猜想這是因爲這樣的:

if (firstPtr == lastPtr) 
    firstPtr = lastPtr = 0; 
else 
    firstPtr = firstPtr->nextPtr; 

應檢查並修改tempPtr,不firstPtr

既然你不通過tempPtr檢查,你的函數調用

if (counter == i){ 
    value = tempPtr->data; // data being removed 
    delete tempPtr; 
} 

tempPtr最初設定在firstPtr,之後不會被修改。

當然,您可以通過調試一下輕易地發現這一點,所以我不會爲您更正代碼,但這是一個很好的起點。

+0

謝謝,我不能相信我錯過了。我現在可以通過列表正確迭代,但由於某種原因,我的代碼並未刪除特定的節點。 – 2012-07-30 01:50:43

0

我不知道lastPtr是爲了什麼,但問題是,您正在通過更改firstPtr而不是tempPtr進行迭代。然後刪除tempPtr,但仍然指向列表的頭部。

0

這是因爲您已分配tempPtr = firstPtr而不是遞增tempPtr,您正在遞增firstPtr

請檢查以下代碼。

while (tempPtr != 0 && counter < i) 
    { 
      counter++; 
      if (firstPtr == lastPtr) 
       firstPtr = lastPtr = 0; 
      else 
       tempPtr = tempPtr->nextPtr; // Here tempPtr should be incremented not firstPtr 

      if (counter == i) 
      { 
       value = tempPtr->data; // data being removed 
       delete tempPtr; 
      }  
    }