TP 9 exo2: handle out of bound list operations properly.
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 1 Mar 2017 19:28:12 +0000 (20:28 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 1 Mar 2017 19:28:12 +0000 (20:28 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TP_9/exo2/clist.c
TP_9/exo2/exo2.c

index 0aa9e37da73e1271d043a5a82796f75742999754..2e0352de109dfede2612bc175e0a6e9ab85c4c63 100644 (file)
@@ -3,11 +3,11 @@
 #include "clist.h"
 
 link_t* list_new(int value) {
-    link_t* link_t_new;        
-    link_t_new = malloc(sizeof(link_t));
-    link_t_new->value = value;
-    link_t_new->next = NULL;
-    return link_t_new;
+    link_t* link_new;  
+    link_new = malloc(sizeof(link_t));
+    link_new->value = value;
+    link_new->next = NULL;
+    return link_new;
 }
 
 link_t* list_append(link_t* head, int value) {
@@ -75,9 +75,7 @@ link_t* list_delete(link_t* head, unsigned index) {
 unsigned list_count(link_t* head) {
     int count = 0;
     
-    if (head == NULL) { return count; }
-    count = 1;
-    while (head->next != NULL) {
+    while (head != NULL) {
         ++count;
         head = head->next;
     } 
@@ -85,30 +83,34 @@ unsigned list_count(link_t* head) {
 }
 
 void list_set(link_t* head, unsigned index, int value) {
+    unsigned count = 0;
 
-    //FIXME: check for the index value validity
-    for (unsigned count = 0; count < index; count++) {
+    while (head != NULL && count < index) {
+        ++count;
         head = head->next;
     }
-    head->value = value;
+    if (head != NULL) { head->value = value; }
 }
 
 int list_get(link_t* head, unsigned index) {
-    
-    if (index < list_count(head)) {
-        for (unsigned i = 0; i < index; i++) {
-            head = head->next; 
-        }
+    unsigned count = 0;    
+
+    while (head != NULL && count < index) {
+        ++count;
+        head = head->next; 
+    }
+    if (head != NULL) { 
         return head->value;
-    } else { 
+    } else {
         return -1;
     }
 }
 
 void list_clear(link_t* link) {
+    link_t* next_link = NULL;
 
     while (link != NULL) {
-        link_t* next_link = link->next;
+        next_link = link->next;
         free(link);
         link = next_link;
     }
index ff5912bcb3e685ab74f1206f6f182458dcff6ad7..b7dae12490515e2f8b2e68c3522fc71a623d5325 100644 (file)
@@ -22,11 +22,11 @@ int main() {
     printf("Valeur a index %d: %d\n", 0, list_get(head, 0));
     printf("Valeur a index %d: %d\n", 1, list_get(head, 1));
     printf("Valeur a index %d: %d\n", 2, list_get(head, 2));
-    head = list_insert(head, 2, 7);
+    //head = list_insert(head, 2, 7);
     printf("Valeur a index %d: %d\n", 1, list_get(head, 1));
     printf("Valeur a index %d: %d\n", 2, list_get(head, 2));
     printf("Valeur a index %d: %d\n", 3, list_get(head, 3));
-    //head = list_delete(head, 2);
+    head = list_delete(head, 2);
     printf("Valeur a index %d: %d\n", 2, list_get(head, 2));
     printf("Valeur a index %d: %d\n", 3, list_get(head, 3));
     printf("Valeur a index %d: %d\n", 4, list_get(head, 4));