diff --git a/dico.c b/dico.c index 03364a9..9075e87 100644 --- a/dico.c +++ b/dico.c @@ -25,26 +25,38 @@ ptarbre rech(ptarbre arbre, char lettre) // recherche une lettre en ième position (correspondant à arbre) // Retourne l'adresse de l'arbre contenant la lettre à cette position { + 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); + 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 init_dico(ptarbre *parbre, char lettre) + +void init_dico(ptarbre* parbre, char lettre) { (*parbre)=malloc(sizeof(cell)); (*parbre)->fils=malloc(sizeof(cell)); + (*parbre)->suivant=NULL; + (*parbre)->lettre=lettre; + (*parbre)->fin_mot=false; +} + +void ajout_dico_tete(ptarbre *parbre, char lettre) +{ + (*parbre)->fils=malloc(sizeof(cell)); (*parbre)->fils->suivant=NULL; (*parbre)->suivant=NULL; (*parbre)->lettre=lettre; (*parbre)->fin_mot=false; - printf("init dico\n"); + printf("ajout dico tete adr %p\n",(* parbre)); } void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) @@ -55,8 +67,8 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) (*parbresuiv)->fils->suivant=NULL; (*parbresuiv)->suivant=NULL; (*parbresuiv)->fin_mot=false; - (*parbresuiv)->lettre=lettre; - printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); + (*parbre)->lettre=lettre; + printf("ajout lettre : %c à %p \n",(*parbre)->lettre, parbre); } void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) @@ -75,7 +87,7 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) n_lettre++; affiche_dico(arbre->fils,n_lettre,mot); } - printf("\n"); + printf("\n"); if (arbre->suivant != NULL) { printf("%s",mot); @@ -102,55 +114,151 @@ void free_tree(cell **ptr_tree) } } +void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp) +{ + + char c,t; + 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); + (*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)=(*parbre)->fils; + } + + 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)) // 1ere lettre de la liste + { + printf("1ere lettre\n"); + ajout_dico_tete(parbre,c); + (*parbre)=(*parbre)->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); + (*parbre_prec)=(*parbre); + (*parbre)=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); + (*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("%c \n", (*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"); + 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; + } +} int main() { + 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; - char c,t, mot[30]; - int n_lettre=0; - ptarbre rec; // Ouvrir fichier FILE *fp = fopen("words1.txt","r"); if (fp==NULL) printf("words1 inaccessible \n",fp); else printf("words1 accessible \n",fp); - - while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier + 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 + 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("lettre arbre :%c \n",arbre->lettre); printf(" c: %c\n", c); rec=rech(arbre,c); - - if (rec->suivant==NULL && rec->lettre!=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(&(arbre),&(rec->suivant),c); - // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils); - arbre_prec=arbre; - arbre=rec->suivant->fils; + 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 suiv pas null rec lettre %c\n", rec->lettre); + //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 // @@ -160,7 +268,7 @@ int main() } } else { - printf("else\n"); + printf("c=='\ n' \n"); if (arbre_originel!=NULL) { printf("%c \n", arbre_prec->lettre); @@ -169,11 +277,14 @@ int main() 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); + */ + // printf("arbre originel lettre %c \n", arbre_originel->fils->lettre); affiche_dico(arbre_originel,n_lettre,mot); free_tree(&arbre); fclose(fp); -- libgit2 0.21.2