#include #include #include typedef struct cell* ptarbre; typedef struct cell* ptcellule; typedef struct cell { char lettre; ptarbre fils; // Descend d'un étage dans le mot (lettre suivante du mot) ptcellule suivant; // Lettre suivante stockée à l'étage arbre en (ieme position) bool fin_mot; } cell; /* Pas utile void init_dico() { ptarbre arbre; arbre=NULL; } */ 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 { 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); } } return arbre; } void init_dico(ptarbre *parbre, char lettre) { (*parbre)=malloc(sizeof(cell)); (*parbre)->fils=malloc(sizeof(cell)); (*parbre)->fils->suivant=NULL; (*parbre)->suivant=NULL; (*parbre)->lettre=lettre; (*parbre)->fin_mot=false; printf("init dico\n"); } void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) { *parbresuiv=malloc(sizeof(cell)); (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre (*parbresuiv)->fils=malloc(sizeof(cell)); (*parbresuiv)->fils->suivant=NULL; (*parbresuiv)->suivant=NULL; (*parbresuiv)->fin_mot=false; (*parbresuiv)->lettre=lettre; printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); } void affiche_dico(ptarbre arbre) // affiche tout le dictionnaire à partir de l'arbre (donc le numéro de lettre) sélectionné { if(arbre == NULL) { return; } else { if (arbre->fils!=NULL) { printf("%c\n", (arbre->lettre)); while(arbre->suivant !=NULL) { printf("%c\n", (arbre->lettre)); affiche_dico(arbre->fils); arbre=arbre->suivant; } } } } void free_tree(cell **ptr_tree) { if ((*ptr_tree)==NULL) printf("L'arbre est vide\n"); else { if ((*ptr_tree)->fils!=NULL) free_tree(&((*ptr_tree)->fils)); if ((*ptr_tree)->suivant!=NULL) free_tree(&(*ptr_tree)->suivant); free(*ptr_tree); } } int main() { ptarbre arbre_originel,arbre,arbre_prec; arbre_originel=NULL; arbre=NULL; char c,t; 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 { if (c != '\n') { if (arbre_originel==NULL) // Cas où c'est le premier mot { 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 // 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->suivant==NULL && rec->lettre!=c) { printf("rech suiv = NUll \n"); ajout_dico(&(arbre),&(rec),c); // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils); arbre_prec=arbre; arbre=rec->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); arbre_prec=arbre; arbre=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre // } } } else { printf("else\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); printf("remise à 0\n"); arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot } //arbre=arbre_originel; } printf("arbre originel lettre %c \n", arbre_originel->fils->lettre); affiche_dico(arbre_originel); free_tree(&arbre); fclose(fp); return 0; }