Commit e475e825cfa25c416d33a1cbd79c375b487bffe3

Authored by vsalingu
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 }