Blame view

tree.c 4.96 KB
9cf06b18   mertz   debut_add_tree
1
  #include "tree.h"
f7d9ccda   mertz   ajout_libtree
2
  
284154ca   Thorsieger   gestion des accents
3
  void cons_tree(struct node ** ptr_tree, wchar_t val)
f7d9ccda   mertz   ajout_libtree
4
  {
9cf06b18   mertz   debut_add_tree
5
6
7
8
9
10
    *ptr_tree = malloc(sizeof(struct node));
    (*ptr_tree)->val = val;
    (*ptr_tree)->fin = 0;
    (*ptr_tree)->nbr_fils=0;
    (*ptr_tree)->fils = malloc(sizeof(struct node*));
    (*ptr_tree)->fils[0]=NULL;
f7d9ccda   mertz   ajout_libtree
11
12
  }
  
0f6db57b   Thorsieger   gestion des accen...
13
  void mk_empty_tree(dico *Dico)
9cf06b18   mertz   debut_add_tree
14
  {
0f6db57b   Thorsieger   gestion des accen...
15
16
17
18
    for(int i = 0; i < Dico->taille; i++)
    {
      Dico->tab_ptr_tree[i] = NULL;
    }
9cf06b18   mertz   debut_add_tree
19
  }
f7d9ccda   mertz   ajout_libtree
20
  
0f6db57b   Thorsieger   gestion des accen...
21
  void init_dico(dico *Dico)
9cf06b18   mertz   debut_add_tree
22
  {
0f6db57b   Thorsieger   gestion des accen...
23
24
25
    Dico->taille = 26;
    Dico->tab_ptr_tree = malloc(Dico->taille*sizeof(struct node*));
    mk_empty_tree(Dico);
9cf06b18   mertz   debut_add_tree
26
  }
f7d9ccda   mertz   ajout_libtree
27
  
284154ca   Thorsieger   gestion des accents
28
  void add(struct node **tab_ptr_tree, wchar_t val[],int taille, int fl)
03168857   mertz   create tree op
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  {
    if(tab_ptr_tree[fl]==NULL)cons_tree(&(tab_ptr_tree[fl]),val[0]+97);
    Node* noeudtest = tab_ptr_tree[fl];
    for(int i = 1;i<taille;i++)
      {
        int trouve = -1;
        for(int j=0;j<noeudtest->nbr_fils;j++)
  	{
  	  if(noeudtest->fils[j]->val==val[i])trouve=j;
  	}
        if(trouve==-1)
  	{	  
  	  //ajouter lettre
  	   noeudtest->nbr_fils++;
  	   noeudtest->fils = realloc(noeudtest->fils,(noeudtest->nbr_fils)*sizeof(struct node*));
  	   cons_tree(&(noeudtest->fils[(noeudtest->nbr_fils)-1]),val[i]);
aeb78bdf   mertz   correction fin de...
45
  	   trouve = noeudtest->nbr_fils-1;
03168857   mertz   create tree op
46
47
48
49
50
51
  	}
        
        noeudtest = noeudtest->fils[trouve];//on jump au noeud suivant
      }
    noeudtest->fin = 1;
  
9cf06b18   mertz   debut_add_tree
52
  }
f7d9ccda   mertz   ajout_libtree
53
  
284154ca   Thorsieger   gestion des accents
54
  int size(wchar_t val[])
541fd894   mertz   on_avance_tree
55
56
57
58
59
60
61
62
63
  {
    int cpt = 0;
    while(val[cpt]!='\0')
      {
        cpt++;
      }
    return cpt;
  }
  
89b9e3f8   Thorsieger   découpage d'un texte
64
  void toLowerCase(wchar_t mot[])
aeb78bdf   mertz   correction fin de...
65
  {
89b9e3f8   Thorsieger   découpage d'un texte
66
    for(int i=0;i<size(mot);i++)
aeb78bdf   mertz   correction fin de...
67
      {
0f6db57b   Thorsieger   gestion des accen...
68
69
70
        if((mot[i]<='Z' && mot[i]>='A') || (mot[i]>=192 && mot[i]<=214) || (mot[i]>=216 && mot[i]<=222))mot[i]+=32;
        else if(mot[i]==138|| mot[i]==140 || mot[i]==142) mot[i]+=16;
        else if(mot[i]==159) mot[i]+=96;
aeb78bdf   mertz   correction fin de...
71
72
73
      }
  }
  
