c ++链表删除功能留下了一个漏洞

时间:2015-12-03 01:44:08

标签: c++ linked-list runtime

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

让我们说第三项是删除的那一项,它会像这样输出到屏幕: 第1项(显示) ITEM2(示出) 然后它崩溃了

所以看起来,至少对我而言,当我使用我的删除功能时,它会在链表中留下某种“漏洞”。

当我从链接列表中删除时,它唯一没有崩溃的地方是头部,但由于某些奇怪的原因,之后只剩下一个项目留在链表中。

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

//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++;

    }

 }

1 个答案:

答案 0 :(得分:2)

在此代码中:

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

}

你有一个额外的

    previousNode = nodePtr;

这意味着您实际上只是设置nodePtr->next = nodePtr->next,它什么都不做。

只需删除该行。