c++链表删除函数留洞
c++ linked list delete function leaving a hole
对于我的最终编程项目,我需要创建一个链表来保存项目,并且它需要能够删除和添加项目。将项目附加到链表工作正常,但是当我删除并尝试显示函数时,程序在到达删除项目曾经驻留的位置时崩溃。
假设第三项被删除,它会像这样输出到屏幕:
Item1(显示)
Item2(图示)
然后崩溃
所以看起来,至少对我来说,当我使用我的删除功能时,它会在链表中留下某种 'hole'。
当我从链表中删除时它唯一不会崩溃的地方是头部,但由于某些奇怪的原因,在那之后链表中只剩下一个项目。
我想知道是否有人可以指出导致此错误的删除函数或显示函数的位置。
//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++;
}
}
在此代码中:
if (nodePtr)
{
previousNode = nodePtr;
previousNode->next = nodePtr->next;
delete nodePtr;
}
你有一个额外的
previousNode = nodePtr;
这意味着您实际上只是在设置 nodePtr->next = nodePtr->next
,它什么都不做。
只需删除该行。
对于我的最终编程项目,我需要创建一个链表来保存项目,并且它需要能够删除和添加项目。将项目附加到链表工作正常,但是当我删除并尝试显示函数时,程序在到达删除项目曾经驻留的位置时崩溃。
假设第三项被删除,它会像这样输出到屏幕: Item1(显示) Item2(图示) 然后崩溃
所以看起来,至少对我来说,当我使用我的删除功能时,它会在链表中留下某种 'hole'。
当我从链表中删除时它唯一不会崩溃的地方是头部,但由于某些奇怪的原因,在那之后链表中只剩下一个项目。
我想知道是否有人可以指出导致此错误的删除函数或显示函数的位置。
//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++;
}
}
在此代码中:
if (nodePtr)
{
previousNode = nodePtr;
previousNode->next = nodePtr->next;
delete nodePtr;
}
你有一个额外的
previousNode = nodePtr;
这意味着您实际上只是在设置 nodePtr->next = nodePtr->next
,它什么都不做。
只需删除该行。