分配指向链接列表节点的指针会引发"分段错误"

时间:2017-01-24 12:37:36

标签: c++ linked-list 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;
}

2 个答案:

答案 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?你可以重用现有的对象,因为你不再使用它了。