Blame view

dico.c 6.97 KB
6394a205   vsalingu   Lecture du fichie...
1
2
  #include <stdio.h>
  #include <stdlib.h>
04b8ce94   vsalingu   Modification de l...
3
  #include <stdbool.h>
73e92d24   vsalingu   Modifications de ...
4
  #include <string.h>
6394a205   vsalingu   Lecture du fichie...
5
6
7
8
9
10
  
  
  typedef struct cell* ptarbre;
  typedef struct cell* ptcellule;
  
  typedef struct cell {
fb82dc55   vsalingu   dico ok à vérifie...
11
    char lettre;
04b8ce94   vsalingu   Modification de l...
12
    ptarbre fils; // Descend d'un étage dans le mot (lettre suivante du mot)
6394a205   vsalingu   Lecture du fichie...
13
    ptcellule suivant; // Lettre suivante stockée à ltage arbre en (ieme position)
04b8ce94   vsalingu   Modification de l...
14
    bool fin_mot;
6394a205   vsalingu   Lecture du fichie...
15
16
  } cell;
  
253ecfa4   vsalingu   Dico ok vérifié g...
17
18
19
  
  ptarbre rech(ptarbre arbre, char lettre)
  // 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.
6394a205   vsalingu   Lecture du fichie...
20
  {
04b8ce94   vsalingu   Modification de l...
21
    if (arbre!=NULL)
6394a205   vsalingu   Lecture du fichie...
22
      {
04b8ce94   vsalingu   Modification de l...
23
24
        while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
  	{
04b8ce94   vsalingu   Modification de l...
25
  	  arbre=(arbre->suivant);
04b8ce94   vsalingu   Modification de l...
26
  	}
6394a205   vsalingu   Lecture du fichie...
27
      }
6394a205   vsalingu   Lecture du fichie...
28
29
    return arbre;
  }
d6caeeb7   vsalingu   fonction cons_arb...
30
31
  
  void init_dico(ptarbre* parbre, char lettre)
253ecfa4   vsalingu   Dico ok vérifié g...
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 .
6394a205   vsalingu   Lecture du fichie...
33
  {
fb82dc55   vsalingu   dico ok à vérifie...
34
    (*parbre)=malloc(sizeof(cell));
04b8ce94   vsalingu   Modification de l...
35
    (*parbre)->fils=malloc(sizeof(cell));
253ecfa4   vsalingu   Dico ok vérifié g...
36
    (*parbre)->fils->lettre= '\0'; // Permet de savoir qu'il n'y a pas de lettre dans ltage 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'.
d6caeeb7   vsalingu   fonction cons_arb...
37
38
39
40
41
42
    (*parbre)->suivant=NULL;
    (*parbre)->lettre=lettre;
    (*parbre)->fin_mot=false;
  }
  
  void ajout_dico_tete(ptarbre *parbre, char lettre)
253ecfa4   vsalingu   Dico ok vérifié g...
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'.
d6caeeb7   vsalingu   fonction cons_arb...
44
45
  {
    (*parbre)->fils=malloc(sizeof(cell));
04b8ce94   vsalingu   Modification de l...
46
    (*parbre)->fils->suivant=NULL;
6394a205   vsalingu   Lecture du fichie...
47
    (*parbre)->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
48
    (*parbre)->lettre=lettre;
04b8ce94   vsalingu   Modification de l...
49
    (*parbre)->fin_mot=false;
6394a205   vsalingu   Lecture du fichie...
50
51
  }
  
fb82dc55   vsalingu   dico ok à vérifie...
52
  void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
