首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环双向链表-分段故障: 11

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

Stack Overflow用户
提问于 2016-03-30 15:25:37
回答 2查看 186关注 0票数 0

我正在尝试实现一个循环双向链表,但我一直收到一个分段错误: 11错误(我相信这是因为添加和删除函数)。我不知道我的代码是否接近,但我无法通过这个错误来正确测试它。这是我所拥有的代码,我相信它涉及到:

(Circular_DLList.cc)

代码语言:javascript
复制
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;
}

任何帮助都是很棒的,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-03-30 15:35:51

发现分段错误的一种方法是在整个代码中使用cout语句,并编译和运行它。如果cout语句将某些内容打印到控制台,则分段错误发生在cout语句之后的一行中。继续这样做,以缩小范围并定位具有分段故障的线路。

票数 1
EN

Stack Overflow用户

发布于 2016-03-30 15:39:39

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

添加第一个元素时,请执行以下操作:

代码语言:javascript
复制
    tail = new DLLNode(a);
    tail->next = tail;

因此,您将prev保留为等于0 (顺便说一下:使用nullptr而不是0)。

如果随后删除该元素,则会执行以下操作:

代码语言:javascript
复制
    int a = tail->info;
    tail = tail->prev;  // tail becomes 0
    tail->next = null;  // Dereference 0 cause seg fault
    return a;

顺便说一句:你的删除功能也应该删除DLLNode!仅仅改变指针值是不够的。

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

1)添加新元素时,请确保同时设置nextprev

2)记得删除新建的DLLNode

3)在delete函数中,您需要一个特殊的用例来检查列表是否只包含一个元素,即if (tail == tail->next) { .. delete last element .. set tail equal nullptr}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36302247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档