2016-09-12 12 views
-1

二重リンクリストに挿入ソートを実行しようとしています。ユーザーが 'P'を入力すると、格納されているソートされた要素が印刷されます。要素は、コードのnLinesで示される行がなくなるまでリストに格納されます。挿入Cで二重にリンクされたリストに並べ替え

セグメント違反が発生しています。あなたのコードから

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Node 
{ 
    int data; 
    struct Node* previous; 
    struct Node* next; 
}Node; 

Node* head = {NULL}; 

// To insert new element into the doubly linked list 
void insert(Node* currentPointer, int element) 
{ 
    Node* temp = (Node*)malloc(sizeof(Node)); 

    if (head == NULL) 
    { 
     head = temp; 
     currentPointer = head; 
     head -> data = element; 
     head -> previous = NULL; 
     head -> next = NULL; 
    } 

    else 
    { 
     temp -> previous = currentPointer; 
     currentPointer -> next = temp; 
     currentPointer = temp; 
     currentPointer -> data = element; 
     currentPointer -> next = NULL; 
    } 
} 

//Performing insertion sort on the doubly linked list 
void insertionSort(Node* currentPointer) 
{ 
    Node* temp = currentPointer; 

    while (temp != NULL && temp -> data < (temp -> previous) -> data) 
    { 
     int variable = temp -> data; 
     temp -> data = (temp -> previous) -> data; 
     (temp -> previous) -> data = variable; 
     temp = temp -> previous; 
    } 
} 

//Function to print the sorted elements 
void printSorted() 
{ 
    Node* temp = head; 
    while(temp != NULL) 
    { 
     printf("%d ",temp -> data); 
     temp = temp -> next; 
    } 
    printf("\n"); 
} 


int main() 
{ 
    int nLines; 
    Node* currentPointer0; 
    printf("Enter the no. of lines: "); 
    scanf("%d\n",&nLines); 

    while(nLines--) 
    { 
     int variable; 
     scanf("%d\n",&variable); 

     if ((char)variable == 'P') 
     { 
      printSorted(); 
     } 

     else 
     { 
      insert(currentPointer0,variable); 
      insertionSort(currentPointer0); 
     } 

    } 

    //After the program is done free all the memory 
    while(head != NULL) 
    { 
     Node* temp = head; 
     head = head -> next; 
     free(temp); 
    } 

    return 0; 
} 
+0

?あなたはデバッガを使いましたか? – UmNyobe

+0

私のプログラムがNULLポインターにアクセスしようとしていたときに、insertionSortにアクセスしようとしたときにseg faultが発生しました。私は問題を解決しました。助けてくれてありがとう! –

答えて

1

あなたがmaincurrentPointer0を更新するinsert機能を期待しているようです。

まあ、そうではありません。

Cは値渡しを使用し、関数内でその値に加えた変更は、関数が戻るときに失われます。言い換えれば、insertを呼び出すときにcurrentPointer0の値が42の場合、関数が返っても値は42です。 currentPointer -> next = temp;のような代入は、関数が返っても効果がありません。

あなたのケースでは、初期化されていないため、逆参照するとクラッシュする可能性があります。

あなたはおそらく、二重のポインタを必要とする:

void insert(Node** currentPointer, int element) // Notice 
{ 
    Node* temp = (Node*)malloc(sizeof(Node)); 

    if (head == NULL) 
    { 
     head = temp; 
     *currentPointer = head; // Notice 
     head -> data = element; 
     head -> previous = NULL; 
     head -> next = NULL; 
    } 

    else 
    { 
     temp -> previous = *currentPointer; // Notice 
     (*currentPointer) -> next = temp;  // Notice 
     (*currentPointer) = temp;    // Notice 
     (*currentPointer) -> data = element; // Notice 
     (*currentPointer) -> next = NULL;  // Notice 
    } 
} 

など、それを呼び出す:あなたがセグメンテーションフォールトを取得ん

insert(&currentPointer0,variable); 
+0

ノード**とは何ですか?あなたは詳細を教えてくれますか? –

+0

また、void insertをNode * insertに変更し、更新されたcurrentPointerを返し、currentPointer0 = insert(currentPointer0、variable)のような挿入関数を呼び出すように指示する場合はどうしますか? –

+0

私のプログラムがinsertionSort()関数にアクセスしようとしているのにseg faultが発生していますが、なぜその原因を特定できないのですか? –

関連する問題