Blame view

dico.c 4.32 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
17
18
19
20
21
22
23
  } cell;
  
  /* Pas utile 
  void init_dico()
  {
    ptarbre arbre;
    arbre=NULL;
  }
  */
fb82dc55   vsalingu   dico ok à vérifie...
24
  ptarbre rech(ptarbre arbre, char lettre)
6394a205   vsalingu   Lecture du fichie...
25
  // recherche une lettre en ième position (correspondant à arbre)
04b8ce94   vsalingu   Modification de l...
26
  // Retourne l'adresse de l'arbre contenant la lettre à cette position
6394a205   vsalingu   Lecture du fichie...
27
  {
04b8ce94   vsalingu   Modification de l...
28
    if (arbre!=NULL)
6394a205   vsalingu   Lecture du fichie...
29
      {
04b8ce94   vsalingu   Modification de l...
30
31
32
33
34
35
        printf("arbre lettre %c \n", arbre->lettre);
        while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
  	{
  	  printf("lettre : %c lettre cherchee : %c adr arbre %p \n", arbre->lettre,lettre, arbre);
  	  arbre=(arbre->suivant);
  	}
6394a205   vsalingu   Lecture du fichie...
36
37
38
      }
    return arbre;
  }
fb82dc55   vsalingu   dico ok à vérifie...
39
  void init_dico(ptarbre *parbre, char lettre)
6394a205   vsalingu   Lecture du fichie...
40
  {
fb82dc55   vsalingu   dico ok à vérifie...
41
    (*parbre)=malloc(sizeof(cell));
04b8ce94   vsalingu   Modification de l...
42
43
    (*parbre)->fils=malloc(sizeof(cell));
    (*parbre)->fils->suivant=NULL;
6394a205   vsalingu   Lecture du fichie...
44
    (*parbre)->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
45
    (*parbre)->lettre=lettre;
04b8ce94   vsalingu   Modification de l...
46
    (*parbre)->fin_mot=false;
fb82dc55   vsalingu   dico ok à vérifie...
47
    printf("init dico\n");
6394a205   vsalingu   Lecture du fichie...
48
49
  }
  
fb82dc55   vsalingu   dico ok à vérifie...
50
  void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
6394a205   vsalingu   Lecture du fichie...
51
  {
fb82dc55   vsalingu   dico ok à vérifie...
52
53
    *parbresuiv=malloc(sizeof(cell));
    (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
04b8ce94   vsalingu   Modification de l...
54
55
    (*parbresuiv)->fils=malloc(sizeof(cell));
    (*parbresuiv)->fils->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
56
    (*parbresuiv)->suivant=NULL;
04b8ce94   vsalingu   Modification de l...
57
    (*parbresuiv)->fin_mot=false;
fb82dc55   vsalingu   dico ok à vérifie...
58
    (*parbresuiv)->lettre=lettre;
04b8ce94   vsalingu   Modification de l...
59
    printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv);
6394a205   vsalingu   Lecture du fichie...
60
61
  }
  
73e92d24   vsalingu   Modifications de ...
62
  void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
6394a205   vsalingu   Lecture du fichie...
63
64
  // affiche tout le dictionnaire à partir de l'arbre (donc le numéro de lettre) sélectionné
  {
04b8ce94   vsalingu   Modification de l...
65
66
67
68
69
70
    if(arbre == NULL)
      {
      return;
      }
    else
      {
73e92d24   vsalingu   Modifications de ...
71
        if (arbre->fils != NULL)
04b8ce94   vsalingu   Modification de l...
72
  	{
73e92d24   vsalingu   Modifications de ...
73
74
75
76
  	  printf("%c",arbre->lettre);
  	  mot[n_lettre]=arbre->lettre;
  	  n_lettre++;
  	  affiche_dico(arbre->fils,n_lettre,mot);
04b8ce94   vsalingu   Modification de l...
77
  	}
73e92d24   vsalingu   Modifications de ...
78
79
80
81
82
83
84
85
86
87
        printf("\n");
        if (arbre->suivant != NULL)
  	{
  	   printf("%s",mot);
  	  affiche_dico(arbre->suivant, n_lettre, mot);
  	}
        mot[n_lettre]=0;
        n_lettre--;
  	  
      }	
04b8ce94   vsalingu   Modification de l...
88
   
6394a205   vsalingu   Lecture du fichie...
89
  }
04b8ce94   vsalingu   Modification de l...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  
  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);
      }
  }
  
