对于我的最终编程项目,我需要创建一个链接列表来保存项目,它需要能够删除和添加项目。将项目附加到链接列表工作正常,但是当我删除并尝试显示该功能时,程序在到达已删除项目曾经驻留的位置时崩溃。
让我们说第三项是删除的那一项,它会像这样输出到屏幕: 第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++;
}
}
答案 0 :(得分:2)
在此代码中:
if (nodePtr)
{
previousNode = nodePtr;
previousNode->next = nodePtr->next;
delete nodePtr;
}
你有一个额外的
previousNode = nodePtr;
这意味着您实际上只是设置nodePtr->next = nodePtr->next
,它什么都不做。
只需删除该行。