diff --git a/dico.c b/dico.c index 9075e87..a4fd5a4 100644 --- a/dico.c +++ b/dico.c @@ -21,10 +21,12 @@ void init_dico() arbre=NULL; } */ -ptarbre rech(ptarbre arbre, char lettre) +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 arbre; + arbre=arbre_ori; printf("rech adr abre deb %p \n", arbre); if (arbre!=NULL) { @@ -39,11 +41,56 @@ ptarbre rech(ptarbre arbre, char lettre) 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) { (*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)->suivant=NULL; (*parbre)->lettre=lettre; (*parbre)->fin_mot=false; @@ -67,8 +114,8 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) (*parbresuiv)->fils->suivant=NULL; (*parbresuiv)->suivant=NULL; (*parbresuiv)->fin_mot=false; - (*parbre)->lettre=lettre; - printf("ajout lettre : %c à %p \n",(*parbre)->lettre, parbre); + (*parbresuiv)->lettre=lettre; + printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); } void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) @@ -82,18 +129,21 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) { if (arbre->fils != NULL) { - printf("%c",arbre->lettre); mot[n_lettre]=arbre->lettre; n_lettre++; - affiche_dico(arbre->fils,n_lettre,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); - affiche_dico(arbre->suivant, n_lettre, mot); + printf("%s",mot); + // mot[n_lettre]=arbre->lettre; } - mot[n_lettre]=0; + affiche_dico(arbre->suivant, n_lettre, mot); + mot[n_lettre]='\0'; n_lettre--; } @@ -114,6 +164,18 @@ 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) { @@ -136,6 +198,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, { printf("arbre null\n"); init_dico(parbre,c); + (*parbre_prec)=(*parbre); (*parbre)=(*parbre)->fils; } @@ -147,14 +210,15 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, if (rec->lettre!=c) { - if (rec==(*parbre)) // 1ere lettre de la liste + 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; } - if (rec->suivant==NULL) + else if (rec->suivant==NULL && rec->lettre!='\0') { printf("rech suiv = NUll \n"); @@ -169,7 +233,7 @@ 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("adr rec %p adr rec fils %p\n", rec, rec->fils); + 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 // @@ -182,11 +246,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, printf("c==n \n"); if ((*parbre_originel)!=NULL) { - printf("%c \n", (*parbre_prec)->lettre); + 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)); @@ -197,11 +262,10 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, int main() { - char mot[30]; + char mot[30]=""; int n_lettre=0; ptarbre arbre_originel,arbre,arbre_prec; arbre_originel=NULL; - printf("adr arbre _ori %p\n", &arbre_originel); arbre=NULL; // Ouvrir fichier FILE *fp = fopen("words1.txt","r"); @@ -210,85 +274,10 @@ int main() else printf("words1 accessible \n",fp); cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp); - /* while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier - { - if (c != '\n') - { - if (arbre_originel==NULL) // Cas où c'est le premier mot premiere lettre - { - printf("arbre =NULL \n"); - init_dico(&arbre_originel,c); - printf("lettre arbre :%c \n",arbre_originel->lettre); - arbre_prec=arbre_originel; - arbre=arbre_originel->fils; - } - else if (arbre==NULL) // premier mot de l'arbre - { - init_dico(&arbre,c); - arbre=arbre->fils; - } - - else // Cas où le dico n'est pas vide - { - // printf("lettre arbre :%c \n",arbre->lettre); - printf(" c: %c\n", c); - rec=rech(arbre,c); - if (rec->lettre!=c) - { - - if (rec==arbre) // 1ere lettre de la liste - { - printf("1ere lettre\n"); - ajout_dico_tete(&arbre,c); - arbre=arbre->fils; - } - - if (rec->suivant==NULL) - { - - 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); - arbre_prec=arbre; - arbre=rec->suivant->fils; - } - } - - 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("adr rec %p adr rec fils %p\n", rec, rec->fils); - arbre_prec=arbre; - arbre=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre - // - } - - - } - } - else { - printf("c=='\ n' \n"); - if (arbre_originel!=NULL) - { - printf("%c \n", arbre_prec->lettre); - arbre_prec->fin_mot=true; // Cette lettre est la dernière du mot - } - - affiche_dico(arbre_originel,n_lettre,mot); - printf("remise à 0\n"); - printf("avant egal arbre %p arbre ori %p \n", arbre, arbre_originel); - arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot - printf("apres egal arbre %p arbre ori %p \n", arbre, arbre_originel); - } - //arbre=arbre_originel; - } - */ - // printf("arbre originel lettre %c \n", arbre_originel->fils->lettre); - affiche_dico(arbre_originel,n_lettre,mot); + //affiche_dico(arbre_originel,n_lettre,mot); + print_tout(arbre_originel,n_lettre, mot); free_tree(&arbre); fclose(fp); - return 0; } -- libgit2 0.21.2