Commit 2d053d0686ea2240da48653dc5d14b4b7b38e28e

Authored by mclaudel
1 parent 8b61d242

Projet modifié

Showing 1 changed file with 116 additions and 73 deletions   Show diff stats
@@ -4,120 +4,163 @@ @@ -4,120 +4,163 @@
4 #include <string.h> 4 #include <string.h>
5 5
6 #define MAX_LETTRES 30 6 #define MAX_LETTRES 30
  7 +#define size 26
7 8
8 9
9 typedef struct node { 10 typedef struct node {
10 char l; 11 char l;
11 - struct node * lettres[27]; 12 + struct node * lettres[size];
12 bool fin_de_mot; 13 bool fin_de_mot;
13 - int dernier;  
14 } Node; 14 } Node;
15 15
  16 +
  17 +
  18 +
  19 +
  20 +
16 bool is_empty(struct node *tree) 21 bool is_empty(struct node *tree)
17 { 22 {
18 return tree==NULL; 23 return tree==NULL;
19 } 24 }
20 25
  26 +
  27 +
  28 +
  29 +
  30 +
21 bool is_leaf(struct node *tree) 31 bool is_leaf(struct node *tree)
22 { 32 {
23 - int cpt;  
24 - int i=0;  
25 - if (is_empty(tree)) return 1;  
26 - while (tree->lettres[i] != NULL){  
27 - cpt++;  
28 - i++;  
29 - }  
30 - if (cpt !=0) cpt=1;  
31 - return(!is_empty(tree) && !cpt); 33 + int cpt=1;
  34 + if (is_empty(tree)) return 1;
  35 + for (int i=0; i<size ; i++){
  36 + if ( tree->lettres[i] == NULL){
  37 + cpt++;
  38 + }
  39 + }
  40 + if (cpt == size) cpt=1;
  41 + if (cpt != size) cpt=0;
  42 + return cpt ;
32 } 43 }
33 44
34 45
35 -void ajout(Node **N, char mot) 46 +
  47 +
  48 +
  49 +
  50 +void ajout(Node **N, char lettre)
36 { 51 {
37 - Node *nouveau = malloc(sizeof(struct node));  
38 - (*nouveau).l=mot;  
39 - for (int i=0; i<27; i++) nouveau->lettres[i]=NULL;  
40 - *N = nouveau; 52 + Node *nouveau = malloc(sizeof(Node));
  53 + (*nouveau).l=lettre;
  54 + (*nouveau).fin_de_mot=0;
  55 + for (int i=0; i<size; i++) nouveau->lettres[i]=NULL;
  56 + *N = nouveau;
41 } 57 }
42 58
43 59
44 -void ajout_alphab(Node ** pn, char * mot,int cpt,int i) 60 +
  61 +
  62 +
  63 +
  64 +void ajout_alphab(Node ** pn, char * mot,int cpt)
45 { 65 {
46 - while (mot[cpt] != '\0'){  
47 - if ((*pn)==NULL){  
48 - ajout(pn,mot[cpt]); 66 + Node * tmp= *pn;
  67 + //printf("%d \n",cpt);
  68 + char lettre=mot[cpt];
  69 + int pos = lettre - 'a';
  70 + //printf("%c \n",lettre);
  71 + cpt++;
  72 + if (lettre == '\0'){
  73 + (*tmp).fin_de_mot=1;
  74 + return;
49 } 75 }
50 - while ((*pn)->lettres[i] != NULL){  
51 - if ((*pn)->l == '?'){  
52 - *pn = (*pn)->lettres[0];  
53 - }  
54 - if ((*pn)->l != mot[cpt]){  
55 - i++;  
56 - return ajout_alphab(&(*pn)->lettres[i],mot,cpt,i);  
57 - }  
58 - cpt++;  
59 - return ajout_alphab(&(*pn)->lettres[i],mot,cpt,i); 76 + if (tmp->lettres[pos] == NULL) {
  77 + //printf("Rentré \n");
  78 + ajout(&tmp->lettres[pos],lettre);
60 } 79 }
61 - (*pn)->dernier ++ ;  
62 - ajout(&(*pn)->lettres[i],mot[cpt]);  
63 - *pn=(*pn)->lettres[i];  
64 - cpt++;  
65 - }  
66 - (*pn)->fin_de_mot=1; 80 + return ajout_alphab(&tmp->lettres[pos],mot,cpt);
  81 +
  82 +
67 } 83 }
68 84
69 85
  86 +
  87 +
  88 +
  89 +