0f6db57b   Thorsieger   gestion des accen...
74
  void splitcarac(dico *Dico,wchar_t message[])
89b9e3f8   Thorsieger   découpage d'un texte
75
  {
0f6db57b   Thorsieger   gestion des accen...
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    int first_letter =-1;
    if(message[0]>='a' && message[0]<='z')
    {
      first_letter = (int)message[0]-97;
    }
    else
    {
      for(int i = 26; i < Dico->taille; i++)
      {
        if(Dico->tab_ptr_tree[i]->val == message[0]){first_letter = i;break;}
      }
      if(first_letter == -1)
      {
        first_letter = Dico->taille;
        Dico->taille++;
        Dico->tab_ptr_tree = realloc(Dico->tab_ptr_tree,(Dico->taille)*sizeof(struct node*));
        Dico->tab_ptr_tree[first_letter] = NULL;
        cons_tree(&(Dico->tab_ptr_tree[first_letter]),message[0]);
      }
    }
    
89b9e3f8   Thorsieger   découpage d'un texte
97
    wchar_t *buffer;
76053da1   Thorsieger   update des fichiers
98
    wchar_t *token = wcstok(message, L" ,?;.:/!*+\\\"()=«»", &buffer);
0f6db57b   Thorsieger   gestion des accen...
99
100
    add(Dico->tab_ptr_tree,token,size(token),first_letter);
    if(buffer!=NULL)splitcarac(Dico,buffer);
89b9e3f8   Thorsieger   découpage d'un texte
101
  }
541fd894   mertz   on_avance_tree
102
  
0f6db57b   Thorsieger   gestion des accen...
103
  void load_dico(FILE *fp, dico *Dico)
9cf06b18   mertz   debut_add_tree
104
  {
16e67e7e   Thorsieger   l'utilisateur peu...
105
    wchar_t val[3000];
541fd894   mertz   on_avance_tree
106
    
284154ca   Thorsieger   gestion des accents
107
    while(fwscanf(fp, L"%ls",val)==1)
541fd894   mertz   on_avance_tree
108
      {
89b9e3f8   Thorsieger   découpage d'un texte
109
        toLowerCase(val);
0f6db57b   Thorsieger   gestion des accen...
110
        splitcarac(Dico,val);
541fd894   mertz   on_avance_tree
111
112
113
114
115
      }
  
      //On peut tester la bonne ou mauvaise terminaison de la lecture
      if(feof(fp))    printf("Fin normal de lecture\n");
      if(ferror(fp))  printf("ERREUR de lecture\n");
9cf06b18   mertz   debut_add_tree
116
  }
f7d9ccda   mertz   ajout_libtree
117
  
7ab3be6b   Thorsieger   debut free
118
  void free_tree(struct node *ptr_tree)
9cf06b18   mertz   debut_add_tree
119
  {
131759ee   Thorsieger   fin free arbre
120
121
122
    if(ptr_tree==NULL)return;
    if(ptr_tree->nbr_fils==0){free(ptr_tree->fils);return;}
    for(int i=(ptr_tree->nbr_fils)-1;i>=0;i--)
7ab3be6b   Thorsieger   debut free
123
    {
131759ee   Thorsieger   fin free arbre
124
      free_tree(ptr_tree->fils[i]);
7ab3be6b   Thorsieger   debut free
125
126
      free(ptr_tree->fils[i]);
    }
131759ee   Thorsieger   fin free arbre
127
    free(ptr_tree->fils);
7ab3be6b   Thorsieger   debut free
128
129
  }
  
0f6db57b   Thorsieger   gestion des accen...
130
  void free_dico(dico Dico)
