TP 9 exo2: Implement a merge sort function for the linked list.
authorJerome Benoit <jerome.benoit@sap.com>
Sun, 5 Mar 2017 22:14:40 +0000 (23:14 +0100)
committerJerome Benoit <jerome.benoit@sap.com>
Sun, 5 Mar 2017 22:14:40 +0000 (23:14 +0100)
Signed-off-by: Jerome Benoit <jerome.benoit@sap.com>
TP_9/exo2/clist.c
TP_9/exo2/clist.h
TP_9/exo2/exo2.c

index afdb00f6c12e84617d2d360dc331c8849dee94a5..ae7db6fcb6d5740ac59921ca684e960d88971b75 100644 (file)
@@ -1,5 +1,6 @@
-#include <stdlib.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
 #include <stdbool.h>
 
 #include "clist.h"
@@ -118,6 +119,47 @@ link_t* list_sort(link_t* head) {
     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;
     
index a08ec178c103e95017254c60cbf943ff7db82960..2ca575290bae8527ca621277ff2d92cb354167c7 100644 (file)
@@ -14,6 +14,7 @@ link_t* list_insert(link_t* head, unsigned index, int value);
 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);
index b06d7a4d7bc31a17f32e337c7707bf17d61d40af..810bd9eea64545915da2dfa27ec3ff4f52384c3c 100644 (file)
@@ -35,7 +35,8 @@ int main() {
     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);