C Додайте та сортуйте два пов'язаних списка

У мене є функція, яка повинна брати два пов'язані списки та об'єднати їх.

    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
додано