TP6: n-ary tree: add insert and destroy functions
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 1 Apr 2017 16:22:39 +0000 (18:22 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 1 Apr 2017 16:22:39 +0000 (18:22 +0200)
The insert functions still have issue on returning the tree's head

Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
TP6/arbres/arbre_n_aire/Makefile [moved from TP6/arbres/arbre-n-aire/Makefile with 100% similarity]
TP6/arbres/arbre_n_aire/arbre_n_aire.c [moved from TP6/arbres/arbre-n-aire/arbre_n_aire.c with 89% similarity]
TP6/arbres/arbre_n_aire/dictionnaire [moved from TP6/arbres/arbre-n-aire/dictionnaire with 100% similarity]

similarity index 89%
rename from TP6/arbres/arbre-n-aire/arbre_n_aire.c
rename to TP6/arbres/arbre_n_aire/arbre_n_aire.c
index e8b32016e734782c2f7bddf889c4275cc3a203f8..bfed52c9dc89f0c26bb2cca9a57cbf4b04388f32 100644 (file)
@@ -1,5 +1,4 @@
 /*****************************************************************************/
-
 /*                          arbre_n_aire.c                                   */
 /*     Representation d'un ensemble de mots sous forme d'arbre n-aire        */
 /*****************************************************************************/
@@ -56,21 +55,27 @@ 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);
     }
     if (mot[i] > p->lettre) {
-       return insere(p->frere, mot, i);
+       return _insere(p->frere, mot, i);
     } else if (mot[i] == p->lettre) {
-       return insere(p->fils, mot, i + 1);
-    } else {
-       return insere_fin(mot, i);
+       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)
@@ -148,8 +153,15 @@ NOEUD *charge_dico(char *nom_fichier, int *nb_mots)
 /* Ecriture dans fp de tous les mots stockes dans l'arbre ********************/
 void affiche_fich(FILE * fp, NOEUD * p, char *mot, int i)
 {
-    /* TODO */
-    /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */
+    /* i est l'indice de la lettre courante dans le mot */
+    if (p != NULL) {
+       mot[i] = p->lettre;
+       affiche_fich(fp, p->fils, mot, i + 1);
+       if (mot[i] == '\0') {
+           fprintf(fp, "%s\n", mot);
+       }
+       affiche_fich(fp, p->frere, mot, i);
+    }
 }
 
 /* Sauvegarde des mots de l'arbre dans un fichier ****************************/
@@ -162,7 +174,7 @@ void sauve_dico(NOEUD * p, char *nom_fichier, int nb_mots)
     if (fp == NULL)
        exit(-1);
     fprintf(fp, "%d\n", nb_mots);
-    affiche_fich(fp, p, mot, 0);       /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */
+    affiche_fich(fp, p, mot, 0);
     fclose(fp);
 }
 
@@ -184,7 +196,10 @@ int main(int argc, char *argv[])
     affiche_arbre(arbre, 0);
     if (recherche(arbre, "salut", 0))
        printf("mot \"salut\" present\n");
+    sauve_dico(arbre, "dictionnaire_debug", nb_mots);
     detruis_arbre(arbre);
+    if (!arbre)
+       affiche_arbre(arbre, 0);
     /* TODO */
 }