From 253ecfa4c2a25c0d9227d6a727fb1c60ae8fbdc6 Mon Sep 17 00:00:00 2001 From: vsalingu Date: Thu, 2 May 2019 18:39:17 +0200 Subject: [PATCH] Dico ok vérifié grâce à la fonction d'affichage --- dico.c | 129 ++++++++++++++++++++------------------------------------------------------------------------------------------------------------- 1 file changed, 20 insertions(+), 109 deletions(-) diff --git a/dico.c b/dico.c index a4fd5a4..84eb8d1 100644 --- a/dico.c +++ b/dico.c @@ -14,99 +14,43 @@ typedef struct cell { bool fin_mot; } cell; -/* Pas utile -void init_dico() -{ - ptarbre arbre; - arbre=NULL; -} -*/ -ptarbre rech(ptarbre arbre_ori, char lettre) -// recherche une lettre en ième position (correspondant à arbre) -// Retourne l'adresse de l'arbre contenant la lettre à cette position + +ptarbre rech(ptarbre arbre, char lettre) +// Fonction qui cherche une lettre passée en paramètre à partir d'une cellule à l'adresse arbre et qui retourne l'adresse d'une cellule, soit parce qu'il n'y a plus de cellules après, soit car c'est la cellule où se trouve la lettre passée en paramètre. { - ptarbre arbre; - arbre=arbre_ori; - printf("rech adr abre deb %p \n", arbre); if (arbre!=NULL) { - printf("arbre lettre %c \n", arbre->lettre); while ((arbre->suivant!=NULL) && (arbre->lettre != lettre)) { - printf("lettre : %c lettre cherchee : %c adr arbre %p \n", arbre->lettre,lettre, arbre); arbre=(arbre->suivant); - printf("adr arbre while %p \n", arbre); } } - printf("retourne adr %p lettre %c\n", arbre, arbre->lettre); return arbre; } -void print_tout(struct cell *arbre, int cpt, char *debut_mot) -{ - //Return si aucune lettre stockée - if(arbre==NULL){ - return; - } - - printf("%c", arbre->lettre); - - - //Si fin de mot, retour à la ligne - if(arbre->fin_mot == true){ - printf("\n"); - - //Si fin de mot mais encore des lettres dans 'Son' (-> merci mercier), on affiche la base commune - if (arbre->fils != NULL){ - debut_mot[cpt] = arbre->lettre; - printf("%s", debut_mot); - } - } - - //On avance dans Son, on stock la lettre dans début_mot - debut_mot[cpt] = arbre->lettre; - cpt ++; - - - //On print Son - print_tout(arbre->fils, cpt, debut_mot); - - //On remonte l'arbre, on enleve une lettre de la racine commune - cpt --; - debut_mot[cpt] = '\0'; - - - //Si lettre dans arbre Brother -> nouveau mot -> Retour à la ligne (changement de mot) - if(arbre->suivant != NULL){ - - //On imprime alors la racine commune - printf("%s", debut_mot); - } - - //On print - print_tout(arbre->suivant, cpt, debut_mot); -} void init_dico(ptarbre* parbre, char lettre) +// Action qui initialise une cellule de type cell à l'adresse (*parbre) et qui ajoute à cette cellule la première lettre du texte, alloue de la mémoire pour le fils . { (*parbre)=malloc(sizeof(cell)); (*parbre)->fils=malloc(sizeof(cell)); - (*parbre)->fils->lettre= '\0'; // Permet de savoir qu'il n'y a pas de lettre dans l'étage en dessous pour différencier s'il faut utiliser ajout tete ou ajout dico + (*parbre)->fils->lettre= '\0'; // Permet de savoir qu'il n'y a pas de lettre dans l'étage en dessous. Par exemple, si on est en train de construire le mot voir, avec 'v' et 'o' déjà dans l'arbre, arpès la lettre 'o' on met '\0' pour différencier s'il faut utiliser ajout tete ou ajout dico pour ajouter le 'i'. (*parbre)->suivant=NULL; (*parbre)->lettre=lettre; (*parbre)->fin_mot=false; } void ajout_dico_tete(ptarbre *parbre, char lettre) +// Action qui ajoute la première cellule d'un étage, utile pour le premier mot et pour les mots suivants qui sont plus longs que les précédents. Pour le premier mot 'voir', on utilise init_dico et pour les 3 autres lettres on utilise ajout_dico_tete. Ensuite, pour voile, on utilise ajout_dico pour 'v','o','i','l' et ajout_dico pour 'e'. { (*parbre)->fils=malloc(sizeof(cell)); (*parbre)->fils->suivant=NULL; (*parbre)->suivant=NULL; (*parbre)->lettre=lettre; (*parbre)->fin_mot=false; - printf("ajout dico tete adr %p\n",(* parbre)); } void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) +// Action qui ajoute une lettre dans un étage existant, en faisant le lien entre la cellule d'avant à l'adresse *parbre et la nouvelle cellule à l'adresse *parbresuiv en ajoutant la lettre passée en paramètre à la nouvelle cellule. { *parbresuiv=malloc(sizeof(cell)); (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre @@ -115,7 +59,6 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) (*parbresuiv)->suivant=NULL; (*parbresuiv)->fin_mot=false; (*parbresuiv)->lettre=lettre; - printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); } void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) @@ -132,21 +75,23 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) mot[n_lettre]=arbre->lettre; n_lettre++; } + if (arbre->fin_mot) + { + printf("%s",mot); + printf("\n"); + } - printf("%c",arbre->lettre); affiche_dico(arbre->fils,n_lettre,mot); - if (arbre->fin_mot) - printf("\n"); if (arbre->suivant != NULL) { - printf("%s",mot); - // mot[n_lettre]=arbre->lettre; + n_lettre--; + mot[n_lettre]='\0'; } affiche_dico(arbre->suivant, n_lettre, mot); - mot[n_lettre]='\0'; n_lettre--; + mot[n_lettre]='\0'; - } + } } @@ -164,18 +109,6 @@ void free_tree(cell **ptr_tree) } } -void print_suiv(ptarbre arbre) -{ - if (arbre!=NULL) - { - while(arbre->suivant!=NULL) - {printf("-%c_", arbre->lettre); - arbre=arbre->suivant; - } - } - printf("\n"); -} - void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp) { @@ -183,20 +116,16 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, ptarbre rec; while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier { - printf("c= %c \n",c); if (c != '\n') { if ((*parbre_originel)==NULL) // Cas où c'est le premier mot premiere lettre { - printf("arbre ori =NULL \n"); - init_dico(parbre_originel,c); - printf("lettre arbre :%c \n",(*parbre_originel)->lettre); + init_dico(parbre_originel,c);; (*parbre_prec)=(*parbre_originel); (*parbre)=(*parbre_originel)->fils; } else if ((*parbre)==NULL) // premier mot de l'arbre { - printf("arbre null\n"); init_dico(parbre,c); (*parbre_prec)=(*parbre); (*parbre)=(*parbre)->fils; @@ -204,15 +133,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, else // Cas où le dico n'est pas vide { - // printf("lettre arbre :%c \n",arbre->lettre); - printf(" dico pas vide c: %c\n", c); rec=rech((*parbre),c); if (rec->lettre!=c) { if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste { - printf("1ere lettre\n"); ajout_dico_tete(parbre,c); (*parbre_prec)=(*parbre); (*parbre)=(*parbre)->fils; @@ -220,11 +146,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, else if (rec->suivant==NULL && rec->lettre!='\0') { - - printf("rech suiv = NUll \n"); ajout_dico(&(rec),&(rec->suivant),c); - - // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils); (*parbre_prec)=(*parbre); (*parbre)=rec->suivant->fils; } @@ -232,31 +154,21 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, else {// Cas où le début du mot existe déjà et qu'on le complète - //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre); - printf("lettre trouvee %c\n", rec->lettre); (*parbre_prec)=(*parbre); (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre - // + } } } else { - printf("c==n \n"); if ((*parbre_originel)!=NULL) { - printf("adr arbre prec %p et lettre %c \n", (*parbre_prec),(*parbre_prec)->lettre); (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot } - // affiche_dico((*parbre_originel),n_lettre,mot); - printf("remise à 0\n"); - print_suiv((*parbre)); - printf("avant egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel)); (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot - printf("apres egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel)); } - //arbre=arbre_originel; } } @@ -268,14 +180,13 @@ int main() arbre_originel=NULL; arbre=NULL; // Ouvrir fichier - FILE *fp = fopen("words1.txt","r"); + FILE *fp = fopen("words","r"); if (fp==NULL) printf("words1 inaccessible \n",fp); else printf("words1 accessible \n",fp); cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp); - //affiche_dico(arbre_originel,n_lettre,mot); - print_tout(arbre_originel,n_lettre, mot); + affiche_dico(arbre_originel,n_lettre,mot); free_tree(&arbre); fclose(fp); -- libgit2 0.21.2