使用双指针头节点c ++初始化链表

时间:2016-10-05 23:14:34

标签: c++ struct linked-list segmentation-fault double-pointer

我不太清楚为什么这段代码不会创建一个包含5个节点的链表,每个节点都包含一个整数值。我目前正在收到段错误,并对发生错误的行进行了评论。任何帮助将不胜感激,谢谢。

struct node{
    int val;
    node * next;
}

int main(){
    node ** head;

    for(int i = 0; i < 5; i++){
        node * temp = new node;
        temp->val = i;

        (*head)->next = temp; //segfault here
    }
}

4 个答案:

答案 0 :(得分:1)

head不需要是指向指针的指针。它可以只是指向另一个node的指针,它始终是链接列表中的第一个nodehead也应初始化为null

答案 1 :(得分:1)

在您的代码中,head是一个双指针。 head指向的指针没有构造对象,可能是null,因此您的分段错误。

我建议您保留head一个简单的指针,而不是双指针,因为这是不必要的。

答案 2 :(得分:0)

尝试这个,它应该工作。你仍然需要编写代码来分配内存。

struct node{
   int val;
   node * next;
};

int main(){
   node * head = new node();
   head->val = 999;
   node *curr=head;

   for(int i = 0; i < 5; i++) {
      node* temp = new node();
      temp->val = i;
      cout << "adding node " << i << endl;
      curr->next = temp; //segfault here
      curr = curr->next;
   }
   return 0;
}

答案 3 :(得分:0)

你尝试在程序中使用“node ** head”做的第一件事是取消引用它,假设head是未初始化值的指针,如果你试图触摸任何数据,很可能会破坏你的程序那个位置。正确的做法是在尝试下一步之前设置* head = temp。

此外,您不需要使用双指针初始化列表,以便稍后利用双指针插入算法。你总能说 节点** head_pp =&amp; head并从那里开始。

现在,您的代码看起来像这样。

节点**头 (存储未经初始化的任何内容)

*头
(未初始化的记忆)

(*头) - &gt;接着 (尝试触摸未初始化的内存地址,操作系统杀死程序)

应该注意的是,在大多数情况下,您将收到段错误,因为大多数uninit内存保持0。最终你会看到访问冲突,但