TP 9 exo2: Add link_sort linked list helper function
[TD_C.git] / TP_9 / exo2 / clist.c
CommitLineData
f8051b35 1#include <stdlib.h>
83ec54cd
JB
2#include <stdio.h>
3#include <stdbool.h>
f8051b35
JB
4
5#include "clist.h"
6
7link_t* list_new(int value) {
8f2b2843
JB
8 link_t* link_new;
9 link_new = malloc(sizeof(link_t));
10 link_new->value = value;
11 link_new->next = NULL;
12 return link_new;
f8051b35
JB
13}
14
15link_t* list_append(link_t* head, int value) {
16
17 if (head == NULL) {
18 return head = list_new(value);
19 } else {
20 link_t* head_first = head;
21 while (head->next != NULL) {
22 head = head->next;
23 }
24 head->next = list_new(value);
25 return head_first;
26 }
27}
28
29link_t* list_prepend(link_t* head, int value) {
30 link_t* first_link = list_new(value);
31
32 first_link->next = head;
33 return first_link;
34}
35
0d650b41 36link_t* list_insert(link_t* head, unsigned index, int value) {
0d650b41 37
3de00528
JB
38 if (index == 0) {
39 return list_prepend(head, value);
40 } else if (index == list_count(head)) {
41 return list_append(head, value);
42 } else {
43 link_t* link_insrt = list_new(value);
44 link_t* head_first = head;
45 link_t* head_next = NULL;
46 for (unsigned i = 0; i < index-1; i++) {
47 head = head->next;
48 }
49 head_next = head->next;
50 head->next = link_insrt;
51 head = link_insrt;
52 head->next = head_next;
53 return head_first;
0d650b41 54 }
0d650b41
JB
55}
56
57link_t* list_delete(link_t* head, unsigned index) {
0d650b41
JB
58 link_t* head_prev = NULL;
59 link_t* head_next = NULL;
74801358 60 link_t* head_ret = NULL;
0d650b41 61
abe54438
JB
62 if (head == NULL) {
63 return NULL;
64 } else if (index == 0) {
0d650b41
JB
65 head_next = head->next;
66 free(head);
67 head = head_next;
74801358 68 head_ret = head;
0d650b41 69 } else {
3de00528 70 link_t* head_first = head;
0d650b41
JB
71 for (unsigned i = 0; i < index-1; i++) {
72 head = head->next;
73 }
74 head_prev = head;
75 head = head->next;
76 head_next = head->next;
77 free(head);
78 head = head_prev;
79 head->next = head_next;
74801358
JB
80 head_ret = head_first;
81 }
82 if (head_ret != NULL) {
83 return head_ret;
84 } else {
85 return NULL;
0d650b41
JB
86 }
87}
88
83ec54cd
JB
89link_t* list_sort(link_t* head) {
90 int tmp;
91 bool isswaped;
92 link_t* head_first = head;
93
94 do {
95 isswaped = false;
96 while (head->next != NULL) {
97 if (head->value > head->next->value) {
98 tmp = head->value;
99 head->value = head->next->value;
100 head->next->value = tmp;
101 isswaped = true;
102 }
103 head = head->next;
104 }
105 /* Reloop at the beginning of the list until there's is values swaped */
106 head = head_first;
107 } while (isswaped);
108 return head_first;
109}
110
f8051b35 111unsigned list_count(link_t* head) {
490c6927 112 int count = 0;
f8051b35 113
8f2b2843 114 while (head != NULL) {
f8051b35
JB
115 ++count;
116 head = head->next;
117 }
118 return count;
119}
120
121void list_set(link_t* head, unsigned index, int value) {
8f2b2843 122 unsigned count = 0;
f8051b35 123
8f2b2843
JB
124 while (head != NULL && count < index) {
125 ++count;
f8051b35
JB
126 head = head->next;
127 }
8f2b2843 128 if (head != NULL) { head->value = value; }
f8051b35
JB
129}
130
131int list_get(link_t* head, unsigned index) {
8f2b2843
JB
132 unsigned count = 0;
133
134 while (head != NULL && count < index) {
135 ++count;
136 head = head->next;
137 }
138 if (head != NULL) {
f8051b35 139 return head->value;
8f2b2843 140 } else {
f8051b35
JB
141 return -1;
142 }
143}
144
74801358 145void list_clear(link_t* head) {
8f2b2843 146 link_t* next_link = NULL;
f8051b35 147
74801358
JB
148 while (head != NULL) {
149 next_link = head->next;
150 free(head);
151 head = next_link;
f8051b35
JB
152 }
153}
83ec54cd
JB
154
155void list_display_values(link_t* head) {
156 int i = 0;
157
158 printf("------Begin------\n");
159 while (head != NULL) {
160 printf("value at [%d]=%d\n", i, head->value);
161 head = head->next;
162 i++;
163 }
164 printf("------End------\n");
165}