C ++从列表中间删除节点

时间:2012-07-30 01:40:57

标签: c++ linked-list

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

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

任何人都可以帮我指出正确的方向吗?

3 个答案:

答案 0 :(得分: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,之后从未修改过。

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

答案 1 :(得分:0)

我不知道lastPtr的用途,但问题是您通过更改firstPtr而不是tempPtr进行迭代。然后删除tempPtr,但仍然指向列表的头部。

答案 2 :(得分: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;
             }      
    }