Commit 253ecfa4c2a25c0d9227d6a727fb1c60ae8fbdc6

Authored by vsalingu
1 parent 04d73ac1

Dico ok vérifié grâce à la fonction d'affichage

Showing 1 changed file with 20 additions and 109 deletions   Show diff stats
@@ -14,99 +14,43 @@ typedef struct cell { @@ -14,99 +14,43 @@ typedef struct cell {
14 bool fin_mot; 14 bool fin_mot;
15 } cell; 15 } cell;
16 16
17 -/* Pas utile  
18 -void init_dico()  
19 -{  
20 - ptarbre arbre;  
21 - arbre=NULL;  
22 -}  
23 -*/  
24 -ptarbre rech(ptarbre arbre_ori, char lettre)  
25 -// recherche une lettre en ième position (correspondant à arbre)  
26 -// Retourne l'adresse de l'arbre contenant la lettre à cette position 17 +
  18 +ptarbre rech(ptarbre arbre, char lettre)
  19 +// 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.
27 { 20 {
28 - ptarbre arbre;  
29 - arbre=arbre_ori;  
30 - printf("rech adr abre deb %p \n", arbre);  
31 if (arbre!=NULL) 21 if (arbre!=NULL)
32 { 22 {
33 - printf("arbre lettre %c \n", arbre->lettre);  
34 while ((arbre->suivant!=NULL) && (arbre->lettre != lettre)) 23 while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
35 { 24 {
36 - printf("lettre : %c lettre cherchee : %c adr arbre %p \n", arbre->lettre,lettre, arbre);  
37 arbre=(arbre->suivant); 25 arbre=(arbre->suivant);
38 - printf("adr arbre while %p \n", arbre);  
39 } 26 }
40 } 27 }
41 - printf("retourne adr %p lettre %c\n", arbre, arbre->lettre);  
42 return arbre; 28 return arbre;
43 } 29 }
44 -void print_tout(struct cell *arbre, int cpt, char *debut_mot)  
45 -{  
46 - //Return si aucune lettre stockée  
47 - if(arbre==NULL){  
48 - return;  
49 - }  
50 -  
51 - printf("%c", arbre->lettre);  
52 -  
53 -  
54 - //Si fin de mot, retour à la ligne  
55 - if(arbre->fin_mot == true){  
56 - printf("\n");  
57 -  
58 - //Si fin de mot mais encore des lettres dans 'Son' (-> merci mercier), on affiche la base commune  
59 - if (arbre->fils != NULL){  
60 - debut_mot[cpt] = arbre->lettre;  
61 - printf("%s", debut_mot);  
62 - }  
63 - }  
64 -  
65 - //On avance dans Son, on stock la lettre dans début_mot  
66 - debut_mot[cpt] = arbre->lettre;  
67 - cpt ++;  
68 -  
69 -  
70 - //On print Son  
71 - print_tout(arbre->fils, cpt, debut_mot);  
72 -  
73 - //On remonte l'arbre, on enleve une lettre de la racine commune  
74 - cpt --;  
75 - debut_mot[cpt] = '\0';  
76 -  
77 -  
78 - //Si lettre dans arbre Brother -> nouveau mot -> Retour à la ligne (changement de mot)  
79 - if(arbre->suivant != NULL){  
80 -  
81 - //On imprime alors la racine commune  
82 - printf("%s", debut_mot);  
83 - }  
84 -  
85 - //On print  
86 - print_tout(arbre->suivant, cpt, debut_mot);  
87 -}  
88 30
89 void init_dico(ptarbre* parbre, char lettre) 31 void init_dico(ptarbre* parbre, char lettre)
  32 +// 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 .
