X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=TP_9%2Fexo2%2Fclist.c;h=244a6877d31f111d79ea9aed02bbeb2eefdb186d;hb=eede13dc23d5e3377a9c8ba48d34409b3de02b45;hp=100f77dae4d59fe4493988aba4ad06d1c005970a;hpb=83ec54cdf5ddd1092ed4ba11d58fec8a0db07b68;p=TD_C.git diff --git a/TP_9/exo2/clist.c b/TP_9/exo2/clist.c index 100f77d..244a687 100644 --- a/TP_9/exo2/clist.c +++ b/TP_9/exo2/clist.c @@ -1,5 +1,5 @@ -#include #include +#include #include #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) {