a8589397a6aba3bf8da83b37936aedb2918203b3
1 /********************************************************************/
2 /* Implantation d'une liste triee d'entiers */
3 /********************************************************************/
10 typedef struct cellule
{
12 struct cellule
*suivant
;
15 Cellule
*creer_maillon(element e
, Cellule
*suivant
)
17 Cellule
*pnouveau
= malloc(sizeof(Cellule
));
19 pnouveau
->suivant
= suivant
;
23 Liste
ajouter_iter(element e
, Liste L
)
25 Cellule
*pc
, *p1
= L
, *p2
= NULL
;
27 pc
= creer_maillon(e
, NULL
);
29 if (!L
) /* liste vide */
32 while (p1
&& (e
>= p1
->valeur
)) {
37 if (!p2
) { /* insertion en tete */
40 } else { /* insertion entre p2 et p1 */
48 int longueur_iter(Liste L
)
59 int longueur_rec(Liste L
)
62 return 1 + longueur_rec(L
->suivant
);
68 void visualiser_iter(Liste L
)
72 printf("--Debut--\n");
74 printf("L[%d]->value=%d\n", compteur
, L
->valeur
);
81 void _visualiser_rec(Liste L
, int compteur
)
84 /* FIXME: suboptimal printing to stdout, put this code path outside the recursion */
86 printf("--Debut--\n");
87 printf("L[%d]->value=%d\n", compteur
, L
->valeur
);
89 _visualiser_rec(L
->suivant
, compteur
);
90 if (compteur
== (longueur_rec(L
) - 1))
96 void visualiser_rec(Liste L
)
100 _visualiser_rec(L
, compteur
);
103 bool rechercher_iter(element e
, Liste L
)
108 if (L
->valeur
== e
) {
117 Liste
rechercher_rec(element e
, Liste L
)
119 if (L
->valeur
!= e
&& L
->suivant
!= NULL
) {
120 return L
= rechercher_rec(e
, L
->suivant
);
124 Liste
ajouter_rec(element e
, Liste L
)
126 if (!L
|| !(L
->valeur
< e
)) {
127 return creer_maillon(e
, L
);
130 L
->suivant
= ajouter_rec(e
, L
->suivant
);
135 Liste
supprimer_iter(element e
, Liste L
)
137 Cellule
*pavant
= NULL
;
140 /* supprimer en fin de liste */
141 if (L
->valeur
== e
&& L
->suivant
== NULL
) {
143 pavant
->suivant
= NULL
;
145 /* supprimer au début de la liste */
146 } else if (L
->valeur
== e
&& pavant
== NULL
) {
147 Cellule
*pcourant
= L
;
149 return pcourant
->suivant
;
150 /* supprimer au mileu de la liste */
151 } else if (L
->valeur
== e
) {
152 Cellule
*pcourant
= L
;
155 L
->suivant
= pcourant
->suivant
->suivant
;
163 Liste
supprimer_rec(element e
, Liste L
)
168 Liste
inverser_iter(Liste L
)
173 Liste
inverser_rec(Liste L
)
178 void liberer_iter(Liste L
)
181 Cellule
*pcourant
= L
;
183 L
= pcourant
->suivant
;
187 void liberer_rec(Liste L
)
190 liberer_rec(L
->suivant
);
195 /****************************************************************************/
200 L
= ajouter_iter(2, L
);
201 L
= ajouter_iter(1, L
);
202 L
= ajouter_iter(3, L
);
203 L
= ajouter_iter(4, L
);
204 printf("Saisir un entier a chercher dans la liste L\n");
206 printf("L a pour longueur %d\n", longueur_rec(L
));
209 if (rechercher_iter(x
, L
))
210 printf("L'element %d est present dans L\n", x
);
212 printf("L'element %d n'est pas present dans L\n", x
);
213 if (rechercher_rec(x
, L
) != NULL
)
214 printf("L'element %d est present dans L\n", x
);
216 printf("L'element %d n'est pas present dans L\n", x
);
217 L
= ajouter_rec(6, L
);
218 L
= ajouter_rec(5, L
);
219 L
= ajouter_rec(7, L
);
221 L
= supprimer_iter(1, L
);
222 L
= supprimer_iter(4, L
);
223 L
= supprimer_iter(2, L
);
231 /****************************************************************************/
232 /* vim:noet:ts=8:sw=8:textwidth=80 */