Если вы хотите объединить 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 ссылки.
Как только вы начнете манипулировать одним из списков, эти узлы могут быть удалены в одном списке. Тогда есть еще ссылка из другого списка, указывающая на первый из этих узлов.
Это вызывает недопустимый доступ к памяти и неопределенное поведение при доступе к узлу через оставшийся список. В конечном итоге это может привести к нарушению сегментации.
Вы должны скопировать все указатели. Не останавливаться в середине задачи.