TP5: move corrections in their own directory
[Algorithmic_C.git] / TP5 / exo_c4 / liste_correction.c
CommitLineData
f5904379
JB
1/********************************************************************/
2/* Implantation d'une liste triee d'entiers */
3/********************************************************************/
4#include <stdio.h>
5#include <stdlib.h>
6
7typedef int element;
8
9typedef struct cellule {
10 element valeur;
11 struct cellule *suivant;
12} Cellule, *Liste;
13
14
15
16Liste ajouter_iter(element e, Liste L)
17{
18 Cellule *pc, *p1=L, *p2=NULL;
19
20 pc = (Cellule *)malloc(sizeof(Cellule));
21 pc->valeur=e;pc->suivant=NULL;
22
23 if (!L) /* liste vide */ return pc;
24 while (p1 && (e >= p1->valeur))
25 {
26 p2 = p1;
27 p1 = p1->suivant;
28 }
29
30 if (!p2) /* insertion en tete */ {pc->suivant = L; L=pc; }
31 else {/* insertion entre p2 et p1 */
32 p2->suivant = pc;
33 pc->suivant = p1;
34 }
35
36 return L;
37}
38
39
40int longueur_iter(Liste L)
41{
42 int res = 0;
43 while(L)
44 {
45 res = res + 1;
46 L=L->suivant;
47 }
48 return res;
49}
50
51
52int longueur_rec(Liste L)
53{
54 if(!L) return 0;
55 return 1+longueur_rec(L->suivant);
56}
57
58
59void visualiser_iter(Liste L)
60{
61 while (L)
62 {
63 printf("%d ",L->valeur);
64 L = L->suivant;
65 }
66 printf("\n");
67}
68
69
70void visualiser_aux(Liste L)
71{
72 if(L)
73 {
74 printf("%d ",L->valeur);
75 visualiser_aux(L->suivant);
76 }
77}
78
79
80void visualiser_rec(Liste L)
81{
82 visualiser_aux(L);
83 printf("\n");
84}
85
86
87int rechercher_iter(element e, Liste L)
88{
89 while(L)
90 {
91 if(e == L->valeur) return 1;
92 L = L->suivant;
93 }
94 return 0;
95}
96
97
98int rechercher_rec(element e, Liste L)
99{
100 if(L == NULL) return 0;
101 if(e==L->valeur) return 1;
102 return rechercher_rec(e,L->suivant);
103}
104
105
106Liste rechercher_rec2(element e, Liste L)
107{
108 if(!L || e==L->valeur) return L;
109 else return rechercher_rec2(e,L->suivant);
110}
111
112
113Liste ajouter_rec(element e, Liste L)
114{
115 if(!L)
116 {
117 L=(Cellule *)malloc(sizeof(Cellule)); /* liste vide */
118 L->valeur=e;L->suivant=NULL;
119 }
120 else if(e < L->valeur) /* ajouter DEVANT la tete */
121 {
122 Cellule *p=(Cellule *)malloc(sizeof(Cellule));
123 p->valeur=e; p->suivant=L;
124 L=p; /* nouvelle tete de liste */
125 }
126 else L->suivant=ajouter_rec(e,L->suivant); /* ajouter DERRIERE la tete */
127 return L;
128}
129
130
131Liste supprimer_iter(element e, Liste L)
132{
133 Liste prec = NULL;
134 while(L)
135 {
136 if(e == L->valeur) {
137 prec->suivant = L->suivant; /* le suivant de prec devient le suivant de L */
138 free(L); /* liberation memoire pour L */
139 return prec;
140 }
141 prec = L;
142 L = L->suivant;
143 }
144 return L;
145}
146
147
148Liste supprimer_rec(element e, Liste L)
149{
150 if(!L) ; /* element absent - on ne fait rien */
151 else if(L->valeur==e)
152 {
153 Cellule *p=L;
154 L=L->suivant;
155 free(p);
156 }
157 else L->suivant=supprimer_rec(e,L->suivant);
158 return L;
159}
160
161
162Liste inverser_iter(Liste L)
163{
164 Liste cell=NULL; /* une cellule temporaire */
165 Liste inv=NULL; /* la liste inversee */
166
167 while(L!=NULL)
168 {
169 cell=L; /* on prend la premiere cellule de la liste */
170 L=L->suivant; /* le debut de la liste devient l'element suivant */
171 cell->suivant=inv; /* on libere l'element de la liste et on le place en debut de la liste a renvoyer*/
172 inv=cell; /* l'element qu'on vient de mettre en debut de liste devient le debut de la liste de a renvoyer */
173 }
174 return inv;
175}
176
177
178
179Liste inserer_fin(element e, Liste L)
180{
181 Cellule *pc, *p1=L, *p2=NULL;
182 pc = (Cellule *)malloc(sizeof(Cellule));
183 pc->valeur=e;pc->suivant=NULL;
184 if (!L) return pc;
185 while (p1)
186 {
187 p2 = p1;
188 p1 = p1->suivant;
189 }
190 p2->suivant = pc;
191 pc->suivant = p1;
192 return L;
193}
194
195
196Liste inverser_rec(Liste L)
197{
198 if(L != NULL) {
199 return inserer_fin(L->valeur, inverser_rec(L->suivant));
200 }
201 else return L;
202}
203
204
205/****************************************************************************/
206
207int main()
9132827c 208{
f5904379
JB
209 Liste L=NULL;
210 printf("liste vide\n");
211 visualiser_iter(L);
212 visualiser_rec(L);
213
214 printf("longueur=%d\n",longueur_iter(L));
215 printf("longueur=%d\n",longueur_rec(L));
216
217 printf("ajout de 3\n");
218 L=ajouter_iter(3,L);
219 printf("ajout de 6\n");
220 L=ajouter_iter(6,L);
221 printf("ajout de 1\n");
222 L=ajouter_iter(1,L);
223 printf("ajout de 10\n");
224 L=ajouter_iter(10,L);
225 printf("ajout de 6\n");
226 L=ajouter_iter(6,L);
227 visualiser_iter(L);
228 visualiser_rec(L);
229
230 printf("longueur=%d\n",longueur_iter(L));
231 printf("longueur=%d\n",longueur_rec(L));
232
233 printf("recherche de %d = %d\n",3,rechercher_iter(3,L));
234 printf("recherche de %d = %d\n",3,rechercher_rec(3,L));
235 printf("recherche de %d = %d\n",4,rechercher_iter(4,L));
236 printf("recherche de %d = %d\n",4,rechercher_rec(4,L));
237
238 printf("ajout (rec) de 4\n");
239 L=ajouter_rec(4,L);
240 visualiser_iter(L);
241 printf("ajout (rec) de 8\n");
242 L=ajouter_rec(8,L);
243 visualiser_iter(L);
244
245 printf("suppression (iter) de 4\n");
246 supprimer_iter(4,L);
247 visualiser_iter(L);
248 printf("suppression (rec) de 6\n");
249 supprimer_rec(6,L);
250 visualiser_iter(L);
251
252 printf("liste inversee (iter)\n");
253 Liste inv = inverser_iter(L);
254 visualiser_iter(inv);
255
256 printf("Liste inversee (rec)\n");
257 Liste inv2 = inverser_rec(inv);
258 visualiser_iter(inv2);
259
260 /* il faut aussi tester chaque fonction (visualiser, supprimer, rechercher, inverser, ...) sur tous les cas : liste vide, liste avec un seul element, operation sur le premier element, operation sur le dernier element, ... */
261}
262
263
264/****************************************************************************/
265
266/* trace d'execution :
267liste vide
268
269
270longueur=0
271longueur=0
272ajout de 3
273ajout de 6
274ajout de 1
275ajout de 10
276ajout de 6
2771 3 6 6 10
2781 3 6 6 10
279longueur=5
280longueur=5
281recherche de 3 = 1
282recherche de 3 = 1
283recherche de 4 = 0
284recherche de 4 = 0
285ajout (rec) de 4
2861 3 4 6 6 10
287ajout (rec) de 8
2881 3 4 6 6 8 10
289suppression (iter) de 4
2901 3 6 6 8 10
291suppression (rec) de 6
2921 3 6 8 10
293liste inversee (iter)
29410 8 6 3 1
295Liste inversee (rec)
2961 3 6 8 10
297*/
298