Blame view

dico.c 5.46 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[])
6394a205   vsalingu   Lecture du fichie...
65
66
  // affiche tout le dictionnaire à partir de l'arbre (donc le numéro de lettre) sélectionné
  {
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
99
100
101
102
103
104
105
106
107
108
109
110
111
  
  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);
      }
  }
  
d6caeeb7   vsalingu   fonction cons_arb...
112
113
114
115
116
117
118
  void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
  {
    
    char c,t;
    ptarbre rec;
     while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier
      {
d6caeeb7   vsalingu   fonction cons_arb...
119
120
121
122
        if (c != '\n')
  	{
  	  if ((*parbre_originel)==NULL) // Cas où c'est le premier mot premiere lettre
  	    {
253ecfa4   vsalingu   Dico ok vérifié g...
123
  	      init_dico(parbre_originel,c);;
d6caeeb7   vsalingu   fonction cons_arb...
124
125
126
127
128
  	      (*parbre_prec)=(*parbre_originel);
  	      (*parbre)=(*parbre_originel)->fils;
  	    }
  	  else if ((*parbre)==NULL) // premier mot de l'arbre
  	    {
d6caeeb7   vsalingu   fonction cons_arb...
129
  	      init_dico(parbre,c);
e475e825   vsalingu   Modifs fontion print
130
  	      (*parbre_prec)=(*parbre);
d6caeeb7   vsalingu   fonction cons_arb...
131
132
133
134
135
  	      (*parbre)=(*parbre)->fils;
  	    }
  	  
  	  else // Cas où le dico n'est pas vide
  	    {
d6caeeb7   vsalingu   fonction cons_arb...
136
137
138
139
  	      rec=rech((*parbre),c);
  	      if (rec->lettre!=c)
  		{
  
e475e825   vsalingu   Modifs fontion print
140
  		  if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste
d6caeeb7   vsalingu   fonction cons_arb...
141
  		    {
d6caeeb7   vsalingu   fonction cons_arb...
142
  		      ajout_dico_tete(parbre,c);
e475e825   vsalingu   Modifs fontion print
143
  		      (*parbre_prec)=(*parbre);
d6caeeb7   vsalingu   fonction cons_arb...
144
145
146
  		      (*parbre)=(*parbre)->fils;
  		    }
  		      
e475e825   vsalingu   Modifs fontion print
147
  		  else if (rec->suivant==NULL && rec->lettre!='\0')
d6caeeb7   vsalingu   fonction cons_arb...
148
  		    {
d6caeeb7   vsalingu   fonction cons_arb...
149
  		      ajout_dico(&(rec),&(rec->suivant),c);
d6caeeb7   vsalingu   fonction cons_arb...
150
151
152
153
154
155
156
  		      (*parbre_prec)=(*parbre);
  		      (*parbre)=rec->suivant->fils;
  		    }
  		}
  	  
  	      else
  		{// Cas où le début du mot existe déjà et qu'on le complète
d6caeeb7   vsalingu   fonction cons_arb...
157
158
  		  (*parbre_prec)=(*parbre);
  		  (*parbre)=rec->fils; // On va à ltage d'après pour former le mot dans l'arbre
253ecfa4   vsalingu   Dico ok vérifié g...
159
  		 
d6caeeb7   vsalingu   fonction cons_arb...
160
161
162
163
164
165
  		}
  	    
  	      
  	    }
  	}
        else {
d6caeeb7   vsalingu   fonction cons_arb...
166
167
  	if ((*parbre_originel)!=NULL)
  	  {
d6caeeb7   vsalingu   fonction cons_arb...
168
169
  	    (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot
  	  }
d6caeeb7   vsalingu   fonction cons_arb...
170
  	(*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot
d6caeeb7   vsalingu   fonction cons_arb...
171
        }
d6caeeb7   vsalingu   fonction cons_arb...
172
173
      }
  }
6394a205   vsalingu   Lecture du fichie...
174
175
176
  
  int main()
  {
e475e825   vsalingu   Modifs fontion print
177
    char mot[30]="";
d6caeeb7   vsalingu   fonction cons_arb...
178
    int n_lettre=0;
04b8ce94   vsalingu   Modification de l...
179
    ptarbre arbre_originel,arbre,arbre_prec;
fb82dc55   vsalingu   dico ok à vérifie...
180
    arbre_originel=NULL;
04b8ce94   vsalingu   Modification de l...
181
    arbre=NULL;
6394a205   vsalingu   Lecture du fichie...
182
    // Ouvrir fichier
253ecfa4   vsalingu   Dico ok vérifié g...
183
    FILE *fp = fopen("words","r");
6394a205   vsalingu   Lecture du fichie...
184
185
186
187
    if (fp==NULL)
      printf("words1 inaccessible \n",fp);
    else
      printf("words1 accessible \n",fp);
d6caeeb7   vsalingu   fonction cons_arb...
188
    cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp);
253ecfa4   vsalingu   Dico ok vérifié g...
189
    affiche_dico(arbre_originel,n_lettre,mot);
04b8ce94   vsalingu   Modification de l...
190
    free_tree(&arbre);
6394a205   vsalingu   Lecture du fichie...
191
192
    fclose(fp);
  
6394a205   vsalingu   Lecture du fichie...
193
194
    return 0;
  }