C++ 循环双链表-分段错误:11

C++ 循环双链表-分段错误:11,c++,linked-list,segmentation-fault,doubly-linked-list,C++,Linked List,Segmentation Fault,Doubly Linked List,我试图实现一个循环的双链表,但我一直得到一个分段错误:11错误(我相信这是因为添加和删除函数)。我不知道我的代码是否很接近,但我无法通过这个错误来正确地测试它。这是我所掌握的代码,我相信其中包括: (通告) 任何帮助都会很棒,谢谢 查找分段错误的一种方法是在代码中使用cout语句并编译和运行它。如果cout语句将某些内容打印到控制台,则分段错误发生在cout语句之后的一行中。继续这样做可以缩小范围并找到分段错误所在的行。找到分段错误的一种方法是在代码中使用cout语句,并编译和运行它。如果cou

我试图实现一个循环的双链表,但我一直得到一个分段错误:11错误(我相信这是因为添加和删除函数)。我不知道我的代码是否很接近,但我无法通过这个错误来正确地测试它。这是我所掌握的代码,我相信其中包括:

(通告)


任何帮助都会很棒,谢谢

查找分段错误的一种方法是在代码中使用cout语句并编译和运行它。如果cout语句将某些内容打印到控制台,则分段错误发生在cout语句之后的一行中。继续这样做可以缩小范围并找到分段错误所在的行。

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

代码中存在不止一个问题,但这里是其中之一

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

    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}

您的代码中有多个问题,但这里是其中之一

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

    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函数中,您需要一个特殊情况来检查列表是否只包含一个元素,即
如果(tail==tail->next){..delete last element..set tail equal nullptr}

如果出现崩溃(如分段错误),则应在调试器中运行以捕获“正在运行”的崩溃。这将导致调试器在崩溃位置停止,并允许您检查变量值和函数调用堆栈。如果调试器没有在代码处停止,则继续调用堆栈,直到到达代码。
p->!=tail
无法编译,请发布您的真实代码。请根据发布指南提取一个最小的示例。它会帮助你集中精力解决问题。也就是说,您已经打破了所谓的三定律(或C++11中的五定律)
从尾部删除
编译。真实代码:没有替代品。如果出现崩溃(如分段错误),则应在调试器中运行以捕获“正在运行”的崩溃。这将导致调试器在崩溃位置停止,并允许您检查变量值和函数调用堆栈。如果调试器没有在代码处停止,则继续调用堆栈,直到到达代码。
p->!=tail
无法编译,请发布您的真实代码。请根据发布指南提取一个最小的示例。它会帮助你集中精力解决问题。也就是说,您已经打破了所谓的三定律(或C++11中的五定律)
从尾部删除
编译。真实代码:没有替代品。