90 { 33 {
91 (*parbre)=malloc(sizeof(cell)); 34 (*parbre)=malloc(sizeof(cell));
92 (*parbre)->fils=malloc(sizeof(cell)); 35 (*parbre)->fils=malloc(sizeof(cell));
93 - (*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 36 + (*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'.
94 (*parbre)->suivant=NULL; 37 (*parbre)->suivant=NULL;
95 (*parbre)->lettre=lettre; 38 (*parbre)->lettre=lettre;
96 (*parbre)->fin_mot=false; 39 (*parbre)->fin_mot=false;
97 } 40 }
98 41
99 void ajout_dico_tete(ptarbre *parbre, char lettre) 42 void ajout_dico_tete(ptarbre *parbre, char lettre)
  43 +// 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'.
100 { 44 {
101 (*parbre)->fils=malloc(sizeof(cell)); 45 (*parbre)->fils=malloc(sizeof(cell));
102 (*parbre)->fils->suivant=NULL; 46 (*parbre)->fils->suivant=NULL;
103 (*parbre)->suivant=NULL; 47 (*parbre)->suivant=NULL;
104 (*parbre)->lettre=lettre; 48 (*parbre)->lettre=lettre;
105 (*parbre)->fin_mot=false; 49 (*parbre)->fin_mot=false;
106 - printf("ajout dico tete adr %p\n",(* parbre));  
107 } 50 }
108 51
109 void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) 52 void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
  53 +// 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.
110 { 54 {
111 *parbresuiv=malloc(sizeof(cell)); 55 *parbresuiv=malloc(sizeof(cell));
112 (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre 56 (*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) @@ -115,7 +59,6 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
115 (*parbresuiv)->suivant=NULL; 59 (*parbresuiv)->suivant=NULL;
116 (*parbresuiv)->fin_mot=false; 60 (*parbresuiv)->fin_mot=false;
117 (*parbresuiv)->lettre=lettre; 61 (*parbresuiv)->lettre=lettre;
118 - printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv);  
119 } 62 }
120 63
121 void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) 64 void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
@@ -132,21 +75,23 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) @@ -132,21 +75,23 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
132 mot[n_lettre]=arbre->lettre; 75 mot[n_lettre]=arbre->lettre;
133 n_lettre++; 76 n_lettre++;
134 } 77 }
  78 + if (arbre->fin_mot)
  79 + {
  80 + printf("%s",mot);
  81 + printf("\n");
  82 + }
135 83
136 - printf("%c",arbre->lettre);  
137 affiche_dico(arbre->fils,n_lettre,mot); 84 affiche_dico(arbre->fils,n_lettre,mot);
138 - if (arbre->fin_mot)  
139 - printf("\n");  
140 if (arbre->suivant != NULL) 85 if (arbre->suivant != NULL)
141 { 86 {
142 - printf("%s",mot);  
143 - // mot[n_lettre]=arbre->lettre; 87 + n_lettre--;
  88 + mot[n_lettre]='\0';
144 } 89 }
145 affiche_dico(arbre->suivant, n_lettre, mot); 90 affiche_dico(arbre->suivant, n_lettre, mot);
146 - mot[n_lettre]='\0';  
147 n_lettre--; 91 n_lettre--;
  92 + mot[n_lettre]='\0';
