-#include <stdlib.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
#include <stdbool.h>
#include "clist.h"
return head_first;
}
+static link_t* _list_merge_sort(link_t* head1, link_t* head2) {
+ link_t* head_result = NULL;
+
+ if (head1 == NULL) {
+ return head2;
+ }
+ if (head2 == NULL) {
+ return head1;
+ }
+ if (head1->value < head2->value) {
+ head_result = head1;
+ head_result->next = _list_merge_sort(head1->next, head2);
+ } else {
+ head_result = head2;
+ head_result->next = _list_merge_sort(head1, head2->next);
+ }
+ return head_result;
+}
+
+link_t* list_merge_sort(link_t* head) {
+ link_t* head1;
+ link_t* head2;
+
+ if (head == NULL || head->next == NULL) {
+ return head;
+ }
+
+ head1 = head;
+ head2 = head->next;
+ while (head2 != NULL && head2->next != NULL) {
+ head = head->next;
+ head2 = head->next->next;
+ }
+ head2 = head->next;
+ head->next = NULL;
+
+ head1 = list_merge_sort(head1);
+ head2 = list_merge_sort(head2);
+ return _list_merge_sort(head1, head2);
+}
+
unsigned list_count(link_t* head) {
unsigned count = 0;
link_t* list_delete(link_t* head, unsigned index);
link_t* list_concat(link_t* first, link_t* second);
link_t* list_sort(link_t* head);
+link_t* list_merge_sort(link_t* head);
unsigned list_count(link_t* head);
void list_set(link_t* head, unsigned index, int value);
int list_get(link_t* head, unsigned index);
list_display_values(head2);
head = list_concat(head1, head2);
list_display_values(head);
- head = list_sort(head);
+ head = list_merge_sort(head);
+ //head = list_sort(head);
list_display_values(head);
//list_clear(head1);
//list_clear(head2);