在C ++双向链表插入函数

时间:2017-04-30 20:15:14

标签: c++ pointers segmentation-fault doubly-linked-list

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

nodePtr->previous = newNode;

我使用相同的语法从nodePtr中指定其他位置的指针没有问题,所以我无法理解为什么这里出现seg错误。

提前感谢您的帮助。

编辑:在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; 
    }
}
}

2 个答案:

答案 0 :(得分:0)

如果您要在列表末尾插入nodePtr,则会null,然后行

nodePtr->previous = newNode; // seg fault

会导致SEG故障。你必须处理这种情况。

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

if(nodePtr)
    nodePtr->previous = newNode;

答案 1 :(得分:0)

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

初始化头部时,请尝试 ListNode *head = nullptr;