148 93
149 - } 94 + }
150 95
151 } 96 }
152 97
@@ -164,18 +109,6 @@ void free_tree(cell **ptr_tree) @@ -164,18 +109,6 @@ void free_tree(cell **ptr_tree)
164 } 109 }
165 } 110 }
166 111
167 -void print_suiv(ptarbre arbre)  
168 -{  
169 - if (arbre!=NULL)  
170 - {  
171 - while(arbre->suivant!=NULL)  
172 - {printf("-%c_", arbre->lettre);  
173 - arbre=arbre->suivant;  
174 - }  
175 - }  
176 - printf("\n");  
177 -}  
178 -  
179 void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp) 112 void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
180 { 113 {
181 114
@@ -183,20 +116,16 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, @@ -183,20 +116,16 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
183 ptarbre rec; 116 ptarbre rec;
184 while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier 117 while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier
185 { 118 {
186 - printf("c= %c \n",c);  
187 if (c != '\n') 119 if (c != '\n')
188 { 120 {
189 if ((*parbre_originel)==NULL) // Cas où c'est le premier mot premiere lettre 121 if ((*parbre_originel)==NULL) // Cas où c'est le premier mot premiere lettre
190 { 122 {
191 - printf("arbre ori =NULL \n");  
192 - init_dico(parbre_originel,c);  
193 - printf("lettre arbre :%c \n",(*parbre_originel)->lettre); 123 + init_dico(parbre_originel,c);;
194 (*parbre_prec)=(*parbre_originel); 124 (*parbre_prec)=(*parbre_originel);
195 (*parbre)=(*parbre_originel)->fils; 125 (*parbre)=(*parbre_originel)->fils;
196 } 126 }
197 else if ((*parbre)==NULL) // premier mot de l'arbre 127 else if ((*parbre)==NULL) // premier mot de l'arbre
198 { 128 {
199 - printf("arbre null\n");  
200 init_dico(parbre,c); 129 init_dico(parbre,c);
201 (*parbre_prec)=(*parbre); 130 (*parbre_prec)=(*parbre);
202 (*parbre)=(*parbre)->fils; 131 (*parbre)=(*parbre)->fils;
@@ -204,15 +133,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, @@ -204,15 +133,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
204 133
205 else // Cas où le dico n'est pas vide 134 else // Cas où le dico n'est pas vide
206 { 135 {
207 - // printf("lettre arbre :%c \n",arbre->lettre);  
208 - printf(" dico pas vide c: %c\n", c);  
209 rec=rech((*parbre),c); 136 rec=rech((*parbre),c);
210 if (rec->lettre!=c) 137 if (rec->lettre!=c)
211 { 138 {
212 139
213 if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste 140 if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste
214 { 141 {
215 - printf("1ere lettre\n");  
216 ajout_dico_tete(parbre,c); 142 ajout_dico_tete(parbre,c);
217 (*parbre_prec)=(*parbre); 143 (*parbre_prec)=(*parbre);
218 (*parbre)=(*parbre)->fils; 144 (*parbre)=(*parbre)->fils;
@@ -220,11 +146,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, @@ -220,11 +146,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
220 146
221 else if (rec->suivant==NULL && rec->lettre!='\0') 147 else if (rec->suivant==NULL && rec->lettre!='\0')
222 { 148 {
223 -  
224 - printf("rech suiv = NUll \n");  
225 ajout_dico(&(rec),&(rec->suivant),c); 149 ajout_dico(&(rec),&(rec->suivant),c);
226 -  
227 - // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils);  
228 (*parbre_prec)=(*parbre); 150 (*parbre_prec)=(*parbre);
229 (*parbre)=rec->suivant->fils; 151 (*parbre)=rec->suivant->fils;
230 } 152 }
@@ -232,31 +154,21 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, @@ -232,31 +154,21 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
232 154
233 else 155 else
234 {// Cas où le début du mot existe déjà et qu'on le complète 156 {// Cas où le début du mot existe déjà et qu'on le complète
235 - //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre);  
236 - printf("lettre trouvee %c\n", rec->lettre);  
237 (*parbre_prec)=(*parbre); 157 (*parbre_prec)=(*parbre);
238 (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre 158 (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre
239 - // 159 +
240 } 160 }
241 161
242 162
243 } 163 }
244 } 164 }
245 else { 165 else {
246 - printf("c==n \n");  
247 if ((*parbre_originel)!=NULL) 166 if ((*parbre_originel)!=NULL)
248 { 167 {
249 - printf("adr arbre prec %p et lettre %c \n", (*parbre_prec),(*parbre_prec)->lettre);  
250 (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot 168 (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot
251 } 169 }
252 - // affiche_dico((*parbre_originel),n_lettre,mot);  
253 - printf("remise à 0\n");  
254 - print_suiv((*parbre));  
255 - printf("avant egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel));  
256 (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot 170 (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot
257 - printf("apres egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel));  
258 } 171 }
259 - //arbre=arbre_originel;  
260 } 172 }
261 } 173 }
262 174
@@ -268,14 +180,13 @@ int main() @@ -268,14 +180,13 @@ int main()
268 arbre_originel=NULL; 180 arbre_originel=NULL;
269 arbre=NULL; 181 arbre=NULL;
270 // Ouvrir fichier 182 // Ouvrir fichier
271 - FILE *fp = fopen("words1.txt","r"); 183 + FILE *fp = fopen("words","r");
272 if (fp==NULL) 184 if (fp==NULL)
273 printf("words1 inaccessible \n",fp); 185 printf("words1 inaccessible \n",fp);
274 else 186 else
275 printf("words1 accessible \n",fp); 187 printf("words1 accessible \n",fp);
276 cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp); 188 cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp);
277 - //affiche_dico(arbre_originel,n_lettre,mot);  
278 - print_tout(arbre_originel,n_lettre, mot); 189 + affiche_dico(arbre_originel,n_lettre,mot);
279 free_tree(&arbre); 190 free_tree(&arbre);
280 fclose(fp); 191 fclose(fp);
281 192