#c #merge #linked-list
Вопрос:
Этот код показывает вывод отсортированного списка, но мне нужен несортированный список. Кто-нибудь может мне помочь, пожалуйста? Кто-нибудь может сказать мне, где отсортирован код? Я не могу его найти. Мне просто нужно объединить эти два списка. Сначала перечислите один, затем список 2.
#include lt;stdio.hgt; #include lt;stdlib.hgt; struct node { int data; struct node *next; } *LLOne, *LLTwo, *mergedLL; void initialize(){ LLOne = LLTwo = mergedLL = NULL; } void insert(struct node **head, int num) { struct node* newNode = (struct node*) malloc(sizeof(struct node)); newNode-gt;data = num; newNode-gt;next = *head; *head = newNode; printf("Inserted Element : %dn", num); } struct node* mergeLinkedList(struct node* LLTwo, struct node* LLOne){ struct node *resultHead, *resultTail, *temp; resultHead = resultTail = NULL; while(1){ /* */ if(LLOne == NULL){ resultTail-gt;next = LLTwo; break; } if(LLTwo == NULL) { resultTail-gt;next = LLOne; break; } if(LLOne-gt;data lt;= LLTwo-gt;data){ temp = LLOne; LLOne = LLOne-gt;next; } else { temp = LLTwo; LLTwo = LLTwo-gt;next; } if(resultHead == NULL){ resultHead = resultTail = temp; } else { resultTail-gt;next = temp; resultTail = temp; } resultTail-gt;next = NULL; } return resultHead; } void printLinkedList(struct node *nodePtr) { while (nodePtr != NULL) { printf("%d", nodePtr-gt;data); nodePtr = nodePtr-gt;next; if(nodePtr != NULL) printf("--gt;"); } } int main() { initialize(); insert(amp;LLOne, 2); insert(amp;LLOne, 4); insert(amp;LLOne, 7); insert(amp;LLOne, 8); insert(amp;LLOne, 10); printLinkedList(LLOne); printf("n"); insert(amp;LLTwo, 3); insert(amp;LLTwo, 5); insert(amp;LLTwo, 9); insert(amp;LLTwo, 11); insert(amp;LLTwo, 15); printLinkedList(LLTwo); mergedLL = mergeLinkedList(LLTwo, LLOne); printf("nMerged Linked Listn"); printLinkedList(mergedLL); return 0; }
Комментарии:
1. Посмотрите на эту строку:
if(LLOne-gt;data lt;= LLTwo-gt;data)
2. как я могу это решить?
3. Почему бы просто не позвонить
insert
, чтобы добавить все узлы из обоих списков в список слияния? Сначала скопируйте из первого списка, затем из второго списка.4. Для минимального изменения: вам всегда нужна эта
if
роль. Просто удалитеif() {} else {}
и сделайтеtemp = LLOne; LLOne = LLOne-gt;next;
Для хорошего решения: перепишите всю функцию, так как она не предназначена для этой задачи. Он создан для слияния, а не для объединения.
Ответ №1:
Объединение двух списков имеет мало общего с объединением отсортированных списков. Код, который вы ищете, намного проще, чем алгоритм слияния. По сути, вам нужно установить только одну next
ссылку, чтобы конец первого списка ссылался на начало второго списка:
struct node* tail(struct node* head) { if (head != NULL) { while (head-gt;next != NULL) { head = head-gt;next; } } return head; } struct node* mergeLinkedList(struct node* LLOne, struct node* LLTwo){ if (LLOne == NULL) return LLTwo; tail(LLOne)-gt;next = LLTwo; return LLOne; }
Обратите внимание, что я изменил порядок параметров. Мне показалось немного странным, что у вас они были в обратном порядке ( LLTwo
а затем LLOne
). Итак, main
вам следует позвонить вот так:
mergedLL = mergeLinkedList(LLOne, LLTwo);
Имейте в виду, что объединение списков, подобных этому, приведет к изменению первого списка (если он не был пустым). Поэтому, если вы напечатаете LLOne
после этого вызова, вы действительно увидите объединенный список. То же самое было верно и для вашей первоначальной функции слияния.
Если вы хотите избежать этой мутации, вам нужно создать новый узел для каждого узла, который находится в первом списке, и установить только next
ссылку на новый хвост.
Комментарии:
1. Как функция слияния работает с этим кодом? Вы не могли бы мне помочь?