2017-01-24 7 views
-2

Я пытаюсь реализовать сортировку вставки в списке ссылок на C++. Но всякий раз, когда я пытаюсь назначить указатель на новый узел на ссылку, он дает «segmentation fault (core dumped)». Я проверил строку «(*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; 
} 
+3

Вы пытались выполнить свой код с помощью отладчика, наблюдая за значениями переменных? –

+0

Пожалуйста, удалите вход и используйте жестко закодированные значения, которые воспроизводят проблему. Не полагайтесь на людей, чтобы угадать, что вы сделали, когда это произошло. – molbdnilo

ответ

0

Попробуйте изменить

 

    itr->prev = newNode; 

в

 

    newNode->prev = newNode; 

0

Я бегу код и получить нарушение доступа записи. "NewNode-> пред был nullptr"

Вы, казалось, получили ваши переменные замешан в строке 53:

newNode->prev->next = newNode; 

должно быть:

its->prev->next = newNode; 

И он должен быть выполнен до its-> prev перезаписывается. Но тогда код все еще не работает, как вы этого хотите. Вы вложили в это еще несколько усилий. Внутри цикла while вы устанавливаете newNode в NULL, а затем повторяете.

И вы должны действительно прокомментировать свой код. Вы лучше понимаете свои собственные ошибки, когда описываете, что делаете.

Кстати, вы заметили, что вы маскируете Node* itr из строки 36 по строке 45? вы можете просто повторно использовать существующий объект, поскольку вы его больше не используете.