C++从列表中删除节点

C++ Delete Node From Middle of List

本文关键字:删除 节点 列表 C++      更新时间:2023-10-16

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

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

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

我假设这是因为:

 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,之后再也没有修改过。

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

我不知道

lastPtr是做什么用的,但问题是你是通过改变firstPtr而不是tempPtr来迭代的。 然后删除tempPtr,但这仍然指向列表的头部。

这是因为您分配了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;
             }      
    }