TP6: Add ABR and tree n
[Algorithmic_C.git] / TP6 / arbres / arbre-n-aire / arbre_n_aire_a_completer.c
CommitLineData
5f72f302
JB
1/*****************************************************************************/\r
2/* arbre_n_aire.c */\r
3/* Representation d'un ensemble de mots sous forme d'arbre n-aire */\r
4/*****************************************************************************/\r
5\r
6#include <stdio.h>\r
7#include <stdlib.h>\r
8#include <string.h>\r
9\r
10\r
11/* nombre de caracteres max dans un mot */\r
12#define N 30\r
13\r
14\r
15typedef struct noeud {\r
16 char lettre;\r
17 struct noeud *fils;\r
18 struct noeud *frere;\r
19} NOEUD;\r
20\r
21\r
22\r
23/* Recherche d'un mot dans l'arbre *****************************************/ \r
24int recherche(NOEUD *p, char *mot, int i)\r
25{\r
26 /* TODO */\r
27 return 0;\r
28}\r
29\r
30\r
31\r
32/* Creation d'une fin de mot (liste chainee suivant le lien fils) **********/\r
33NOEUD *insere_fin(char *mot, int i) /* i est l'indice de la lettre courante dans le mot */\r
34{\r
35 printf("insere_fin %c, %i\n", mot[i], i);\r
36 NOEUD *p = (NOEUD *)malloc(sizeof(NOEUD));\r
37 if(p == NULL) exit(-1);\r
38 p->lettre = mot[i]; \r
39 p->fils = NULL; \r
40 p->frere = NULL;\r
41 if(mot[i]) p->fils = insere_fin(mot, i+1);\r
42 return p;\r
43}\r
44\r
45\r
46/* Insertion d'un mot dans l'arbre ******************************************/\r
47/* (on respecte l'ordre lexicographique des freres)**************************/\r
48NOEUD *insere(NOEUD *p, char *mot, int i) /* i est l'indice de la lettre courante dans le mot */\r
49{\r
50 /* TODO */\r
51 if(p == NULL) p = insere_fin(mot, i);\r
52 return p;\r
53}\r
54\r
55 \r
56/*****************************************************************************/\r
57/* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre */\r
58void affiche(NOEUD *p, char *mot, int i) /* i est l'indice de la lettre courante dans le mot */\r
59{\r
60 /* TODO */ \r
61}\r
62\r
63\r
64/* Visualisation de l'arbre n-aire *******************************************/\r
65void affiche_arbre(NOEUD *p, int prof) /* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */\r
66{\r
67 int i;\r
68 if(p) \r
69 {\r
70 affiche_arbre(p->frere,prof);\r
71 for (i=0;i<prof;i++) printf(" ");\r
72 printf("%c\n",p->lettre);\r
73 affiche_arbre(p->fils,prof+1);\r
74 }\r
75}\r
76\r
77\r
78/* Suppression d'un mot de l'arbre ********************************************/\r
79/* Attention a ne supprimer que la fin du mot qui n'est partagee par aucun autre mot de l'arbre */\r
80NOEUD *supprime(NOEUD *p, char *mot, int i) /* i est l'indice de la lettre courante dans le mot */\r
81{\r
82 /* TODO */\r
83 return p;\r
84}\r
85\r
86\r
87\r
88/* Chargement des mots d'un fichier (vu comme un dictionnaire) dans l'arbre **/\r
89NOEUD *charge_dico(char *nom_fichier, int *nb_mots)\r
90{\r
91 NOEUD *p;\r
92 FILE *fp;\r
93 char mot[N];\r
94 int i;\r
95 \r
96 p = NULL; \r
97 fp = fopen(nom_fichier,"rt");\r
98 if (fp == NULL) exit(-1);\r
99 fscanf(fp,"%d",nb_mots); /* sur la 1ere ligne du fichier, le nombre de mots */\r
100 for (i=0; i< *nb_mots; i++) \r
101 {\r
102 fscanf(fp,"%s",mot);\r
103 p = insere(p, mot, 0); /* TODO il faut finir "insere" pour que "charge_dico" fonctionne */\r
104 }\r
105 fclose(fp);\r
106 return p;\r
107}\r
108\r
109\r
110\r
111/* Ecriture dans fp de tous les mots stockes dans l'arbre ********************/\r
112void affiche_fich(FILE *fp, NOEUD *p, char *mot, int i)\r
113{ \r
114 /* TODO */\r
115 /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */\r
116}\r
117\r
118\r
119/* Sauvegarde des mots de l'arbre dans un fichier ****************************/\r
120void sauve_dico(NOEUD *p, char *nom_fichier, int nb_mots)\r
121{\r
122 FILE *fp;\r
123 char mot[N];\r
124 \r
125 fp = fopen(nom_fichier,"wt");\r
126 if (fp == NULL) exit(-1);\r
127 fprintf(fp,"%d\n",nb_mots);\r
128 affiche_fich(fp,p,mot,0); /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */\r
129 fclose(fp);\r
130}\r
131\r
132\r
133\r
134\r
135/*****************************************************************************/\r
136int main(int argc, char *argv[])\r
137{\r
138 char mot[N];\r
139 NOEUD *arbre = NULL;\r
140\r
141 printf("saisir un mot : ");\r
142 gets(mot); \r
143\r
144 printf("\ninsertion de %s\n", mot);\r
145 arbre = insere(arbre, mot, 0);\r
146\r
147 printf("\naffichage arbre :\n");\r
148 affiche_arbre(arbre, 0);\r
149\r
150 /* TODO */\r
151\r
152}\r
153\r
154\r
155\r
156/* Exemple de trace d'execution *************************\r
157\r
158saisir un mot : salut\r
159\r
160insertion de salut\r
161insere_fin s, 0\r
162insere_fin a, 1\r
163insere_fin l, 2\r
164insere_fin u, 3\r
165insere_fin t, 4\r
166insere_fin , 5\r
167\r
168affichage arbre :\r
169s\r
170 a\r
171 l\r
172 u\r
173 t\r
174 \r
175... TODO ...\r
176\r
177**********************************************************/ \r
178\r