253ecfa4   vsalingu   Dico ok vérifié g...
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.
6394a205   vsalingu   Lecture du fichie...
54
  {
fb82dc55   vsalingu   dico ok à vérifie...
55
56
    *parbresuiv=malloc(sizeof(cell));
    (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
04b8ce94   vsalingu   Modification de l...
57
58
    (*parbresuiv)->fils=malloc(sizeof(cell));
    (*parbresuiv)->fils->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
59
    (*parbresuiv)->suivant=NULL;
04b8ce94   vsalingu   Modification de l...
60
    (*parbresuiv)->fin_mot=false;
e475e825   vsalingu   Modifs fontion print
61
    (*parbresuiv)->lettre=lettre;
6394a205   vsalingu   Lecture du fichie...
62
63
  }
  
73e92d24   vsalingu   Modifications de ...
64
  void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
046e94d9   vsalingu   Code documenté ve...
65
  // Action qui affiche tout le dictionnaire à partir de arbre (donc le numéro de lettre) sélectionné en stockant le début du mot qui est commun à tous les suivants dans mot initialisé à vide et le numéro de la lettre dans n_lettre initialisé à 0.
6394a205   vsalingu   Lecture du fichie...
66
  {
04b8ce94   vsalingu   Modification de l...
67
68
69
70
71
72
    if(arbre == NULL)
      {
      return;
      }
    else
      {
73e92d24   vsalingu   Modifications de ...
73
        if (arbre->fils != NULL)
04b8ce94   vsalingu   Modification de l...
74
  	{
73e92d24   vsalingu   Modifications de ...
75
76
  	  mot[n_lettre]=arbre->lettre;
  	  n_lettre++;
04b8ce94   vsalingu   Modification de l...
77
  	}
253ecfa4   vsalingu   Dico ok vérifié g...
78
79
80
81
82
        if (arbre->fin_mot)
  	{
  	  printf("%s",mot);
  	  printf("\n");
  	}
e475e825   vsalingu   Modifs fontion print
83
        
e475e825   vsalingu   Modifs fontion print
84
        affiche_dico(arbre->fils,n_lettre,mot);
73e92d24   vsalingu   Modifications de ...
85
86
        if (arbre->suivant != NULL)
  	{
253ecfa4   vsalingu   Dico ok vérifié g...
87
88
  	  n_lettre--;
  	  mot[n_lettre]='\0';
73e92d24   vsalingu   Modifications de ...
89
  	}
e475e825   vsalingu   Modifs fontion print
90
        affiche_dico(arbre->suivant, n_lettre, mot);
73e92d24   vsalingu   Modifications de ...
91
        n_lettre--;
253ecfa4   vsalingu   Dico ok vérifié g...
92
        mot[n_lettre]='\0';
73e92d24   vsalingu   Modifications de ...
93
  	  
253ecfa4   vsalingu   Dico ok vérifié g...
94
      }
04b8ce94   vsalingu   Modification de l...
95
   
6394a205   vsalingu   Lecture du fichie...
96
  }
04b8ce94   vsalingu   Modification de l...
97
98
  
  void free_tree(cell **ptr_tree)
046e94d9   vsalingu   Code documenté ve...
99
  // Action qui libère la mémoire allouée pour stockée les données du dictionnaire *(*ptr_tree).
04b8ce94   vsalingu   Modification de l...
100
  {
046e94d9   vsalingu   Code documenté ve...
101
    if ((*ptr_tree)==NULL)
04b8ce94   vsalingu   Modification de l...
102
103
104
105
106
107
108
109
110
111
112
      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);
      }
  }
  
d6caeeb7   vsalingu   fonction cons_arb...
113
  void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
046e94d9   vsalingu   Code documenté ve...
114
  // Action qui construit entièrement l'arbre, à partir du fichier fp, en partant de l'adresse parbre_originel qui correspond à la première cellule, parbre qui est la copie de l'arbre originel qui va nous permettre de nous balader entre les différentes lettres de chaque mot et de revenir à la première cellule à la fin de chaque mot. 
