Что не так с этим кодом? Разве значения не присоединяются к t? - PullRequest
0 голосов
/ 22 января 2019

Я должен объединить два отсортированных связанных списка.Я не знаю, как, но т не увеличивается.Есть ли какая-то ошибка в коде?

Node * p=(Node*)malloc(sizeof(Node)),*t=p;
while(head1!=NULL && head2!=NULL){
    Node * temp=(Node*)malloc(sizeof(Node));

    if(head1->data<=head2->data){
        temp->data=head1->data;
        temp->next=NULL;
        t=temp;

        head1=head1->next;
        t=t->next;
     }
    else{
        temp->data=head2->data;
        temp->next=NULL;
        t=temp;
        t=t->next;
        head2=head2->next;
    }
}
if(head1==NULL){
    t->next=head2;
    printf("%d\n",t->data);
}
else
t->next=head1;


return p;

}

3 1 2 3 будет первым связанным списком.

3 4 будет вторым связанным списком

вывод должен быть:1 2 3 3 4

Я получаю ошибку сегментации

1 Ответ

0 голосов
/ 22 января 2019

Если вы хотите объединить 2 списка, у вас есть несколько вариантов.

  1. Вы можете скопировать все элементы в новый список.
  2. Вы можете удалить узлы из существующего списка и поместить его в новый список.

То, что вы делаете, ничего из этого.

Вы начинаете с варианта 1:

while(head1!=NULL && head2!=NULL){
    Node * temp=(Node*)malloc(sizeof(Node));

    if(head1->data<=head2->data){
        temp->data=head1->data;
        temp->next=NULL;
        t=temp;

        head1=head1->next;
        t=t->next;
     }
    else{
        temp->data=head2->data;
        temp->next=NULL;
        t=temp;
        t=t->next;
        head2=head2->next;
    }
}

Подсказка:
Вы можете улучшить свой код, извлекая идентичные инструкции из блоков if else и писать их только один раз после блока else:

while (head1 != NULL && head2 != NULL) {
    Node * temp = malloc(sizeof(Node));
    temp->next = NULL;

    if (head1->data <= head2->data) {
        temp->data = head1->data;   
        head1 = head1->next;
    }
    else {
        temp->data = head2->data;
        head2 = head2->next;
    }

    // Now link the new node:
    t->next = temp;  // <<==== Linking fixed.
    t = t->next;
}

Также обратите внимание, что ваша связь с новым узлом была нарушена. Вы потеряли ссылку с t на следующий узел.

Но есть еще одна проблема:

Когда вы достигнете конца одного из списков, вы перестанете копировать. Вы просто добавляете оставшийся список сразу в свой новый список:

if(head1==NULL){
    t->next=head2;
    printf("%d\n",t->data);
}
else
    t->next=head1;

Это означает, что у вас нет копии, но каждый из оставшихся узлов можно переназначить через 2 списка.

Для старого списка это означает, что первые узлы связаны исключительно через этот список, но другие узлы имеют 2 ссылки.

Как только вы начнете манипулировать одним из списков, эти узлы могут быть удалены в одном списке. Тогда есть еще ссылка из другого списка, указывающая на первый из этих узлов. Это вызывает недопустимый доступ к памяти и неопределенное поведение при доступе к узлу через оставшийся список. В конечном итоге это может привести к нарушению сегментации.

Вы должны скопировать все указатели. Не останавливаться в середине задачи.

...