TP5 exo4: implement more functions
[Algorithmic_C.git] / TP5 / exo4 / liste_chainee.c
index a8589397a6aba3bf8da83b37936aedb2918203b3..851e35428f6d63f1ad12b2805500501bbb79effd 100644 (file)
@@ -12,7 +12,7 @@ typedef struct cellule {
        struct cellule *suivant;
 } Cellule, *Liste;
 
-Cellule *creer_maillon(element e, Cellule *suivant)
+Cellule *creer_maillon(element e, Cellule * suivant)
 {
        Cellule *pnouveau = malloc(sizeof(Cellule));
        pnouveau->valeur = e;
@@ -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 */
@@ -136,18 +135,19 @@ 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) {
                        free(L);
                        pavant->suivant = NULL;
                        return pdebut;
-               /* supprimer au début de la liste */
+                       /* supprimer au début de la liste */
                } else if (L->valeur == e && pavant == NULL) {
                        Cellule *pcourant = L;
                        free(L);
                        return pcourant->suivant;
-               /* supprimer au mileu de la liste */
+                       /* supprimer au mileu de la liste */
                } else if (L->valeur == e) {
                        Cellule *pcourant = L;
                        free(L);
@@ -162,7 +162,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)
@@ -218,13 +228,16 @@ 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);
+       liberer_rec(L);
+       //liberer_iter(L);
        /* ... */
 }