TP6 n ary tree: Fix some memleaks
[Algorithmic_C.git] / TP6 / arbres / arbre_n_aire / arbre_n_aire.c
index bfed52c9dc89f0c26bb2cca9a57cbf4b04388f32..163412d741e170032ee2d889e77ef1e235a51588 100644 (file)
@@ -55,27 +55,28 @@ NOEUD *insere_fin(char *mot, int i)
 
 /* Insertion d'un mot dans l'arbre ******************************************/
 /* (on respecte l'ordre lexicographique des freres)**************************/
-NOEUD *_insere(NOEUD * p, char *mot, int i)
+NOEUD *insere(NOEUD * p, char *mot, int i)
 {
     /* i est l'indice de la lettre courante dans le mot */
     if (p == NULL) {
        return insere_fin(mot, i);
+    } else if (p->lettre == mot[i]) {
+       if (mot[i] == '\0') {
+           p->fils = insere(p->fils, mot, i + 1);
+       } else {
+           printf("The word is already here\n");
+       }
+    } else if (p->lettre > mot[i]) {
+       NOEUD *p1 = insere_fin(mot, i);
+       p1->frere = p;
+       p = p1;
+    } else {
+       p->frere = insere(p->frere, mot, i);
     }
-    if (mot[i] > p->lettre) {
-       return _insere(p->frere, mot, i);
-    } else if (mot[i] == p->lettre) {
-       return _insere(p->fils, mot, i + 1);
-    } else if (mot[i] < p->lettre) {
-       return _insere(p->fils, mot, i);
-    }
-}
-
-NOEUD *insere(NOEUD * p, char *mot, int i)
-{
-    p = _insere(p, mot, i);
     return p;
 }
 
+
 /*****************************************************************************/
 /* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre    */
 void affiche(NOEUD * p, char *mot, int i)
@@ -93,7 +94,7 @@ void affiche(NOEUD * p, char *mot, int i)
 
 /* Visualisation de l'arbre n-aire *******************************************/
 void affiche_arbre(NOEUD * p, int prof)
-/* prof est utilise pour decaller l'affichage avec des espaces  (selon le niveau dans l'arbre) */
+/* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */
 {
     int i;
 
@@ -111,8 +112,19 @@ void affiche_arbre(NOEUD * p, int prof)
 NOEUD *supprime(NOEUD * p, char *mot, int i)
 /* i est l'indice de la lettre courante dans le mot */
 {
-    /* TODO */
-    return p;
+    if (p) {
+       if (p->lettre < mot[i]) {
+           p->frere = supprime(p->frere, mot, i);
+       } else if (p->lettre == mot[i]) {
+           p->fils = supprime(p->fils, mot, i + 1);
+           if (!p->fils) {
+               NOEUD *p1 = p;
+               p = p->frere;
+               free(p1);
+           }
+           return p;
+       }
+    }
 }
 
 /* Destruction des arbres de racine p en recuperant la place occupee (free) par chacun des noeuds  */
@@ -197,6 +209,8 @@ int main(int argc, char *argv[])
     if (recherche(arbre, "salut", 0))
        printf("mot \"salut\" present\n");
     sauve_dico(arbre, "dictionnaire_debug", nb_mots);
+    supprime(arbre, "zazou", 0);
+    affiche_arbre(arbre, 0);
     detruis_arbre(arbre);
     if (!arbre)
        affiche_arbre(arbre, 0);