在 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;
我正在为我的 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;