2017-01-24 6 views
-2

C++でリンクリストを使用して挿入ソートを実装しようとしています。しかし、新しいノードへのポインタをリンクに割り当てるときはいつでも、 "segmentation fault(core dumped)"と表示されます。私はこのエラーを与える "(*head)->next = newNode;"行を確認しました。リンクリストノードにポインタを割り当てると、 "セグメンテーションフォールト"が発生する

プログラムをコンパイルして実行するには、入力のために、開始の前にコメント内の2行を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

私はあなたのコードを実行すると、書き込みアクセス違反を取得しています

 

    newNode->prev = newNode; 

0

 

    itr->prev = newNode; 

を変更してみてください。

newNode->prev->next = newNode; 

は次のようになります:

its->prev->next = newNode; 

そして、それは> its-前に実行する必要がありますあなたは53行に巻き込まあなたの変数を得たように見えた

"newNode->前はnullptrでした" prevは上書きされます。しかし、コードはあなたが望むように機能していません。あなたはそれにもっと力を入れています。 whileループ内では、newNodeをNULLに設定してから繰り返します。

あなたは本当にあなたのコードをコメントする必要があります。あなたは、あなたがしていることを説明するとき、自分の間違いをよく理解します。

ところで、ライン45のNode* itrを36行目にマスクすることに気付きましたか?既存のオブジェクトをもう使用しないので、既存のオブジェクトを再利用できます。

関連する問題