C 2つのリンクされたリストの追加と並べ替え

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

    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ループをこれに置き換えると、セグメンテーションの失敗が続く。

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;
      }
 }

Push()関数は、structノードにデータを追加するだけです。

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
私はちょうどこれが完全にリストをソートしないことに気づいた
追加された 著者 Riz Baltazar,

3 答え

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

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;
      }
 }
2
追加された
ああ、大丈夫です。私はおそらく教師の話を聞き、テスト計画を書くべきです
追加された 著者 Riz Baltazar,
while(first != NULL || second != NULL ){

This will keep iterating as long as any of them is != NULL, so either you have to change your condition to && or check within the while body if either one of them is NULL.

0
追加された

Since you're moving to the next nodes separately, one of them reaches NULL before the algorithm is finished. When this happens, your if condition crashes because your trying to access the data attribute of NULL

0
追加された