X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=TP_9%2Fexo2%2Fclist.c;h=a089750ff01ae755ccd5e6f8c21f7b091a245107;hb=3de00528618f48f669d1b2ff673fd1370cdf5323;hp=db081179bae025aa5d7ce1e9fd14e00d266c28e2;hpb=f8051b356ef079c703c1dc0369a135b5032f4027;p=TD_C.git diff --git a/TP_9/exo2/clist.c b/TP_9/exo2/clist.c index db08117..a089750 100644 --- a/TP_9/exo2/clist.c +++ b/TP_9/exo2/clist.c @@ -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) { @@ -31,11 +31,55 @@ link_t* list_prepend(link_t* head, int value) { return first_link; } +link_t* list_insert(link_t* head, unsigned index, int value) { + + 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; + } +} + +link_t* list_delete(link_t* head, unsigned index) { + link_t* head_prev = NULL; + link_t* head_next = NULL; + + if (index == 0) { + head_next = head->next; + free(head); + head = head_next; + return head; + } else { + link_t* head_first = head; + for (unsigned i = 0; i < index-1; i++) { + head = head->next; + } + head_prev = head; + head = head->next; + head_next = head->next; + free(head); + head = head_prev; + head->next = head_next; + return head_first; + } +} + unsigned list_count(link_t* head) { - int count = 1; + int count = 0; - if (head == NULL) { return 0; } - while (head->next != NULL) { + while (head != NULL) { ++count; head = head->next; } @@ -43,30 +87,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; }