2011-10-27 16 views
0

私は2つのリンクされたリストを取って一緒に置くことになっている関数を持っています。C 2つのリンクされたリストの追加とソート

私はそれをソートしたいが、私は、私はこれでwhileループを交換する際にセグメンテーションフォールトを取得しておく
void Append(struct node** aRef, struct node** bRef){ 
    struct node* first = *aRef; 
    struct node* second = *bRef; 
    struct node* temp = NULL; 

    while(first != NULL || second != NULL){ 
      Push(&temp, first->data); 
      Push(&temp, second->data); 
      first = first->next; 
      second = second->next; 
    } 

    *aRef = temp; 
    DeleteList(&second); 
} 

while(first != NULL || second != NULL){ 
     if(first->data < second->data){ 
      Push(&temp, first->data); 
      first = first->next; 
     } 
     else{ 
      Push(&temp, second->data); 
      second = second->next; 
     } 
} 

プッシュ()関数は、単に構造体のノードにいくつかのデータを追加します。

void Push(struct node** headRef, int data){ 
    struct node* new = malloc(sizeof(struct node)); 
    new->data = data; 
    new->next = *headRef; 
    *headRef = new; 
} 

struct node{ 
    int data; 
    struct node* next; 
}; 
+0

という属性にアクセスしようとしているからです。これでリストも完全にソートされないことに気づきました。 –

答えて

2

これは問題を解決します。両方をテストしない場合は、最初の比較を実行できません。

while(first != NULL || second != NULL){ 
     if((first != NULL && second != NULL && first->data < second->data) || (first != NULL && second == NULL)){ 
      Push(&temp, first->data); 
      first = first->next; 
     } 
     else if (second != NULL) { 
      Push(&temp, second->data); 
      second = second->next; 
     } 
} 
+0

ahh、ok thankyou。私はおそらく教師の話を聞き、テスト計画を書くべきです –

0
while(first != NULL || second != NULL){ 

これは、限り、それらのいずれかが!= NULLあるとして反復を維持しますので、どちらかあなたは&&にあなたの状態を変更したり、それらのいずれかがNULLある場合while体内で確認する必要があります。

0

ノードが別々にnextノードに移動しているので、アルゴリズムが完了する前に、そのうちの1つがNULLになります。この場合、あなたのifの状態がクラッシュするのは、NULL

関連する問題