循环双链表 - 分段故障:11

时间:2016-03-30 07:25:37

标签: c++ linked-list segmentation-fault doubly-linked-list

我正在尝试实现循环双向链表,但我一直遇到分段错误: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;
}

任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:1)

查找分段错误的一种方法是在整个代码中使用cout语句并编译和运行它。如果cout语句向控制台输出内容,则分段错误发生在cout语句之后的一行中。继续这样做以缩小范围并定位具有分段错误的线的位置。

答案 1 :(得分:1)

您的代码中存在多个问题,但这是其中之一。

添加第一个元素时,您可以:

USE master 
go 
exec xp_cmdshell 'echo 02/16/2000 | date' 
exec xp_cmdshell 'echo 09:00:00 | time'

所以你让 tail = new DLLNode(a); tail->next = tail; 等于prev(顺便说一句:使用0代替nullptr)。

如果您删除了您执行的元素:

0

BTW:您的删除功能还应该删除 int a = tail->info; tail = tail->prev; // tail becomes 0 tail->next = null; // Dereference 0 cause seg fault return a; !只是改变指针值是不够的。

因此,这会导致3个变化:

1)添加新元素时,请务必始终设置 {/ em> DLLNodenext

2)请务必删除使用新

创建的prev

3)在你的删除功能中你需要一个特殊的案例来检查列表中是否只包含一个元素,即DLLNode