我正在为我的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;
}
}
}
答案 0 :(得分:0)
如果您要在列表末尾插入nodePtr
,则会null
,然后行
nodePtr->previous = newNode; // seg fault
会导致SEG故障。你必须处理这种情况。
在访问之前检查nodePtr
是否为null
...
if(nodePtr)
nodePtr->previous = newNode;
答案 1 :(得分:0)
在执行任何这些操作之前,您需要将头部指针初始化为指向nullptr。否则,您尝试取消引用指向错误内存地址的指针,这会导致分段错误。
初始化头部时,请尝试
ListNode *head = nullptr;