将指针分配给链接列表节点会引发"Segmentation Fault"



我正在尝试在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? 您可以重用现有对象,因为您不再使用它。

相关内容

  • 没有找到相关文章

最新更新