TP5: Fix a FIXME in a linked list function
[Algorithmic_C.git] / TP5 / exo4 / liste_chainee.c
index 746241b4ff7a51ff9594e9f89bb29eaa0cee7a05..b7fa6d07e3a3c72ba06015b20dca42c48b22ac35 100644 (file)
@@ -23,7 +23,6 @@ Cellule *creer_maillon(element e, Cellule * suivant)
 Liste ajouter_iter(element e, Liste L)
 {
        Cellule *pc, *p1 = L, *p2 = NULL;
-
        pc = creer_maillon(e, NULL);
 
        if (!L)                 /* liste vide */
@@ -81,14 +80,9 @@ void visualiser_iter(Liste L)
 void _visualiser_rec(Liste L, int compteur)
 {
        if (L != NULL) {
-               /* FIXME: suboptimal printing to stdout, put this code path outside the recursion */
-               if (compteur == 0)
-                       printf("--Debut--\n");
                printf("L[%d]->value=%d\n", compteur, L->valeur);
                compteur++;
                _visualiser_rec(L->suivant, compteur);
-               if (compteur == (longueur_rec(L) - 1))
-                       printf("--Fin--\n");
        }
 
 }
@@ -97,7 +91,9 @@ void visualiser_rec(Liste L)
 {
        int compteur = 0;
 
+       printf("--Debut--\n");
        _visualiser_rec(L, compteur);
+       printf("--Fin--\n");
 }
 
 bool rechercher_iter(element e, Liste L)
@@ -136,6 +132,7 @@ Liste supprimer_iter(element e, Liste L)
 {
        Cellule *pavant = NULL;
        Cellule *pdebut = L;
+
        while (L != NULL) {
                /* supprimer en fin de liste */
                if (L->valeur == e && L->suivant == NULL) {
@@ -162,7 +159,17 @@ Liste supprimer_iter(element e, Liste L)
 
 Liste supprimer_rec(element e, Liste L)
 {
-       /* ... */
+       if (L == NULL) {
+               return L;
+       }
+       if (L->valeur == e) {
+               Cellule *p = L;
+               L = L->suivant;
+               free(p);
+       } else {
+               L->suivant = supprimer_rec(e, L->suivant);
+       }
+       return L;
 }
 
 Liste inverser_iter(Liste L)
@@ -175,6 +182,15 @@ Liste inverser_rec(Liste L)
        /* ... */
 }
 
+void liberer_iter(Liste L)
+{
+       while (!L) {
+               Cellule *pcourant = L;
+               free(L);
+               L = pcourant->suivant;
+       }
+}
+
 void liberer_rec(Liste L)
 {
        if (!L) {
@@ -209,13 +225,18 @@ int main()
        L = ajouter_rec(5, L);
        L = ajouter_rec(7, L);
        visualiser_iter(L);
-       L = supprimer_iter(1, L);
-       L = supprimer_iter(4, L);
-       L = supprimer_iter(2, L);
+       /* L = supprimer_iter(1, L);
+          L = supprimer_iter(4, L);
+          L = supprimer_iter(2, L); */
+       L = supprimer_rec(1, L);
+       L = supprimer_rec(4, L);
+       L = supprimer_rec(2, L);
        visualiser_rec(L);
        visualiser_iter(L);
        liberer_rec(L);
+       //liberer_iter(L);
        /* ... */
 }
 
 /****************************************************************************/
+/* vim:noet:ts=8:sw=8:textwidth=80 */