-2

出于某种原因,我从列表中间删除节点的功能是删除第一个节点而不是用户指定的节点。这是我的功能:

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--;
}

谁能帮我指出正确的方向?

4

3 回答 3

1

我假设这是因为:

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

应该检查和修改tempPtr,不是firstPtr

由于您不检查 by tempPtr,因此您的函数调用

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

tempPtr最初设置为firstPtr之后从未修改过。

当然,您可以通过调试一下轻松发现这一点,因此我不会为您更正代码,但这是一个很好的起点。

于 2012-07-30T01:43:43.710 回答
0

我不知道这lastPtr是为了什么,但问题是您正在通过更改firstPtr而不是tempPtr. 然后你 delete tempPtr,但这仍然指向列表的头部。

于 2012-07-30T01:45:32.083 回答
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;
             }      
    } 
于 2012-07-31T09:45:44.923 回答