【问题标题】:c++ linked list delete function leaving a holec++链表删除函数留下一个洞
【发布时间】:2015-12-03 01:44:08
【问题描述】:

对于我的最终编程项目,我需要创建一个链表来保存项目,并且它需要能够删除和添加项目。将项目附加到链表工作正常,但是当我删除并尝试显示该功能时,程序在到达已删除项目所在的位置时崩溃。

假设第三项是被删除的那一项,它会像这样输出到屏幕上: 项目 1(显示) 项目 2(显示) 然后就崩溃了

因此,至少在我看来,当我使用删除功能时,它会在链表中留下某种“洞”。

当我从链表中删除时,它唯一不会崩溃的地方是头部,但出于某种奇怪的原因,之后链表中只剩下一项。

我想知道是否有人可以在我的删除功能或我的显示功能中指出导致此错误的位置。

//sending a number to the function holding the position of the item.

void InventoryList::deleteNode(int num)
{
ListNode *previousNode; //To point to the previous node
ListNode *nodePtr; //to traverse the list


int number = 1;

//if the head is empty do nothing
if (!head)
{
    return;

}
//Determine if the first node is the value
if (1 == num)
{

    nodePtr = head->next;
    delete head;
    head = nodePtr;

}
else
{
    //intialize the node as head.
    nodePtr = head;


    //Skip nodes whose value is not equal to num.
    while (nodePtr != nullptr && number != num)
    {
        previousNode = nodePtr;
        nodePtr = nodePtr->next;

        number++;
    }
    if (nodePtr)
    {
        previousNode = nodePtr;
        previousNode->next = nodePtr->next;
        delete nodePtr;

    }
}

    }


void InventoryList::displayList()
{

int x = 1;
//used to traverse the list
ListNode *nodePtr;

//setting the list equal tot he head
nodePtr = head;

//goes through the list

    while (nodePtr)
    {
        //displaying the list.
        cout << x << nodePtr->value << endl;
        nodePtr = nodePtr->next;
        x++;

    }

 }

【问题讨论】:

    标签: c++ linked-list runtime


    【解决方案1】:

    在这段代码中:

    if (nodePtr)
    {
        previousNode = nodePtr;
        previousNode->next = nodePtr->next;
        delete nodePtr;
    
    }
    

    你有一个额外的

        previousNode = nodePtr;
    

    这意味着你实际上只是在设置nodePtr-&gt;next = nodePtr-&gt;next,它什么都不做。

    只需删除该行。

    【讨论】:

    • 当我删除它时,我收到一条错误消息,指出 previousNode 可能未初始化,并且不会让我的程序运行。但我确实明白为什么这可能会导致我的问题,因为我正在将 previousNode = 设置为 nodePtr,所以我实际上是在让 previouseNode->next 等于它自己,对吗?
    • 编译器抱怨 previousNode 可能未初始化的原因是它认为有一种方法可以通过你的代码而不通过你的循环。正如您已经检查过head 不是nullptrnum 不是1,如果到达它,它将始终至少通过您的循环一次。即便如此,我还是将ListNode *previousNode = nullptr; 放在循环的正上方而不是函数的顶部,并且还要仔细检查它最后是否不是 nullptr。如果稍后有人更改您的代码并且在不进入循环的情况下让路,这将有所帮助
    • 成功了,非常感谢!还要检查它是否为 nullptr,我是否只需执行这样的 if 语句: if(!nodePtr->next=nodeptr)
    • @HaydenGfeller 如果您不能 100% 确定 operator precedence,请加上括号。应该是if(!(nodePtr-&gt;next=nodeptr))
    • 我的意思是使用像if (previousNode != nullptr) 这样的支票。另外,当你的意思是==时,请确保不要使用=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多