6394a205   vsalingu   Lecture du fichie...
105
106
107
  
  int main()
  {
04b8ce94   vsalingu   Modification de l...
108
    ptarbre arbre_originel,arbre,arbre_prec;
fb82dc55   vsalingu   dico ok à vérifie...
109
    arbre_originel=NULL;
04b8ce94   vsalingu   Modification de l...
110
    arbre=NULL;
73e92d24   vsalingu   Modifications de ...
111
112
    char c,t, mot[30];
    int n_lettre=0;
fb82dc55   vsalingu   dico ok à vérifie...
113
    ptarbre rec;
6394a205   vsalingu   Lecture du fichie...
114
115
116
117
118
119
120
121
122
    // Ouvrir fichier
    FILE *fp = fopen("words1.txt","r");
    if (fp==NULL)
      printf("words1 inaccessible \n",fp);
    else
      printf("words1 accessible \n",fp);
  
    while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier
      {
6394a205   vsalingu   Lecture du fichie...
123
124
        if (c != '\n')
  	{
fb82dc55   vsalingu   dico ok à vérifie...
125
  	  if (arbre_originel==NULL) // Cas où c'est le premier mot
6394a205   vsalingu   Lecture du fichie...
126
  	    {
fb82dc55   vsalingu   dico ok à vérifie...
127
128
  	      printf("arbre =NULL \n");
  	      init_dico(&arbre_originel,c);
04b8ce94   vsalingu   Modification de l...
129
130
131
  	      printf("lettre arbre :%c \n",arbre_originel->lettre);
  	      arbre_prec=arbre_originel;
  	      arbre=arbre_originel->fils;
fb82dc55   vsalingu   dico ok à vérifie...
132
  	      }
6394a205   vsalingu   Lecture du fichie...
133
  	  
fb82dc55   vsalingu   dico ok à vérifie...
134
  	  else // Cas où le dico n'est pas vide
6394a205   vsalingu   Lecture du fichie...
135
  	    {
04b8ce94   vsalingu   Modification de l...
136
  	       printf("lettre arbre :%c \n",arbre->lettre);
fb82dc55   vsalingu   dico ok à vérifie...
137
138
  	      printf(" c: %c\n", c);
  	      rec=rech(arbre,c);
04b8ce94   vsalingu   Modification de l...
139
140
  		      
  	      if (rec->suivant==NULL && rec->lettre!=c)
6394a205   vsalingu   Lecture du fichie...
141
  		{
04b8ce94   vsalingu   Modification de l...
142
143
  		 
  		  printf("rech suiv  = NUll \n");
73e92d24   vsalingu   Modifications de ...
144
  		  ajout_dico(&(arbre),&(rec->suivant),c);
04b8ce94   vsalingu   Modification de l...
145
146
  		  // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils);
  		  arbre_prec=arbre;
73e92d24   vsalingu   Modifications de ...
147
  		  arbre=rec->suivant->fils;
fb82dc55   vsalingu   dico ok à vérifie...
148
149
150
151
152
  		}
  	
  	  
  	      else
  		{// Cas où le début du mot existe déjà et qu'on le complète
04b8ce94   vsalingu   Modification de l...
153
154
155
156
  		  printf("rech suiv pas null rec lettre %c\n", rec->lettre);
  		  arbre_prec=arbre;
  		  arbre=rec->fils; // On va à ltage d'après pour former le mot dans l'arbre
  		  //
6394a205   vsalingu   Lecture du fichie...
157
  		}
fb82dc55   vsalingu   dico ok à vérifie...
158
  	    
04b8ce94   vsalingu   Modification de l...
159
  	      
6394a205   vsalingu   Lecture du fichie...
160
  	    }
fb82dc55   vsalingu   dico ok à vérifie...
161
  	}
6394a205   vsalingu   Lecture du fichie...
162
        else {
04b8ce94   vsalingu   Modification de l...
163
164
165
166
167
168
169
  	printf("else\n");
  	if (arbre_originel!=NULL)
  	  {
  	    printf("%c \n", arbre_prec->lettre); 
  	    arbre_prec->fin_mot=true; // Cette lettre est la dernière du mot
  	  }
  
73e92d24   vsalingu   Modifications de ...
170
  	affiche_dico(arbre_originel,n_lettre,mot);
fb82dc55   vsalingu   dico ok à vérifie...
171
  	printf("remise à 0\n");
04b8ce94   vsalingu   Modification de l...
172
  	arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot
6394a205   vsalingu   Lecture du fichie...
173
        }
04b8ce94   vsalingu   Modification de l...
174
        //arbre=arbre_originel; 
6394a205   vsalingu   Lecture du fichie...
175
      }
04b8ce94   vsalingu   Modification de l...
176
    printf("arbre originel lettre %c \n", arbre_originel->fils->lettre);
73e92d24   vsalingu   Modifications de ...
177
    affiche_dico(arbre_originel,n_lettre,mot);
04b8ce94   vsalingu   Modification de l...
178
    free_tree(&arbre);
6394a205   vsalingu   Lecture du fichie...
179
180
181
182
183
    fclose(fp);
  
  
    return 0;
  }