Fix a GCC flag in Makefiles
[Algorithmic_C.git] / TP5 / exo4 / liste_chainee.c
... / ...
CommitLineData
1/********************************************************************/
2/* Implantation d'une liste triee d'entiers */
3/********************************************************************/
4#include <stdio.h>
5#include <stdlib.h>
6#include <stdbool.h>
7
8typedef int element;
9
10typedef struct cellule {
11 element valeur;
12 struct cellule *suivant;
13} Cellule, *Liste;
14
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
23Liste ajouter_iter(element e, Liste L)
24{
25 Cellule *pc, *p1 = L, *p2 = NULL;
26
27 pc = creer_maillon(e, NULL);
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
52 while (L != NULL) {
53 L = L->suivant;
54 longueur++;
55 }
56 return longueur;
57}
58
59int longueur_rec(Liste L)
60{
61 if (L != NULL) {
62 return 1 + longueur_rec(L->suivant);
63 } else {
64 return 0;
65 }
66}
67
68void visualiser_iter(Liste L)
69{
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) {
84 /* FIXME: suboptimal printing to stdout, put this code path outside the recursion */
85 if (compteur == 0)
86 printf("--Debut--\n");
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
94}
95
96void visualiser_rec(Liste L)
97{
98 int compteur = 0;
99
100 _visualiser_rec(L, compteur);
101}
102
103bool rechercher_iter(element e, Liste L)
104{
105 bool rt_val = false;
106
107 while (L != NULL) {
108 if (L->valeur == e) {
109 rt_val = true;
110 break;
111 }
112 L = L->suivant;
113 }
114 return rt_val;
115}
116
117Liste rechercher_rec(element e, Liste L)
118{
119 if (L->valeur != e && L->suivant != NULL) {
120 return L = rechercher_rec(e, L->suivant);
121 }
122}
123
124Liste ajouter_rec(element e, Liste L)
125{
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;
133}
134
135Liste supprimer_iter(element e, Liste L)
136{
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 }
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
178void liberer_iter(Liste L)
179{
180
181}
182
183void liberer_rec(Liste L)
184{
185 if (!L) {
186 liberer_rec(L->suivant);
187 free(L);
188 }
189}
190
191/****************************************************************************/
192int main()
193{
194 int x;
195 Liste L = NULL;
196 L = ajouter_iter(2, L);
197 L = ajouter_iter(1, L);
198 L = ajouter_iter(3, L);
199 L = ajouter_iter(4, L);
200 printf("Saisir un entier a chercher dans la liste L\n");
201 scanf("%d", &x);
202 printf("L a pour longueur %d\n", longueur_rec(L));
203 visualiser_iter(L);
204 visualiser_rec(L);
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);
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);
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);
223 /* ... */
224}
225
226/****************************************************************************/