From: Jérôme Benoit Date: Sat, 1 Apr 2017 16:22:39 +0000 (+0200) Subject: TP6: n-ary tree: add insert and destroy functions X-Git-Url: https://git.piment-noir.org/?p=Algorithmic_C.git;a=commitdiff_plain;h=915495850ca055b20497568512c3e70a6b61a13c TP6: n-ary tree: add insert and destroy functions The insert functions still have issue on returning the tree's head Signed-off-by: Jérôme Benoit --- diff --git a/TP6/arbres/arbre-n-aire/Makefile b/TP6/arbres/arbre_n_aire/Makefile similarity index 100% rename from TP6/arbres/arbre-n-aire/Makefile rename to TP6/arbres/arbre_n_aire/Makefile diff --git a/TP6/arbres/arbre-n-aire/arbre_n_aire.c b/TP6/arbres/arbre_n_aire/arbre_n_aire.c 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 e8b3201..bfed52c 100644 --- a/TP6/arbres/arbre-n-aire/arbre_n_aire.c +++ b/TP6/arbres/arbre_n_aire/arbre_n_aire.c @@ -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 */ } diff --git a/TP6/arbres/arbre-n-aire/dictionnaire b/TP6/arbres/arbre_n_aire/dictionnaire similarity index 100% rename from TP6/arbres/arbre-n-aire/dictionnaire rename to TP6/arbres/arbre_n_aire/dictionnaire