Blame view

dico.c 6.26 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>
974b1ae4   tvolleri   ajout des fichier...
5
  #include "tree.h"
6394a205   vsalingu   Lecture du fichie...
6
7
  
  
6394a205   vsalingu   Lecture du fichie...
8
  
fb82dc55   vsalingu   dico ok à vérifie...
9
  ptarbre rech(ptarbre arbre, char lettre)
974b1ae4   tvolleri   ajout des fichier...
10
  // 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...
11
  {
04b8ce94   vsalingu   Modification de l...
12
    if (arbre!=NULL)
6394a205   vsalingu   Lecture du fichie...
13
      {
04b8ce94   vsalingu   Modification de l...
14
15
        while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
  	{
04b8ce94   vsalingu   Modification de l...
16
17
  	  arbre=(arbre->suivant);
  	}
6394a205   vsalingu   Lecture du fichie...
18
19
20
      }
    return arbre;
  }
974b1ae4   tvolleri   ajout des fichier...
21
22
23
  
  void init_dico(ptarbre* parbre, char lettre)
  // 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...
24
  {
fb82dc55   vsalingu   dico ok à vérifie...
25
    (*parbre)=malloc(sizeof(cell));
04b8ce94   vsalingu   Modification de l...
26
    (*parbre)->fils=malloc(sizeof(cell));
974b1ae4   tvolleri   ajout des fichier...
27
28
29
30
31
32
33
34
35
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'.
    (*parbre)->suivant=NULL;
    (*parbre)->lettre=lettre;
    (*parbre)->fin_mot=false;
  }
  
  void ajout_dico_tete(ptarbre *parbre, char lettre)
  // 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'.
  {
    (*parbre)->fils=malloc(sizeof(cell));
04b8ce94   vsalingu   Modification de l...
37
    (*parbre)->fils->suivant=NULL;
6394a205   vsalingu   Lecture du fichie...
38
    (*parbre)->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
39
    (*parbre)->lettre=lettre;
04b8ce94   vsalingu   Modification de l...
40
    (*parbre)->fin_mot=false;
6394a205   vsalingu   Lecture du fichie...
41
42
  }
  
fb82dc55   vsalingu   dico ok à vérifie...
43
  void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
974b1ae4   tvolleri   ajout des fichier...
44
  // 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...
45
  {
fb82dc55   vsalingu   dico ok à vérifie...
46
47
    *parbresuiv=malloc(sizeof(cell));
    (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
04b8ce94   vsalingu   Modification de l...
48
49
    (*parbresuiv)->fils=malloc(sizeof(cell));
    (*parbresuiv)->fils->suivant=NULL;
fb82dc55   vsalingu   dico ok à vérifie...
50
    (*parbresuiv)->suivant=NULL;
04b8ce94   vsalingu   Modification de l...
51
    (*parbresuiv)->fin_mot=false;
fb82dc55   vsalingu   dico ok à vérifie...
52
    (*parbresuiv)->lettre=lettre;
6394a205   vsalingu   Lecture du fichie...
53
54
  }
  
73e92d24   vsalingu   Modifications de ...
55
  void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
974b1ae4   tvolleri   ajout des fichier...
56
  // 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...
57
  {
04b8ce94   vsalingu   Modification de l...
58
59
60
61
62
63
    if(arbre == NULL)
      {
      return;
      }
    else
      {
73e92d24   vsalingu   Modifications de ...
64
        if (arbre->fils != NULL)
04b8ce94   vsalingu   Modification de l...
65
  	{
73e92d24   vsalingu   Modifications de ...
66
67
  	  mot[n_lettre]=arbre->lettre;
  	  n_lettre++;
04b8ce94   vsalingu   Modification de l...
68
  	}
974b1ae4   tvolleri   ajout des fichier...
69
70
71
72
73
74
75
        if (arbre->fin_mot)
  	{
  	  printf("%s",mot);
  	  printf("\n");
  	}
        
        affiche_dico(arbre->fils,n_lettre,mot);
73e92d24   vsalingu   Modifications de ...
76
77
        if (arbre->suivant != NULL)
  	{
974b1ae4   tvolleri   ajout des fichier...
78
79
  	  n_lettre--;
  	  mot[n_lettre]='\0';
73e92d24   vsalingu   Modifications de ...
80
  	}
974b1ae4   tvolleri   ajout des fichier...
81
        affiche_dico(arbre->suivant, n_lettre, mot);
73e92d24   vsalingu   Modifications de ...
82
        n_lettre--;
974b1ae4   tvolleri   ajout des fichier...
83
        mot[n_lettre]='\0';
73e92d24   vsalingu   Modifications de ...
84
  	  
974b1ae4   tvolleri   ajout des fichier...
85
      }
04b8ce94   vsalingu   Modification de l...
86
   
6394a205   vsalingu   Lecture du fichie...
87
  }
04b8ce94   vsalingu   Modification de l...
88
89
  
  void free_tree(cell **ptr_tree)
974b1ae4   tvolleri   ajout des fichier...
90
  // Action qui libère la mémoire allouée pour stockée les données du dictionnaire *(*ptr_tree).
04b8ce94   vsalingu   Modification de l...
91
  {
974b1ae4   tvolleri   ajout des fichier...
92
    if ((*ptr_tree)==NULL)
04b8ce94   vsalingu   Modification de l...
93
94
95
96
97
98
99
100
101
102
103
      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);
      }
  }
  
