2017-04-30 29 views
-4

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

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

没有哪我看你初始化任何指针:他们不默认为NULL开始,也不会指向可重用的对象默认情况下。 –

+0

我试图初始化nodePtr->之前的nullptr,但seg故障仍然发生,所以我删除它。 –

+2

关于其他指针的帽子? 'head','next','previous'和'nodePtr'?所有这些应该被初始化为nullptr。使用调试器浏览代码,并在给出正确的值之前查看正在使用哪些内容。 –

回答

0

当你将在列表nodePtr年底将成为null,然后行

nodePtr->previous = newNode; // seg fault 

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

检查nodePtrnull或不访问之前...

if(nodePtr) 
    nodePtr->previous = newNode; 
+1

这解决了我的问题,非常感谢。 –

0

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

当初始化头,尝试 ListNode *head = nullptr;

+0

'head'已经初始化为'newNode'!这不是问题 –

+0

虽然看起来'头部'具有静态存储持续时间。当程序启动时它将被初始化为零。 –

+0

'if(!head) { head = newNode; newNode-> next = nullptr; }'在这里处理该案件 –