我正在尝试在C++中实现带有链接列表的插入排序。但是,每当我尝试将指向新节点的指针分配给链接时,都会给出"分段错误(核心转储)"。我已经检查了" (*head)->next = newNode;
"行给出了此错误。
要运行程序,请编译程序并输入,请在insertionSort
开始之前复制注释中的两行。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Node
{
public:
int num;
Node *prev;
Node *next;
Node(int input);
};
Node::Node(int input)
{
num = input;
prev = NULL;
next = NULL;
}
/*
5 2
1 5 3 4 2
*/
void insertionSort(Node **head, int newInput)
{
Node* newNode = new Node(newInput);
if (*head == NULL)
{
*head = newNode;
}
else
{
Node *itr = *head;
if (itr->num >= newInput)
{
newNode->next = itr->next;
itr->prev = newNode;
*head = itr;
}
else
{
Node *itr = (*head)->next;
while (itr != NULL)
{
if (itr->num >= newInput)
{
newNode->prev = itr->prev;
newNode->next = itr;
itr->prev = newNode;
newNode->prev->next = newNode;
newNode = NULL;
}
itr = itr->next;
}
if (newNode != NULL)
{
if (itr == NULL) {
(*head)->next = newNode;
}
else
itr->next = newNode;
}
}
}
}
void printList(Node *head)
{
Node *itr = head;
while (itr != NULL)
{
cout << itr->num << " ";
itr = itr->next;
}
cout << endl;
}
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int n, k;
cin >> n >> k;
Node *head = NULL;
int num, i = -1;
while (++i < n)
{
cin >> num;
insertionSort(&head, num);
}
printList(head);
return 0;
}
尝试更改
itr->prev = newNode;
自
newNode->prev = newNode;
我正在运行您的代码,并收到写入访问冲突。"newNode->prev was nullptr"
您似乎在第 53 行混淆了变量:
newNode->prev->next = newNode;
应该是:
its->prev->next = newNode;
并且必须在覆盖其>prev之前执行它。但是代码仍然没有按照您想要的方式运行。你已经付出了更多的努力。在 while-loop 中,将 newNode 设置为 NULL,然后重申。
你真的应该注释你的代码。当你描述你正在做的事情时,你会更好地理解自己的错误。
顺便问一下,你有没有注意到你屏蔽了第 36 行第 45 行的Node* itr
? 您可以重用现有对象,因为您不再使用它。