c ++链表指针分段故障

时间:2017-08-20 16:37:13

标签: c++ pointers struct segmentation-fault

当程序到达addnode()函数时,我收到下面代码的分段错误。所以我不知道其他地方是否会出现任何问题,因为流程没有进展

<form method="POST" action="">
  {% csrf_token %}
  {{ form.as_p }}
</form>
<button type="submit">Save</button>

不允许使用类。我想要&#39; head&#39;在除destroytree()之外的所有情况下指向列表的开头。要将节点添加到列表末尾,请从“头部”开始。继续前进到下一步是NULL。要销毁树,请打印第一个元素然后将其删除。打印下一个元素并将其删除,直到node-&gt; next为NULL

3 个答案:

答案 0 :(得分:1)

问题在这里

head=new node;
head=NULL;        // Remove this line

new分配的内存分配给head后,用null覆盖它并尝试取消引用它。

此外,您还可以取消引用NULL指针

if(trav==NULL)
{
    trav->value=no;
    trav->next=NULL;
    return;
}

由于它是多余的,您应该删除它并使用以下

n->value=no;
n->next=NULL;
n = (trav != NULL ? trav->next : head);

nullptr属于指针类型,而NULL倾向于为整数,因此请C++11及更高版本使用nullptr

答案 1 :(得分:1)

您正在取消引用一个没有意义的空指针。 你也在重复自己的代码,所以也许你没有考虑你正在做什么。

if(trav==NULL)
{
    trav->value=no;
    trav->next=NULL;
    return;
}
n->value=no;
n->next=NULL;
trav->next=n;

除了将值分配给节点之外,您要做的就是将新节点放入列表的末尾。如果你没有通过遍历列表找到它,那是因为列表是空的,所以列表的末尾是头部。

n->value=no;
n->next=NULL;
(trav != NULL ? trav->next : head) = n;

答案 2 :(得分:0)

Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program

您正尝试取消引用空指针 删除该段代码,并将以下内容添加到addnode的开头:

if(trav==NULL)
{
    trav->value=no;
    trav->next=NULL;
    return;
}

这也允许您从if(head == NULL) { head = new node; head->value = no; head->next = NULL; return; } 循环条件中删除trav == NULL

另请注意,主要是

while

因此,您正在为节点分配内存,然后您将丢弃您对该内存地址的唯一引用 您应该删除其中的第一个,并且可以将头部的分配替换为头部的定义(读取head=new node; head=NULL; 的行,将其替换为NULL

最后,如果您有符合c ++ 11标准的编译器,请使用node *head;代替node *head = NULL;