2012-07-30 81 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; 
      }  
    }