974b1ae4   tvolleri   ajout des fichier...
104
105
  void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
  // 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. 
6394a205   vsalingu   Lecture du fichie...
106
  {
974b1ae4   tvolleri   ajout des fichier...
107
    char c;
fb82dc55   vsalingu   dico ok à vérifie...
108
    ptarbre rec;
974b1ae4   tvolleri   ajout des fichier...
109
     while (fscanf(fp,"%c",&c)!= EOF) // Lecture de tout le fichier fp.
6394a205   vsalingu   Lecture du fichie...
110
      {
6394a205   vsalingu   Lecture du fichie...
111
112
        if (c != '\n')
  	{
974b1ae4   tvolleri   ajout des fichier...
113
  	  if ((*parbre_originel)==NULL) // Cas où c'est le premier mot et premiere lettre du dictionnaire.
6394a205   vsalingu   Lecture du fichie...
114
  	    {
974b1ae4   tvolleri   ajout des fichier...
115
116
117
118
119
120
121
122
123
124
  	      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.
  	    }
  	  else if ((*parbre)==NULL) // Cas où c'est le premier mot de l'arbre mais pas la première lettre.
  	    {
  	      init_dico(parbre,c);
  	      (*parbre_prec)=(*parbre);
  	      (*parbre)=(*parbre)->fils;
  	    }
6394a205   vsalingu   Lecture du fichie...
125
  	  
974b1ae4   tvolleri   ajout des fichier...
126
  	  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. 
6394a205   vsalingu   Lecture du fichie...
127
  	    {
974b1ae4   tvolleri   ajout des fichier...
128
129
  	      rec=rech((*parbre),c);
  	      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.
6394a205   vsalingu   Lecture du fichie...
130
  		{
974b1ae4   tvolleri   ajout des fichier...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  
  		  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.
  		    {
  		      ajout_dico_tete(parbre,c);
  		      (*parbre_prec)=(*parbre);
  		      (*parbre)=(*parbre)->fils;
  		    }
  		      
  		  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.
  		    {
  		      ajout_dico(&(rec),&(rec->suivant),c);
  		      (*parbre_prec)=rec->suivant;
  		      (*parbre)=rec->suivant->fils;
  		    }
fb82dc55   vsalingu   dico ok à vérifie...
145
  		}
fb82dc55   vsalingu   dico ok à vérifie...
146
147
  	  
  	      else
974b1ae4   tvolleri   ajout des fichier...
148
149
150
151
  		{// 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.
  		  (*parbre_prec)=rec;
  		  (*parbre)=rec->fils; // On va à ltage d'après pour former le mot dans l'arbre.
  		 
6394a205   vsalingu   Lecture du fichie...
152
  		}
fb82dc55   vsalingu   dico ok à vérifie...
153
  	    
04b8ce94   vsalingu   Modification de l...
154
  	      
6394a205   vsalingu   Lecture du fichie...
155
  	    }
fb82dc55   vsalingu   dico ok à vérifie...
156
  	}
974b1ae4   tvolleri   ajout des fichier...
157
158
        else { // Cas où c==\n donc le mot est terminé, il faut retourner en haut de l'arbre pour ajouter le prochain mot.
  	if ((*parbre_originel)!=NULL)
04b8ce94   vsalingu   Modification de l...
159
  	  {
974b1ae4   tvolleri   ajout des fichier...
160
  	    (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot.
04b8ce94   vsalingu   Modification de l...
161
  	  }
974b1ae4   tvolleri   ajout des fichier...
162
  	(*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot.
6394a205   vsalingu   Lecture du fichie...
163
        }
6394a205   vsalingu   Lecture du fichie...
164
      }
6394a205   vsalingu   Lecture du fichie...
165
  }