From: Jérôme Benoit Date: Wed, 8 Mar 2017 11:01:42 +0000 (+0100) Subject: TP5 exo4: Add three functions to the linked list operations: X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=0bf26b292b13186904bfa507ae430438f61ec02f;p=Algorithmic_C.git TP5 exo4: Add three functions to the linked list operations: - ajouter_rec; - creer_maillon; - supprimer_iter; Signed-off-by: Jérôme Benoit --- diff --git a/TP5/exo4/liste_chainee.c b/TP5/exo4/liste_chainee.c index c04ccc2..746241b 100644 --- a/TP5/exo4/liste_chainee.c +++ b/TP5/exo4/liste_chainee.c @@ -12,13 +12,19 @@ typedef struct cellule { struct cellule *suivant; } Cellule, *Liste; +Cellule *creer_maillon(element e, Cellule * suivant) +{ + Cellule *pnouveau = malloc(sizeof(Cellule)); + pnouveau->valeur = e; + pnouveau->suivant = suivant; + return pnouveau; +} + Liste ajouter_iter(element e, Liste L) { Cellule *pc, *p1 = L, *p2 = NULL; - pc = (Cellule *) malloc(sizeof(Cellule)); - pc->valeur = e; - pc->suivant = NULL; + pc = creer_maillon(e, NULL); if (!L) /* liste vide */ return pc; @@ -75,6 +81,7 @@ 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); @@ -109,20 +116,48 @@ bool rechercher_iter(element e, Liste L) Liste rechercher_rec(element e, Liste L) { - if (L->valeur != e && L->suivant != NULL) - { + if (L->valeur != e && L->suivant != NULL) { return L = rechercher_rec(e, L->suivant); } } Liste ajouter_rec(element e, Liste L) { - /* ... */ + if (!L || !(L->valeur < e)) { + return creer_maillon(e, L); + } + + L->suivant = ajouter_rec(e, L->suivant); + + return L; } 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 */ + } else if (L->valeur == e && pavant == NULL) { + Cellule *pcourant = L; + free(L); + return pcourant->suivant; + /* supprimer au mileu de la liste */ + } else if (L->valeur == e) { + Cellule *pcourant = L; + free(L); + L = pavant; + L->suivant = pcourant->suivant->suivant; + return pdebut; + } + pavant = L; + L = L->suivant; + } } Liste supprimer_rec(element e, Liste L) @@ -140,6 +175,14 @@ Liste inverser_rec(Liste L) /* ... */ } +void liberer_rec(Liste L) +{ + if (!L) { + liberer_rec(L->suivant); + free(L); + } +} + /****************************************************************************/ int main() { @@ -162,6 +205,16 @@ int main() printf("L'element %d est present dans L\n", x); else printf("L'element %d n'est pas present dans L\n", x); + L = ajouter_rec(6, L); + 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); + visualiser_rec(L); + visualiser_iter(L); + liberer_rec(L); /* ... */ }