我正在尝试实现一个循环双向链表,但我一直收到一个分段错误: 11错误(我相信这是因为添加和删除函数)。我不知道我的代码是否接近,但我无法通过这个错误来正确测试它。这是我所拥有的代码,我相信它涉及到:
(Circular_DLList.cc)
void Circular_DLList::add_to_tail(int a)
{
if (is_empty()) {
tail = new DLLNode(a);
tail->next = tail;
}
else {
tail->next = new DLLNode(a, tail->next);
}
}
int Circular_DLList::delete_from_tail()
{
if(!is_empty())
{
int a = tail->info;
tail = tail->prev;
tail->next = null;
return a;
}
else
{
tail = 0;
}
return a;
}任何帮助都是很棒的,谢谢。
发布于 2016-03-30 15:35:51
发现分段错误的一种方法是在整个代码中使用cout语句,并编译和运行它。如果cout语句将某些内容打印到控制台,则分段错误发生在cout语句之后的一行中。继续这样做,以缩小范围并定位具有分段故障的线路。
发布于 2016-03-30 15:39:39
您的代码中存在多个问题,但以下是其中之一。
添加第一个元素时,请执行以下操作:
tail = new DLLNode(a);
tail->next = tail;因此,您将prev保留为等于0 (顺便说一下:使用nullptr而不是0)。
如果随后删除该元素,则会执行以下操作:
int a = tail->info;
tail = tail->prev; // tail becomes 0
tail->next = null; // Dereference 0 cause seg fault
return a;顺便说一句:你的删除功能也应该删除DLLNode!仅仅改变指针值是不够的。
因此,这导致了3个变化:
1)添加新元素时,请确保同时设置next和prev
2)记得删除新建的DLLNode
3)在delete函数中,您需要一个特殊的用例来检查列表是否只包含一个元素,即if (tail == tail->next) { .. delete last element .. set tail equal nullptr}
https://stackoverflow.com/questions/36302247
复制相似问题