TP 9 exo2: fix a typo in a comment.
[TD_C.git] / TP_9 / exo2 / clist.c
index 2e0352de109dfede2612bc175e0a6e9ab85c4c63..afdb00f6c12e84617d2d360dc331c8849dee94a5 100644 (file)
@@ -1,4 +1,6 @@
 #include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
 
 #include "clist.h"
 
@@ -32,33 +34,40 @@ link_t* list_prepend(link_t* head, int value) {
 }
 
 link_t* list_insert(link_t* head, unsigned index, int value) {
-    link_t* link_insrt = list_new(value);  
-    link_t* head_first = head;
-    //link_t* head_prev = NULL;
-    link_t* head_next = NULL;
 
-    for (unsigned i = 0; i < index; i++) {
-        head = head->next;
+    if (index == 0) {
+        return list_prepend(head, value);  
+    } else if (index == list_count(head)) {
+        return list_append(head, value);
+    } else {
+        link_t* link_insrt = list_new(value);  
+        link_t* head_first = head;
+        link_t* head_next = NULL;
+        for (unsigned i = 0; i < index-1; i++) {
+            head = head->next;
+        }
+        head_next = head->next;
+        head->next = link_insrt;
+        head = link_insrt;
+        head->next = head_next; 
+        return head_first;
     }
-    //head_prev = head;
-    head->next = link_insrt;
-    head_next = head->next;
-    head = link_insrt;
-    head->next = head_next; 
-    return head_first;
 }
 
 link_t* list_delete(link_t* head, unsigned index) {
-    link_t* head_first = head;
     link_t* head_prev = NULL;
     link_t* head_next = NULL;
+    link_t* head_ret = NULL;
    
-    if (index == 0) {
+    if (head == NULL) {
+        return NULL;
+    } else if (index == 0) {
         head_next = head->next;
         free(head);
         head = head_next;
-        return head;
+        head_ret = head;
     } else {
+        link_t* head_first = head;
         for (unsigned i = 0; i < index-1; i++) {
             head = head->next;
         }
@@ -68,12 +77,49 @@ link_t* list_delete(link_t* head, unsigned index) {
         free(head);
         head = head_prev;
         head->next = head_next;
-        return head_first;
+        head_ret = head_first;
+    }
+    if (head_ret != NULL) {
+        return head_ret;
+    } else {
+        return NULL;
+    }
+}
+
+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;
+    link_t* head_first = head;
+
+    do {
+        isswaped = false;
+        while (head->next != NULL) {
+            if (head->value > head->next->value) {
+                tmp = head->value;
+                head->value = head->next->value;
+                head->next->value = tmp;
+               isswaped = true;
+            }
+           head = head->next;
+        }
+       /* Reloop at the beginning of the list until there's values swaped */
+       head = head_first;
+    } while (isswaped);
+    return head_first;
 }
 
 unsigned list_count(link_t* head) {
-    int count = 0;
+    unsigned count = 0;
     
     while (head != NULL) {
         ++count;
@@ -106,12 +152,24 @@ int list_get(link_t* head, unsigned index) {
     }
 }
 
-void list_clear(link_t* link) {
+void list_clear(link_t* head) {
     link_t* next_link = NULL;
 
-    while (link != NULL) {
-        next_link = link->next;
-        free(link);
-        link = next_link;
+    while (head != NULL) {
+        next_link = head->next;
+        free(head);
+        head = next_link;
+    }
+}
+
+void list_display_values(link_t* head) {
+    unsigned i = 0;
+
+    printf("------Begin------\n");
+    while (head != NULL) {
+        printf("value at [%d]=%d\n", i, head->value);
+       head = head->next;
+       i++;
     }
+    printf("------End------\n");
 }