2016-03-30 53 views
0

我试图实现一个循环双向链表,但我不断收到一个分段错误:11错误(我相信这是因为添加和删除功能)。我不知道我的代码是否接近,但我无法通过这个错误来正确地测试它。这是我的,我相信是所涉及的代码:圆形双链表 - 分段错误: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; 
} 

任何帮助将是非常美妙的,谢谢。

+3

如果发生崩溃(如分段错误),则应该在调试器中运行以捕捉“正在运行”的崩溃。这将导致调试器停在崩溃位置,并让您检查变量值和函数调用堆栈。如果调试器没有停在你的代码上,那么就直接调用堆栈直到你的代码。 –

+3

'p->!= tail'不会编译,请发布您的真实代码。 –

+1

请按照发布准则提取最简单的示例。它应该可以帮助你专注于这个问题。也就是说,你打破了所谓的三定律(或者C++中的五定律)。 –

回答

1

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

1

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

当您添加的第一个元素,你这样做:

tail = new DLLNode(a); 
    tail->next = tail; 

所以你离开prev等于0(BTW:使用nullptr代替0)。

如果然后删除元素你这样做:

int a = tail->info; 
    tail = tail->prev; // tail becomes 0 
    tail->next = null; // Dereference 0 cause seg fault 
    return a; 

BTW:你的删除功能也应该删除DLLNode!只改变指针值是不够的。

所以这导致了三个变化:

1)当添加新元素确保始终设置nextprev

2)记住要删除与新

创建DLLNode 3)在你的删除功能中,你需要一个特殊的情况来检查列表是否只包含一个元素,即if (tail == tail->next) { .. delete last element .. set tail equal nullptr}