【发布时间】:2020-10-07 16:03:00
【问题描述】:
当 'class LL' ~LL() 的析构函数被这个循环单链表调用时,程序崩溃而不是释放指针的堆空间。我该如何解决这个问题?
class Node {
public:
int data;
Node *next;
};
class LL {
private:
Node *head, *tail;
public:
LL() {
head = NULL;
tail = NULL;
}
// destructor
~LL() {
Node *p = head;
while (p->next != head) {
p = p->next;
}
while (p != head) {
p->next = head->next;
delete head;
head = p->next;
}
if (p == head) {
delete head;
head = nullptr;
}
}
// circular singly Linked list
void createLL() {
int n, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
Node *t = new Node;
t->data = x;
t->next = NULL;
if (head == NULL) {
head = tail = t;
} else {
tail->next = t;
tail = t;
}
}
tail->next = head;
}
【问题讨论】:
-
尝试在调试器中运行您的程序并逐行执行您的代码。错误信息是什么?崩溃后的堆栈跟踪是什么?
-
也画图。没有什么能像图片一样帮助可视化链接列表中应该发生的事情。然后,在使用调试器单步执行时,这些图片将作为您的预期。一旦你发现程序在做你没有画的事情,你就发现了一个错误。
-
首先,如果列表是循环的,则不需要
head- 如果两者都存在,则它总是head == tail->next,否则两者都是NULL。 -
@MooingDuck append 需要尾指针才能不扫描整个列表。
-
@CiaPan 不,不是。该列表是循环的。您使用以下之一:头部、尾部或哨兵。您不需要超过一个。
标签: c++ linked-list destructor