7ab3be6b   Thorsieger   debut free
131
  {
0f6db57b   Thorsieger   gestion des accen...
132
    for(int i=0;i<Dico.taille;i++)
7ab3be6b   Thorsieger   debut free
133
    {
0f6db57b   Thorsieger   gestion des accen...
134
      if(Dico.tab_ptr_tree[i]!=NULL)
7ab3be6b   Thorsieger   debut free
135
      {
0f6db57b   Thorsieger   gestion des accen...
136
137
        free_tree(Dico.tab_ptr_tree[i]);
        free(Dico.tab_ptr_tree[i]);
7ab3be6b   Thorsieger   debut free
138
139
      }
    }
0f6db57b   Thorsieger   gestion des accen...
140
    free(Dico.tab_ptr_tree);
9cf06b18   mertz   debut_add_tree
141
  }
76053da1   Thorsieger   update des fichiers
142
143
  
  /*Recherche dans le dictionnaire*/
0f6db57b   Thorsieger   gestion des accen...
144
  int find_mot(dico Dico,wchar_t mot[])
76053da1   Thorsieger   update des fichiers
145
  {
0f6db57b   Thorsieger   gestion des accen...
146
147
148
149
      if (mot==NULL) {
        return 0;
      }
      if(mot[0]>='0' && mot[0]<='9')return 0;
16e67e7e   Thorsieger   l'utilisateur peu...
150
  
0f6db57b   Thorsieger   gestion des accen...
151
152
153
154
155
156
      int fl =-1;
      if(mot[0]>='a' && mot[0]<='z')
      {
        fl = (int)mot[0]-97;
      }
      else
76053da1   Thorsieger   update des fichiers
157
      {
0f6db57b   Thorsieger   gestion des accen...
158
159
160
161
162
163
164
165
166
167
168
        for(int i = 26; i < Dico.taille; i++)
        {
          if(Dico.tab_ptr_tree[i]->val == mot[0]){fl = i;break;}
        }
        if(fl == -1)return 1;
      }
  
      int taille = size(mot);
      if(taille==1 && Dico.tab_ptr_tree[fl]!=NULL)
      {
          if(Dico.tab_ptr_tree[fl]->fin==0)return 1;
76053da1   Thorsieger   update des fichiers
169
170
          else return 0;//vrais
      }
0f6db57b   Thorsieger   gestion des accen...
171
      if(taille==1 && Dico.tab_ptr_tree[fl]==NULL)return 1;//faux
76053da1   Thorsieger   update des fichiers
172
  
0f6db57b   Thorsieger   gestion des accen...
173
174
      struct node *ptr_node = Dico.tab_ptr_tree[fl];
      for(int i=1;i<taille;i++)
76053da1   Thorsieger   update des fichiers
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
      {
          if(ptr_node->nbr_fils==0)return 1;
          for(int k=0;k<(ptr_node->nbr_fils);k++)
          {
              if(ptr_node->fils[k]->val==mot[i])
              {
                  ptr_node=ptr_node->fils[k];
                  break;
              }
  	    else if(k+1==ptr_node->nbr_fils)return 1;
          }
      }
  
      if(ptr_node->fin==0)return 1;
      else return 0;
  }
  
0f6db57b   Thorsieger   gestion des accen...
192
  int find_erreur(dico Dico, FILE *fp)
76053da1   Thorsieger   update des fichiers
193
  {
16e67e7e   Thorsieger   l'utilisateur peu...
194
    wchar_t val[3000];
0f6db57b   Thorsieger   gestion des accen...
195
196
197
198
199
200
201
202
203
204
205
206
207
    int cpt_erreur =0;
    
    while(fwscanf(fp, L"%ls",val)==1)
      {
        toLowerCase(val);
        cpt_erreur += split_text(Dico,val);
      }
  
      //On peut tester la bonne ou mauvaise terminaison de la lecture
      if(feof(fp))    printf("Fin normal de lecture\n");
      if(ferror(fp))  printf("ERREUR de lecture\n");
  
      return cpt_erreur;
76053da1   Thorsieger   update des fichiers
208
  }
0f6db57b   Thorsieger   gestion des accen...
209
210
211
212
213
214
215
216
217
218
219
  
  int split_text(dico Dico,wchar_t message[])
  {  
    if(message[0] == 0)return 0;
    wchar_t *buffer;
    wchar_t *token = wcstok(message, L" ,?;.:/!*+\\\"()=«»", &buffer);
    int err = find_mot(Dico,token);
    if(buffer!=NULL)err += split_text(Dico,buffer);
  
    return err;
  }