在 C++ 双向链表插入函数中出现段错误

Getting a seg fault in C++ doubly linked list insert function

我正在为我的 C++ class 编写一个双向链表,但在使用插入函数时遇到了问题。这个想法是将一个值插入到正确位置的排序列表中(即,在较小的数字之后,较高的数字之前)。该函数的工作原理是它将数字插入正确的位置,但是当我尝试分配指针以考虑新节点时出现段错误。具体线路为:

nodePtr->previous = newNode;

我在其他地方使用相同的语法从 nodePtr 分配指针没有问题,所以我不明白为什么这里会出现段错误。

在此先感谢您的帮助。

编辑:在将 nodePtr 设置为 nullptr 后尝试访问前一个指针似乎出现了问题。手动处理案例之前的 if 语句检查。

来自.h:

struct ListNode {
    double value;
    struct ListNode *next;
    struct ListNode *previous;
};

ListNode *head;

来自.cpp:

void NumberList::insertNode(double num)
{
ListNode *newNode;
ListNode *nodePtr;
ListNode *previousNode;
newNode = new ListNode;
newNode->value = num;

if(!head)
{
    head = newNode;
    newNode->next = nullptr;
}
else
{
    nodePtr = head;
    previousNode = nullptr;
    while (nodePtr != nullptr && nodePtr->value < num)
    {
        previousNode = nodePtr;
        nodePtr = nodePtr->next;
        if (nodePtr != nullptr)
            nodePtr->previous = previousNode;
    }
    if (previousNode == nullptr)
    {
        head = newNode;
        newNode->next = nodePtr;
    }
    else
    {
        nodePtr->previous = newNode;/*This is the line that seg faults.*/
        previousNode->next = newNode;
        newNode->next = nodePtr;
        newNode->previous = previousNode; 
    }
}
}

当您将在列表末尾插入时 nodePtr 将变为 null,然后行

nodePtr->previous = newNode; // seg fault

会导致SEG错误。你必须处理这种情况。

在访问之前检查 nodePtr 是否为 null...

if(nodePtr)
    nodePtr->previous = newNode;

在执行任何这些操作之前,您需要初始化您的 head 指针以指向 nullptr。否则,您将尝试取消引用指向错误内存地址的指针,这会导致分段错误。

初始化head时,试试 ListNode *head = nullptr;