【问题标题】:initialize a linked list with a double pointer head node c++用双指针头节点c ++初始化链表
【发布时间】:2016-10-05 23:14:33
【问题描述】:

我不太清楚为什么这段代码没有创建一个有 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
    }
}

【问题讨论】:

  • 为什么head首先是指向指针的指针?
  • 初始化head 可能是一个好主意,而不是仅仅使用它。取消引用未初始化的指针 = 崩溃。
  • 你认为(*head)会做什么?
  • head 是指向指针的指针,以便稍后创建我的插入函数时方便和高效。 Tadman,你认为在 for 循环之前我应该​​说类似... head = new node;
  • head 本身不需要是双指针。您可能的意思是您希望 head 成为插入主体内的双指针:void insert(node** head, int data),因此您可以简单地将 head 设为 main 内的单指针并传递其地址:insert(&amp;head, x)

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


【解决方案1】:

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

【讨论】:

  • 我的实现一定是这样,有什么想法吗?
  • 你仍然可以使用你的双指针,你只需要在你尝试调用(*head)-&gt;next之前确保head指向某个东西,这就是你的段错误发生的地方。您按原样编写的代码无论如何都不会产生链表,需要进一步检查。
【解决方案2】:

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

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

【讨论】:

  • 感谢 wuoix 的回复,我的实现需要使用双指针,还有其他想法吗?
  • 要考虑的一个问题是,除非您的head 并不总是指向第一个元素,否则您将永远无法正确构造下一个元素而不会丢失您过去创建的元素。
【解决方案3】:

试试这个,应该可以的。您仍然需要编写代码来释放内存。

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;
}

【讨论】:

  • 感谢周克敏的回复 我知道只使用单指针就可以了,但是我的insert函数的实现在效率方面我需要将head初始化为双指针。
  • 你的意思是 head 是一个节点指针数组。您已经在操作没有双指针的指针,这应该非常有效。
【解决方案4】:

您尝试在程序中使用“node **head”做的第一件事是取消引用它,鉴于 head 是一个未初始化值的指针,如果您尝试在那个位置。正确的做法是在尝试进入下一个之前设置 *head = temp。

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

现在,您的代码如下所示。

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

*头
(未初始化的内存)

(*head)->下一个 (试图触摸未初始化的内存地址,操作系统杀死程序)

需要注意的是,在大多数情况下,您会收到 segfault 错误,因为大多数 uninit 内存都包含 0。不过,最终您会看到访问冲突

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多