TP9 exo2: Code cleanup (indentation and unused header declaration)
[TD_C.git] / TP_9 / exo2 / clist.c
index 100f77dae4d59fe4493988aba4ad06d1c005970a..244a6877d31f111d79ea9aed02bbeb2eefdb186d 100644 (file)
@@ -1,5 +1,5 @@
-#include <stdlib.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdbool.h>
 
 #include "clist.h"
@@ -86,6 +86,16 @@ link_t* list_delete(link_t* head, unsigned index) {
     }
 }
 
+link_t* list_concat(link_t* first, link_t* second) {
+    link_t* head_first = first;
+
+    while (first->next != NULL) {
+        first = first->next;
+    }
+    first->next = second;
+    return head_first;
+}
+
 link_t* list_sort(link_t* head) {
     int tmp;
     bool isswaped;
@@ -102,14 +112,55 @@ link_t* list_sort(link_t* head) {
             }
            head = head->next;
         }
-       /* Reloop at the beginning of the list until there's is values swaped */
+       /* Reloop at the beginning of the list until there's values swaped */
        head = head_first;
     } while (isswaped);
     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) {
-    int count = 0;
+    unsigned count = 0;
     
     while (head != NULL) {
         ++count;
@@ -153,7 +204,7 @@ void list_clear(link_t* head) {
 }
 
 void list_display_values(link_t* head) {
-    int i = 0;
+    unsigned i = 0;
 
     printf("------Begin------\n");
     while (head != NULL) {