【发布时间】:2022-11-16 03:54:48
【问题描述】:
我正在尝试创建函数以从单链表中删除所有值小于下一个(后续)元素值的元素。出于某种原因,程序抛出“free():在 tcache 2 中检测到双重释放”。我的功能有什么问题? 列表不为空。
#include <iostream>
using namespace std;
struct Elem
{
int num;
Elem* next;
};
void deleteFromLinkedList(Elem* list) {
Elem* curr, * next, *prev;
curr = list;
next = list->next;
prev = NULL;
while (next != NULL)
{
if (curr->num < next->num) {
prev->next=next;
delete curr;
curr = prev;
continue;
}
prev = curr;
curr = next;
next = curr->next;
};
}
void printLinkedList(Elem* first) {
Elem* p;
for (p = first; p != NULL; p = p->next)
{
cout << p->num << " ";
};
cout << endl;
}
int main()
{
Elem* first = NULL, * last = NULL, * p;
int i;
cout << "Enter number any number, 0 to finish";
cin >> i;
while (i != 0)
{
p = new Elem;
p->num = i;
p->next = NULL;
if (first == NULL)
{
first = last = p;
}
else
{
last->next = p;
last = last->next;
};
cout << "Enter number any number, 0 to finish";
cin >> i;
};
printLinkedList(first);
deleteFromLinkedList(first);
printLinkedList(first);
}
【问题讨论】:
-
示例:删除前:15,12,11,7,9,5,2,3 删除后:15,12,11,9,5,3
-
请出示 minimal reproducible example - 您的错误可能已经从其他地方开始
-
可能意味着您尝试删除同一个节点超过 1 次。
-
void deleteFromLinkedList(Elem* list) {问题 #1 是按值而不是按引用将指针传递给头节点。这意味着即使 deleteFromLinkedList() 已正确实现,您也永远无法更新指向头node的指针。 -
调试器。使用带笔和纸的调试器。在使用调试器遍历树时,使用笔和纸绘制节点和链接。
标签: c++ memory singly-linked-list alloc