我试图在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;
}
答案 0 :(得分:0)
尝试更改
itr->prev = newNode;
到
newNode->prev = newNode;
答案 1 :(得分:0)
我正在运行您的代码,并获得写访问冲突。 “newNode-&gt; prev is nullptr”
你似乎在第53行混淆了你的变量:
newNode->prev->next = newNode;
应该是:
its->prev->next = newNode;
必须在覆盖其&gt; prev之前执行。但是代码仍然无法正常运行。你已经投入了更多精力。在while循环中,将newNode设置为NULL,然后重复。
你应该真的评论你的代码。当你描述自己在做什么时,你会更好地理解自己的错误。
顺便问一下,您是否注意到您从第45行的第36行掩盖了Node* itr
?你可以重用现有的对象,因为你不再使用它了。