Commit e475e825cfa25c416d33a1cbd79c375b487bffe3
1 parent
d6caeeb7
Modifs fontion print
Showing
1 changed file
with
81 additions
and
92 deletions
Show diff stats
@@ -21,10 +21,12 @@ void init_dico() | @@ -21,10 +21,12 @@ void init_dico() | ||
21 | arbre=NULL; | 21 | arbre=NULL; |
22 | } | 22 | } |
23 | */ | 23 | */ |
24 | -ptarbre rech(ptarbre arbre, char lettre) | 24 | +ptarbre rech(ptarbre arbre_ori, char lettre) |
25 | // recherche une lettre en ième position (correspondant à arbre) | 25 | // recherche une lettre en ième position (correspondant à arbre) |
26 | // Retourne l'adresse de l'arbre contenant la lettre à cette position | 26 | // Retourne l'adresse de l'arbre contenant la lettre à cette position |
27 | { | 27 | { |
28 | + ptarbre arbre; | ||
29 | + arbre=arbre_ori; | ||
28 | printf("rech adr abre deb %p \n", arbre); | 30 | printf("rech adr abre deb %p \n", arbre); |
29 | if (arbre!=NULL) | 31 | if (arbre!=NULL) |
30 | { | 32 | { |
@@ -39,11 +41,56 @@ ptarbre rech(ptarbre arbre, char lettre) | @@ -39,11 +41,56 @@ ptarbre rech(ptarbre arbre, char lettre) | ||
39 | printf("retourne adr %p lettre %c\n", arbre, arbre->lettre); | 41 | printf("retourne adr %p lettre %c\n", arbre, arbre->lettre); |
40 | return arbre; | 42 | return arbre; |
41 | } | 43 | } |
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 | +} | ||
42 | 88 | ||
43 | void init_dico(ptarbre* parbre, char lettre) | 89 | void init_dico(ptarbre* parbre, char lettre) |
44 | { | 90 | { |
45 | (*parbre)=malloc(sizeof(cell)); | 91 | (*parbre)=malloc(sizeof(cell)); |
46 | (*parbre)->fils=malloc(sizeof(cell)); | 92 | (*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 | ||
47 | (*parbre)->suivant=NULL; | 94 | (*parbre)->suivant=NULL; |
48 | (*parbre)->lettre=lettre; | 95 | (*parbre)->lettre=lettre; |
49 | (*parbre)->fin_mot=false; | 96 | (*parbre)->fin_mot=false; |
@@ -67,8 +114,8 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) | @@ -67,8 +114,8 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) | ||
67 | (*parbresuiv)->fils->suivant=NULL; | 114 | (*parbresuiv)->fils->suivant=NULL; |
68 | (*parbresuiv)->suivant=NULL; | 115 | (*parbresuiv)->suivant=NULL; |
69 | (*parbresuiv)->fin_mot=false; | 116 | (*parbresuiv)->fin_mot=false; |
70 | - (*parbre)->lettre=lettre; | ||
71 | - printf("ajout lettre : %c à %p \n",(*parbre)->lettre, parbre); | 117 | + (*parbresuiv)->lettre=lettre; |
118 | + printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); | ||
72 | } | 119 | } |
73 | 120 | ||
74 | void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) | 121 | void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) |
@@ -82,18 +129,21 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) | @@ -82,18 +129,21 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[]) | ||
82 | { | 129 | { |
83 | if (arbre->fils != NULL) | 130 | if (arbre->fils != NULL) |
84 | { | 131 | { |
85 | - printf("%c",arbre->lettre); | ||
86 | mot[n_lettre]=arbre->lettre; | 132 | mot[n_lettre]=arbre->lettre; |
87 | n_lettre++; | 133 | n_lettre++; |
88 | - affiche_dico(arbre->fils,n_lettre,mot); | ||
89 | } | 134 | } |
90 | - printf("\n"); | 135 | + |
136 | + printf("%c",arbre->lettre); | ||
137 | + affiche_dico(arbre->fils,n_lettre,mot); | ||
138 | + if (arbre->fin_mot) | ||
139 | + printf("\n"); | ||
91 | if (arbre->suivant != NULL) | 140 | if (arbre->suivant != NULL) |
92 | { | 141 | { |
93 | - printf("%s",mot); | ||
94 | - affiche_dico(arbre->suivant, n_lettre, mot); | 142 | + printf("%s",mot); |
143 | + // mot[n_lettre]=arbre->lettre; | ||
95 | } | 144 | } |
96 | - mot[n_lettre]=0; | 145 | + affiche_dico(arbre->suivant, n_lettre, mot); |
146 | + mot[n_lettre]='\0'; | ||
97 | n_lettre--; | 147 | n_lettre--; |
98 | 148 | ||
99 | } | 149 | } |
@@ -114,6 +164,18 @@ void free_tree(cell **ptr_tree) | @@ -114,6 +164,18 @@ void free_tree(cell **ptr_tree) | ||
114 | } | 164 | } |
115 | } | 165 | } |
116 | 166 | ||
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 | + | ||
117 | void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp) | 179 | void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp) |
118 | { | 180 | { |
119 | 181 | ||
@@ -136,6 +198,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | @@ -136,6 +198,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | ||
136 | { | 198 | { |
137 | printf("arbre null\n"); | 199 | printf("arbre null\n"); |
138 | init_dico(parbre,c); | 200 | init_dico(parbre,c); |
201 | + (*parbre_prec)=(*parbre); | ||
139 | (*parbre)=(*parbre)->fils; | 202 | (*parbre)=(*parbre)->fils; |
140 | } | 203 | } |
141 | 204 | ||
@@ -147,14 +210,15 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | @@ -147,14 +210,15 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | ||
147 | if (rec->lettre!=c) | 210 | if (rec->lettre!=c) |
148 | { | 211 | { |
149 | 212 | ||
150 | - if (rec==(*parbre)) // 1ere lettre de la liste | 213 | + if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste |
151 | { | 214 | { |
152 | printf("1ere lettre\n"); | 215 | printf("1ere lettre\n"); |
153 | ajout_dico_tete(parbre,c); | 216 | ajout_dico_tete(parbre,c); |
217 | + (*parbre_prec)=(*parbre); | ||
154 | (*parbre)=(*parbre)->fils; | 218 | (*parbre)=(*parbre)->fils; |
155 | } | 219 | } |
156 | 220 | ||
157 | - if (rec->suivant==NULL) | 221 | + else if (rec->suivant==NULL && rec->lettre!='\0') |
158 | { | 222 | { |
159 | 223 | ||
160 | printf("rech suiv = NUll \n"); | 224 | printf("rech suiv = NUll \n"); |
@@ -169,7 +233,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | @@ -169,7 +233,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | ||
169 | else | 233 | else |
170 | {// Cas où le début du mot existe déjà et qu'on le complète | 234 | {// Cas où le début du mot existe déjà et qu'on le complète |
171 | //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre); | 235 | //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre); |
172 | - // printf("adr rec %p adr rec fils %p\n", rec, rec->fils); | 236 | + printf("lettre trouvee %c\n", rec->lettre); |
173 | (*parbre_prec)=(*parbre); | 237 | (*parbre_prec)=(*parbre); |
174 | (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre | 238 | (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre |
175 | // | 239 | // |
@@ -182,11 +246,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | @@ -182,11 +246,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | ||
182 | printf("c==n \n"); | 246 | printf("c==n \n"); |
183 | if ((*parbre_originel)!=NULL) | 247 | if ((*parbre_originel)!=NULL) |
184 | { | 248 | { |
185 | - printf("%c \n", (*parbre_prec)->lettre); | 249 | + printf("adr arbre prec %p et lettre %c \n", (*parbre_prec),(*parbre_prec)->lettre); |
186 | (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot | 250 | (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot |
187 | } | 251 | } |
188 | // affiche_dico((*parbre_originel),n_lettre,mot); | 252 | // affiche_dico((*parbre_originel),n_lettre,mot); |
189 | printf("remise à 0\n"); | 253 | printf("remise à 0\n"); |
254 | + print_suiv((*parbre)); | ||
190 | printf("avant egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel)); | 255 | printf("avant egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel)); |
191 | (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot | 256 | (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot |
192 | printf("apres egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel)); | 257 | 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, | @@ -197,11 +262,10 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, | ||
197 | 262 | ||
198 | int main() | 263 | int main() |
199 | { | 264 | { |
200 | - char mot[30]; | 265 | + char mot[30]=""; |
201 | int n_lettre=0; | 266 | int n_lettre=0; |
202 | ptarbre arbre_originel,arbre,arbre_prec; | 267 | ptarbre arbre_originel,arbre,arbre_prec; |
203 | arbre_originel=NULL; | 268 | arbre_originel=NULL; |
204 | - printf("adr arbre _ori %p\n", &arbre_originel); | ||
205 | arbre=NULL; | 269 | arbre=NULL; |
206 | // Ouvrir fichier | 270 | // Ouvrir fichier |
207 | FILE *fp = fopen("words1.txt","r"); | 271 | FILE *fp = fopen("words1.txt","r"); |
@@ -210,85 +274,10 @@ int main() | @@ -210,85 +274,10 @@ int main() | ||
210 | else | 274 | else |
211 | printf("words1 accessible \n",fp); | 275 | printf("words1 accessible \n",fp); |
212 | cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp); | 276 | cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp); |
213 | - /* while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier | ||
214 | - { | ||
215 | - if (c != '\n') | ||
216 | - { | ||
217 | - if (arbre_originel==NULL) // Cas où c'est le premier mot premiere lettre | ||
218 | - { | ||
219 | - printf("arbre =NULL \n"); | ||
220 | - init_dico(&arbre_originel,c); | ||
221 | - printf("lettre arbre :%c \n",arbre_originel->lettre); | ||
222 | - arbre_prec=arbre_originel; | ||
223 | - arbre=arbre_originel->fils; | ||
224 | - } | ||
225 | - else if (arbre==NULL) // premier mot de l'arbre | ||
226 | - { | ||
227 | - init_dico(&arbre,c); | ||
228 | - arbre=arbre->fils; | ||
229 | - } | ||
230 | - | ||
231 | - else // Cas où le dico n'est pas vide | ||
232 | - { | ||
233 | - // printf("lettre arbre :%c \n",arbre->lettre); | ||
234 | - printf(" c: %c\n", c); | ||
235 | - rec=rech(arbre,c); | ||
236 | - if (rec->lettre!=c) | ||
237 | - { | ||
238 | - | ||
239 | - if (rec==arbre) // 1ere lettre de la liste | ||
240 | - { | ||
241 | - printf("1ere lettre\n"); | ||
242 | - ajout_dico_tete(&arbre,c); | ||
243 | - arbre=arbre->fils; | ||
244 | - } | ||
245 | - | ||
246 | - if (rec->suivant==NULL) | ||
247 | - { | ||
248 | - | ||
249 | - printf("rech suiv = NUll \n"); | ||
250 | - ajout_dico(&(rec),&(rec->suivant),c); | ||
251 | - | ||
252 | - // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils); | ||
253 | - arbre_prec=arbre; | ||
254 | - arbre=rec->suivant->fils; | ||
255 | - } | ||
256 | - } | ||
257 | - | ||
258 | - else | ||
259 | - {// Cas où le début du mot existe déjà et qu'on le complète | ||
260 | - //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre); | ||
261 | - // printf("adr rec %p adr rec fils %p\n", rec, rec->fils); | ||
262 | - arbre_prec=arbre; | ||
263 | - arbre=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre | ||
264 | - // | ||
265 | - } | ||
266 | - | ||
267 | - | ||
268 | - } | ||
269 | - } | ||
270 | - else { | ||
271 | - printf("c=='\ n' \n"); | ||
272 | - if (arbre_originel!=NULL) | ||
273 | - { | ||
274 | - printf("%c \n", arbre_prec->lettre); | ||
275 | - arbre_prec->fin_mot=true; // Cette lettre est la dernière du mot | ||
276 | - } | ||
277 | - | ||
278 | - affiche_dico(arbre_originel,n_lettre,mot); | ||
279 | - printf("remise à 0\n"); | ||
280 | - printf("avant egal arbre %p arbre ori %p \n", arbre, arbre_originel); | ||
281 | - arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot | ||
282 | - printf("apres egal arbre %p arbre ori %p \n", arbre, arbre_originel); | ||
283 | - } | ||
284 | - //arbre=arbre_originel; | ||
285 | - } | ||
286 | - */ | ||
287 | - // printf("arbre originel lettre %c \n", arbre_originel->fils->lettre); | ||
288 | - affiche_dico(arbre_originel,n_lettre,mot); | 277 | + //affiche_dico(arbre_originel,n_lettre,mot); |
278 | + print_tout(arbre_originel,n_lettre, mot); | ||
289 | free_tree(&arbre); | 279 | free_tree(&arbre); |
290 | fclose(fp); | 280 | fclose(fp); |
291 | 281 | ||
292 | - | ||
293 | return 0; | 282 | return 0; |
294 | } | 283 | } |