d6caeeb7   vsalingu   fonction cons_arb...
115
  {
eb0cebb1   vsalingu   Code sans fuites ...
116
    char c;
d6caeeb7   vsalingu   fonction cons_arb...
117
    ptarbre rec;
046e94d9   vsalingu   Code documenté ve...
118
     while (fscanf(fp,"%c",&c)!= EOF) // Lecture de tout le fichier fp.
d6caeeb7   vsalingu   fonction cons_arb...
119
      {
d6caeeb7   vsalingu   fonction cons_arb...
120
121
        if (c != '\n')
  	{
046e94d9   vsalingu   Code documenté ve...
122
  	  if ((*parbre_originel)==NULL) // Cas où c'est le premier mot et premiere lettre du dictionnaire.
d6caeeb7   vsalingu   fonction cons_arb...
123
  	    {
046e94d9   vsalingu   Code documenté ve...
124
125
126
  	      init_dico(parbre_originel,c);
  	      (*parbre_prec)=(*parbre_originel); // On sauvegarde l'adresse de la lettre précédente.
  	      (*parbre)=(*parbre_originel)->fils; // On passe à l'adresse de la cellule qui contiendra la prochaine lettre du même mot.
d6caeeb7   vsalingu   fonction cons_arb...
127
  	    }
046e94d9   vsalingu   Code documenté ve...
128
  	  else if ((*parbre)==NULL) // Cas où c'est le premier mot de l'arbre mais pas la première lettre.
d6caeeb7   vsalingu   fonction cons_arb...
129
  	    {
d6caeeb7   vsalingu   fonction cons_arb...
130
  	      init_dico(parbre,c);
e475e825   vsalingu   Modifs fontion print
131
  	      (*parbre_prec)=(*parbre);
d6caeeb7   vsalingu   fonction cons_arb...
132
133
134
  	      (*parbre)=(*parbre)->fils;
  	    }
  	  
046e94d9   vsalingu   Code documenté ve...
135
  	  else // Cas où ce n'est pas le premier mot, il faut faire une recherche parmi les lettres de même indice (donc à ltage '(*parbre)') déjà enregistrées dans l'arbre. 
d6caeeb7   vsalingu   fonction cons_arb...
136
  	    {
d6caeeb7   vsalingu   fonction cons_arb...
137
  	      rec=rech((*parbre),c);
046e94d9   vsalingu   Code documenté ve...
138
  	      if (rec->lettre!=c) // Cas où la lettre présente dans la cellule à l'adresse renvoyée par rech((*parbre),c) n'est pas la lettre recherchée.
d6caeeb7   vsalingu   fonction cons_arb...
139
140
  		{
  
046e94d9   vsalingu   Code documenté ve...
141
  		  if (rec==(*parbre) && rec->lettre=='\0') // Cas où il n'y a pas de lettres à l'indice *parbre donc la recherche renvoie l'adresse de la première cellule qui est vide.
d6caeeb7   vsalingu   fonction cons_arb...
142
  		    {
d6caeeb7   vsalingu   fonction cons_arb...
143
  		      ajout_dico_tete(parbre,c);
e475e825   vsalingu   Modifs fontion print
144
  		      (*parbre_prec)=(*parbre);
d6caeeb7   vsalingu   fonction cons_arb...
145
146
147
  		      (*parbre)=(*parbre)->fils;
  		    }
  		      
046e94d9   vsalingu   Code documenté ve...
148
  		  else if (rec->suivant==NULL && rec->lettre!='\0') // Cas où il y a qu'une lettre à l'indice *parbre donc la recherche renvoie l'adresse de la première cellule qui ne contient pas la lettre recherchée.
d6caeeb7   vsalingu   fonction cons_arb...
149
  		    {
d6caeeb7   vsalingu   fonction cons_arb...
150
  		      ajout_dico(&(rec),&(rec->suivant),c);
ac7caa18   vsalingu   Modification de l...
151
  		      (*parbre_prec)=rec->suivant;
d6caeeb7   vsalingu   fonction cons_arb...
152
153
154
155
156
  		      (*parbre)=rec->suivant->fils;
  		    }
  		}
  	  
  	      else
046e94d9   vsalingu   Code documenté ve...
157
  		{// Cas où la recherche renvoie l'adresse d'une cellule dont la lettre est la lettre recherchée donc le début du mot existe déjà et on le complète.
ac7caa18   vsalingu   Modification de l...
158
  		  (*parbre_prec)=rec;
046e94d9   vsalingu   Code documenté ve...
159
  		  (*parbre)=rec->fils; // On va à ltage d'après pour former le mot dans l'arbre.
253ecfa4   vsalingu   Dico ok vérifié g...
160
  		 
d6caeeb7   vsalingu   fonction cons_arb...
161
162
163
164
165
  		}
  	    
  	      
  	    }
  	}
046e94d9   vsalingu   Code documenté ve...
166
        else { // Cas où c==\n donc le mot est terminé, il faut retourner en haut de l'arbre pour ajouter le prochain mot.
d6caeeb7   vsalingu   fonction cons_arb...
167
168
  	if ((*parbre_originel)!=NULL)
  	  {
046e94d9   vsalingu   Code documenté ve...
169
  	    (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot.
d6caeeb7   vsalingu   fonction cons_arb...
170
  	  }
046e94d9   vsalingu   Code documenté ve...
171
  	(*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot.
d6caeeb7   vsalingu   fonction cons_arb...
172
        }
d6caeeb7   vsalingu   fonction cons_arb...
173
174
      }
  }
6394a205   vsalingu   Lecture du fichie...
175
176
177
  
  int main()
  {
e475e825   vsalingu   Modifs fontion print
178
    char mot[30]="";
d6caeeb7   vsalingu   fonction cons_arb...
179
    int n_lettre=0;
04b8ce94   vsalingu   Modification de l...
180
    ptarbre arbre_originel,arbre,arbre_prec;
fb82dc55   vsalingu   dico ok à vérifie...
181
    arbre_originel=NULL;
04b8ce94   vsalingu   Modification de l...
182
    arbre=NULL;
6394a205   vsalingu   Lecture du fichie...
183
    // Ouvrir fichier
253ecfa4   vsalingu   Dico ok vérifié g...
184
    FILE *fp = fopen("words","r");
6394a205   vsalingu   Lecture du fichie...
185
    if (fp==NULL)
eb0cebb1   vsalingu   Code sans fuites ...
186
      printf("Dictionnaire inaccessible \n");
6394a205   vsalingu   Lecture du fichie...
187
    else
eb0cebb1   vsalingu   Code sans fuites ...
188
      printf("Dictionnaire accessible \n");
d6caeeb7   vsalingu   fonction cons_arb...
189
    cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp);
253ecfa4   vsalingu   Dico ok vérifié g...
190
    affiche_dico(arbre_originel,n_lettre,mot);
eb0cebb1   vsalingu   Code sans fuites ...
191
    free_tree(&arbre_originel);
6394a205   vsalingu   Lecture du fichie...
192
    fclose(fp);
046e94d9   vsalingu   Code documenté ve...
193
    
6394a205   vsalingu   Lecture du fichie...
194
  
6394a205   vsalingu   Lecture du fichie...
195
196
    return 0;
  }