首页 > 解决方案 > 在 LinkedList 中插入节点会导致分段错误

问题描述

struct Node
{
   int data;
   Node * next;
   Node (int x)
   {
     data=x;
     next=NULL;
   }     
};

Node * insertInSorted(Node * head, int data)
{
    Node* temp = new Node(data);

    if (head == NULL){
       return temp;
    }

   if (data < head->data){
    temp->next = head
    return temp;
   }
    
    Node* curr = head;
    
    while (curr->next->data < data && curr->next != NULL){
        curr = curr->next;
    }

    temp->next = curr->next;
    curr->next = temp;
    return head;
}

嗨,我最近学习了 C++ 并且一直在练习 LinkedList,这个问题很简单,我要做的就是在正确的位置插入一个元素,同时保持排序顺序。我的问题是为什么我会遇到分段错误。我注意到在 while 循环中,如果我将顺序从while (curr->next->data < data && curr->next != NULL)翻转到while (curr->next != NULL && curr->next-> data < data)不会发生分段错误。有人可以帮我理解这个问题吗?

标签: c++data-structureswhile-looplinked-listsingly-linked-list

解决方案


你写它的方式,这个:

curr->next->data < data

在此之前进行评估:

curr->next != NULL

因此,curr->next当您尝试在 中取消引用它时,可以为 NULL curr->next->data,因此您访问内存的一些随机部分并且您会遇到分段错误。

正如您所说,更改顺序可以解决问题,这是正确的解决方案。当AND表达式的第一部分为假时,不会计算第二部分,因此您不会尝试取消引用无效地址,因此您的问题得到解决。


推荐阅读