Fix a GCC flag in Makefiles
[Algorithmic_C.git] / TP5 / exo4 / liste_chainee.c
CommitLineData
3f0f8bfd
JB
1/********************************************************************/
2/* Implantation d'une liste triee d'entiers */
3/********************************************************************/
4#include <stdio.h>
5#include <stdlib.h>
ef5acd44 6#include <stdbool.h>
3f0f8bfd
JB
7
8typedef int element;
9
10typedef struct cellule {
11 element valeur;
12 struct cellule *suivant;
13} Cellule, *Liste;
14
0bf26b29
JB
15Cellule *creer_maillon(element e, Cellule * suivant)
16{
17 Cellule *pnouveau = malloc(sizeof(Cellule));
18 pnouveau->valeur = e;
19 pnouveau->suivant = suivant;
20 return pnouveau;
21}
22
3f0f8bfd
JB
23Liste ajouter_iter(element e, Liste L)
24{
25 Cellule *pc, *p1 = L, *p2 = NULL;
26
0bf26b29 27 pc = creer_maillon(e, NULL);
3f0f8bfd
JB
28
29 if (!L) /* liste vide */
30 return pc;
31
32 while (p1 && (e >= p1->valeur)) {
33 p2 = p1;
34 p1 = p1->suivant;
35 }
36
37 if (!p2) { /* insertion en tete */
38 pc->suivant = L;
39 L = pc;
40 } else { /* insertion entre p2 et p1 */
41 p2->suivant = pc;
42 pc->suivant = p1;
43 }
44
45 return L;
46}
47
48int longueur_iter(Liste L)
49{
50 int longueur = 0;
51
105fac43 52 while (L != NULL) {
3f0f8bfd
JB
53 L = L->suivant;
54 longueur++;
55 }
56 return longueur;
57}
58
59int longueur_rec(Liste L)
60{
105fac43
JB
61 if (L != NULL) {
62 return 1 + longueur_rec(L->suivant);
63 } else {
64 return 0;
65 }
3f0f8bfd
JB
66}
67
68void visualiser_iter(Liste L)
69{
ca2c69d5
JB
70 int compteur = 0;
71
72 printf("--Debut--\n");
73 while (L != NULL) {
74 printf("L[%d]->value=%d\n", compteur, L->valeur);
75 L = L->suivant;
76 compteur++;
77 }
78 printf("--Fin--\n");
79}
80
81void _visualiser_rec(Liste L, int compteur)
82{
83 if (L != NULL) {
0bf26b29 84 /* FIXME: suboptimal printing to stdout, put this code path outside the recursion */
ef5acd44
JB
85 if (compteur == 0)
86 printf("--Debut--\n");
ca2c69d5
JB
87 printf("L[%d]->value=%d\n", compteur, L->valeur);
88 compteur++;
89 _visualiser_rec(L->suivant, compteur);
90 if (compteur == (longueur_rec(L) - 1))
91 printf("--Fin--\n");
92 }
93
3f0f8bfd
JB
94}
95
96void visualiser_rec(Liste L)
97{
ca2c69d5
JB
98 int compteur = 0;
99
ca2c69d5 100 _visualiser_rec(L, compteur);
3f0f8bfd
JB
101}
102
ef5acd44 103bool rechercher_iter(element e, Liste L)
3f0f8bfd 104{
ef5acd44
JB
105 bool rt_val = false;
106
85bdc677
JB
107 while (L != NULL) {
108 if (L->valeur == e) {
cdc1c7e2 109 rt_val = true;
85bdc677
JB
110 break;
111 }
112 L = L->suivant;
ef5acd44 113 }
ef5acd44 114 return rt_val;
3f0f8bfd
JB
115}
116
117Liste rechercher_rec(element e, Liste L)
118{
0bf26b29 119 if (L->valeur != e && L->suivant != NULL) {
f23fb1de
JB
120 return L = rechercher_rec(e, L->suivant);
121 }
3f0f8bfd
JB
122}
123
124Liste ajouter_rec(element e, Liste L)
125{
0bf26b29
JB
126 if (!L || !(L->valeur < e)) {
127 return creer_maillon(e, L);
128 }
129
130 L->suivant = ajouter_rec(e, L->suivant);
131
132 return L;
3f0f8bfd
JB
133}
134
135Liste supprimer_iter(element e, Liste L)
136{
0bf26b29
JB
137 Cellule *pavant = NULL;
138 Cellule *pdebut = L;
139 while (L != NULL) {
140 /* supprimer en fin de liste */
141 if (L->valeur == e && L->suivant == NULL) {
142 free(L);
143 pavant->suivant = NULL;
144 return pdebut;
145 /* supprimer au début de la liste */
146 } else if (L->valeur == e && pavant == NULL) {
147 Cellule *pcourant = L;
148 free(L);
149 return pcourant->suivant;
150 /* supprimer au mileu de la liste */
151 } else if (L->valeur == e) {
152 Cellule *pcourant = L;
153 free(L);
154 L = pavant;
155 L->suivant = pcourant->suivant->suivant;
156 return pdebut;
157 }
158 pavant = L;
159 L = L->suivant;
160 }
3f0f8bfd
JB
161}
162
163Liste supprimer_rec(element e, Liste L)
164{
165 /* ... */
166}
167
168Liste inverser_iter(Liste L)
169{
170 /* ... */
171}
172
173Liste inverser_rec(Liste L)
174{
175 /* ... */
176}
177
5e90a798
JB
178void liberer_iter(Liste L)
179{
180
181}
182
0bf26b29
JB
183void liberer_rec(Liste L)
184{
185 if (!L) {
186 liberer_rec(L->suivant);
187 free(L);
188 }
189}
190
3f0f8bfd
JB
191/****************************************************************************/
192int main()
193{
194 int x;
195 Liste L = NULL;
105fac43
JB
196 L = ajouter_iter(2, L);
197 L = ajouter_iter(1, L);
198 L = ajouter_iter(3, L);
85bdc677
JB
199 L = ajouter_iter(4, L);
200 printf("Saisir un entier a chercher dans la liste L\n");
3f0f8bfd 201 scanf("%d", &x);
ca2c69d5 202 printf("L a pour longueur %d\n", longueur_rec(L));
3f0f8bfd 203 visualiser_iter(L);
ca2c69d5 204 visualiser_rec(L);
85bdc677
JB
205 if (rechercher_iter(x, L))
206 printf("L'element %d est present dans L\n", x);
207 else
208 printf("L'element %d n'est pas present dans L\n", x);
f23fb1de
JB
209 if (rechercher_rec(x, L) != NULL)
210 printf("L'element %d est present dans L\n", x);
211 else
212 printf("L'element %d n'est pas present dans L\n", x);
0bf26b29
JB
213 L = ajouter_rec(6, L);
214 L = ajouter_rec(5, L);
215 L = ajouter_rec(7, L);
216 visualiser_iter(L);
217 L = supprimer_iter(1, L);
218 L = supprimer_iter(4, L);
219 L = supprimer_iter(2, L);
220 visualiser_rec(L);
221 visualiser_iter(L);
222 liberer_rec(L);
3f0f8bfd
JB
223 /* ... */
224}
225
226/****************************************************************************/