70 Node * charger_arbre(Node ** Arbre){ 90 Node * charger_arbre(Node ** Arbre){
71 - // FILE * dico;  
72 - //char mot[MAX_LETTRES];  
73 - Node * debut = *Arbre;  
74 - //dico = fopen("test.txt","r");  
75 - /* while (fscanf(dico,"%s",mot) == 1){  
76 - ajout_alphab(Arbre,mot,0,0);  
77 - }*/  
78 - ajout_alphab(Arbre,"camion",0,0);  
79 - *Arbre = debut;  
80 - ajout_alphab(Arbre,"casse",0,0);  
81 - *Arbre = debut;  
82 - //fclose(dico);  
83 - return *Arbre; 91 + FILE * dico;
  92 + char mot[MAX_LETTRES];
  93 + dico = fopen("text.txt","r");
  94 + int i;
  95 + while ((i = fscanf(dico,"%s",mot)) == 1){
  96 + ajout_alphab(Arbre,mot,0);
  97 + }
  98 + fclose(dico);
  99 + return *Arbre;
84 } 100 }
85 101
  102 +
  103 +
  104 +
  105 +
  106 +
86 void affichage_arbre(Node * Arbre) 107 void affichage_arbre(Node * Arbre)
87 { 108 {
88 - if (is_empty(Arbre)) return;  
89 - if (Arbre->lettres[0]== NULL) return;  
90 - for (int i=0; i<Arbre->dernier; i++){  
91 - printf("%c -> %c",Arbre->l,Arbre->lettres[i]->l);  
92 - affichage_arbre(Arbre->lettres[i]);  
93 - if (Arbre->fin_de_mot) printf("fin de mot");  
94 - }  
95 - 109 + if (Arbre->l == '?' && is_leaf(Arbre)){
  110 + printf("arbre vide \n");
  111 + return;
  112 + }
  113 + for (int i=0; i<size; i++){
  114 + if (Arbre->lettres[i] != NULL){
  115 + printf("%c -> %c \n",Arbre->l,Arbre->lettres[i]->l);
  116 + affichage_arbre(Arbre->lettres[i]);
  117 + }
  118 + }
  119 + if (Arbre->fin_de_mot) printf("fin de mot \n");
96 } 120 }
97 121
98 122
  123 +
  124 +
  125 +
  126 +
99 void detruire_arbre(Node ** Arbre) 127 void detruire_arbre(Node ** Arbre)
100 { 128 {
101 - for (int i=0; i<(*Arbre)->dernier ; i++){  
102 - if (*Arbre!=NULL) detruire_arbre(&(*Arbre)->lettres[i]);  
103 - }  
104 - free(*Arbre); 129 + printf("---------- \n");
  130 + printf("%p \n",*Arbre);
  131 + if (is_empty(*Arbre)) return;
  132 + printf("%c \n",(*Arbre)->l);
  133 + for (int i=0; i<size; i++){
  134 + detruire_arbre(&(*Arbre)->lettres[i]);
  135 + }
  136 + free(*Arbre);
  137 + printf("suppression \n");
  138 + printf("%p \n",*Arbre);
105 } 139 }
106 140
  141 +
  142 +
  143 +
  144 +
  145 +
107 void initialisation(Node ** Arbre){ 146 void initialisation(Node ** Arbre){
108 - Node *nouveau = malloc(sizeof(struct node));  
109 - (*nouveau).l='?';  
110 - for (int i=0; i<27; i++) nouveau->lettres[i]=NULL;  
111 - nouveau->dernier=0;  
112 - *Arbre = nouveau; 147 + Node *nouveau = malloc(sizeof(struct node));
  148 + (*nouveau).l='?';
  149 + for (int i=0; i<size; i++) nouveau->lettres[i] = NULL;
  150 + *Arbre = nouveau;
113 } 151 }
114 152
  153 +
  154 +
  155 +
  156 +
115 int main(){ 157 int main(){
116 - Node * Arbre;  
117 - initialisation(&Arbre);  
118 - charger_arbre(&Arbre);  
119 -  
120 - affichage_arbre(Arbre);  
121 - detruire_arbre(&Arbre);  
122 - return 0; 158 + Node * Arbre;
  159 + initialisation(&Arbre);
  160 + charger_arbre(&Arbre);
  161 + affichage_arbre(Arbre);
  162 + printf("Arbre fini \n");
  163 + detruire_arbre(&Arbre);
  164 + affichage_arbre(Arbre);
  165 + return 0;
123 } 166 }