Blame view

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