From 5016b118716d7ce33ad81bfc246c7df97f2fbdf5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 6 Apr 2017 11:55:15 +0200 Subject: [PATCH] TP6 n ary tree: Fix some memleaks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- TP6/arbres/arbre_n_aire/arbre_n_aire.c | 2 +- .../arbre_n_aire_c1/arbre_n_aire_correction.c | 16 ++++++++++++++ .../arbre_n_aire_c2/arbre_n_aire_correction.c | 21 ++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/TP6/arbres/arbre_n_aire/arbre_n_aire.c b/TP6/arbres/arbre_n_aire/arbre_n_aire.c index 7713d72..163412d 100644 --- a/TP6/arbres/arbre_n_aire/arbre_n_aire.c +++ b/TP6/arbres/arbre_n_aire/arbre_n_aire.c @@ -61,7 +61,7 @@ NOEUD *insere(NOEUD * p, char *mot, int i) if (p == NULL) { return insere_fin(mot, i); } else if (p->lettre == mot[i]) { - if (mot[i]) { + if (mot[i] == '\0') { p->fils = insere(p->fils, mot, i + 1); } else { printf("The word is already here\n"); diff --git a/TP6/arbres/arbre_n_aire_c1/arbre_n_aire_correction.c b/TP6/arbres/arbre_n_aire_c1/arbre_n_aire_correction.c index ebffbaa..1d972b2 100644 --- a/TP6/arbres/arbre_n_aire_c1/arbre_n_aire_correction.c +++ b/TP6/arbres/arbre_n_aire_c1/arbre_n_aire_correction.c @@ -153,6 +153,7 @@ NOEUD *supprime(NOEUD * p, char *mot, int i) return p; } + /*****************************************************************************/ NOEUD *charge_dico(char *nom_fichier, int *nb_mots) { @@ -175,6 +176,20 @@ NOEUD *charge_dico(char *nom_fichier, int *nb_mots) } +NOEUD *detruis_arbre(NOEUD * p) +{ + if (p == NULL) + return p; + else { + p->fils = detruis_arbre(p->fils); + p->frere = detruis_arbre(p->frere); + free(p); + p = NULL; + return p; + } +} + + /*****************************************************************************/ void sauve_dico(NOEUD * p, char *nom_fichier, int nb_mots) { @@ -263,6 +278,7 @@ int main(int argc, char *argv[]) } while (strcmp(mot, "0")); /* affiche_fich(stdout,arbre,mot,0); */ + detruis_arbre(arbre); } diff --git a/TP6/arbres/arbre_n_aire_c2/arbre_n_aire_correction.c b/TP6/arbres/arbre_n_aire_c2/arbre_n_aire_correction.c index 71cb523..08f4e17 100644 --- a/TP6/arbres/arbre_n_aire_c2/arbre_n_aire_correction.c +++ b/TP6/arbres/arbre_n_aire_c2/arbre_n_aire_correction.c @@ -40,7 +40,6 @@ NOEUD *recherche(NOEUD * p, char *mot) return cherche(p, mot, 0); } - /* Création d'une fin de mot - liste chaînée suivant le lien fils **********/ NOEUD *insere_fin(char *mot, int i) { @@ -153,6 +152,20 @@ NOEUD *supprime(NOEUD * p, char *mot, int i) return p; } + +NOEUD *detruis_arbre(NOEUD * p) +{ + if (p == NULL) + return p; + else { + p->fils = detruis_arbre(p->fils); + p->frere = detruis_arbre(p->frere); + free(p); + p = NULL; + return p; + } +} + /*****************************************************************************/ NOEUD *charge_dico(char *nom_fichier, int *nb_mots) { @@ -236,7 +249,7 @@ int Lectmot(FILE * fp, char *mot) Un exemple d'utilisation : ./arbre_n_aire dictionnaire.txt mondico.txt letexte.txt motsinconnus.txt -Les rguments de la ligne de commande sont : +Les arguments de la ligne de commande sont : argv[1] est le nom du dictionnaire d'entree argv[2] est le nom du dictionnaire apres insertion des nouveaux mots argv[3] est le texte a verifier @@ -290,7 +303,7 @@ int main(int argc, char *argv[]) sauve_dico(rac, argv[2], nb_mots); -/* pour tester la suppression */ + /* pour tester la suppression */ do { printf("Entrez un mot a supprimer (stop pour arreter) : "); scanf("%s", mot); @@ -299,6 +312,8 @@ int main(int argc, char *argv[]) affiche_fich(stdout, rac, mot, 0); } } while (strcmp(mot, "stop")); + + detruis_arbre(rac); } /****************************************************************************/ -- 2.34.1