bonjour
svp aide moi 
 
exercice: 
1-implémenter une fonction permattant de calculer les fréquences contenus dans une chaine de caracteres 
2-implémenter une fonction permattant de calculer les fréquences contenus dans un fichier texte (nom de fichier fich1.txt et adrresse d://fich1.txt). 
3-implementer l'algorithme de hoffman pour calculer les codes des caracteres selon un tableau de frequences 
4-implimenter l'algorithme de hoffman permattant le decodage 
5-rediger un rapport concernant votre implimentation 
et voila mon essaye 
ou es l erreur 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct noeud 
{ 
unsigned char lettre; 
int nb_occ; 
struct noeud * f_g, * f_d; 
} Noeud; 
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ, 
Noeud * gauche, Noeud * droite); 
void initialiser(Noeud * table[256]); 
int compter(char * nom_sortie, Noeud * table[256]); 
int trier_eliminer(Noeud * table[256]); 
void inserer(Noeud * table[256], Noeud * cle, int taille); 
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul); 
int profondeur(Noeud * arbre); 
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur); 
void afficher(FILE * sortie, char ** table_code); 
int nb_0_1(Noeud * arbre, int hauteur); 
int main(int argc, char ** argv) 
{ 
Noeud * table[256]; 
Noeud * arbre; 
char * table_code[256]; 
char * chaine; 
int max, i, nb_non_nul; 
int longueur_non_code; 
int longueur_code; 
int nb; 
FILE * sortie; 
initialiser(table); 
longueur_non_code = compter(argv[1], table); 
nb_non_nul = trier_eliminer(table); 
arbre = calculer_arbre(table, nb_non_nul); 
max = profondeur(arbre); 
printf("max = %d\n", max); 
for (i = 0; i < 256; i++) table_code[i] = NULL; 
chaine = (char *) malloc((max + 1) * sizeof(char)); 
if (chaine == NULL) 
{ 
printf("plus de place pour chaine\n"); 
exit(1); 
} 
remplir_table(arbre, table_code, chaine, 0); 
sortie = fopen(argv[2], "w"); 
if (sortie == NULL) 
{ 
printf("fichier inexistant\n"); 
exit(1); 
} 
afficher(stdout, table_code); 
afficher(sortie, table_code); 
fclose(sortie); 
printf("longueur du texte non code = %d\n", longueur_non_code); 
nb = longueur_code = nb_0_1(arbre, 0); 
longueur_code = nb / 8 + (nb % 8 != 0 ? 1 : 0); 
printf("longueur du texte code = %d\n", longueur_code); 
return 0; 
} 
Noeud * nouveau_noeud(unsigned char lettre, int nb_occ, 
Noeud * gauche, Noeud * droite) 
{ 
Noeud * nouveau; 
nouveau = (Noeud *) malloc(sizeof(Noeud)); 
if (nouveau == NULL) 
{ 
printf("plus de place dans nouveau_noeud\n"); 
exit(1); 
} 
nouveau -> lettre = lettre; 
nouveau -> nb_occ = nb_occ; 
nouveau -> f_g = gauche; 
nouveau -> f_d = droite; 
return nouveau;	
} 
void initialiser(Noeud * table[256]) 
{ 
int i; 
for (i = 0; i < 256; i++) table[i] = nouveau_noeud(i, 0, NULL, NULL); 
} 
/* Compte les nombres d'occurrences de chaque lettre 
et renvoie le nombre total de lettres du texte */ 
int compter(char * D://fich1.txt, Noeud * table[256]) 
{ 
unsigned char caractere; 
int nb = 0; 
FILE * fichier; 
fichier = fopen(D://fich1.txt, "r"); 
if (fichier == NULL) 
{ 
printf("fichier inexistant\n"); 
exit(1); 
} 
while (fscanf(fichier, "%c", &caractere) != EOF) 
{ 
table[caractere] -> nb_occ++; 
nb++; 
} 
fclose(fichier); 
return nb; 
} 
/* insere le noeud cle dans le tableau de noeuds table trié par ordre 
décroissant entre les indices 0 à taille - 1 
en respectant l'ordre décroissant 
*/ 
void inserer(Noeud * table[256], Noeud * cle, int taille) 
{ 
int i = taille; 
while ((i >= 1) && (table[i - 1] -> nb_occ < cle -> nb_occ)) 
{ 
table[i] = table[i - 1]; 
i = i - 1; 
} 
table[i] = cle; 
} 
int trier_eliminer(Noeud * table[256]) 
{ 
int i; 
int nb_non_nul = 0; 
for (i = 1; i < 256; i++) 
if (table[i] -> nb_occ > 0) 
{ 
inserer(table, table[i], nb_non_nul); 
nb_non_nul++; 
} 
else free(table[i]); 
return nb_non_nul; 
} 
Noeud * calculer_arbre(Noeud * table[256], int nb_non_nul) 
{ 
int nb; 
Noeud * n1, * n2, * nouveau;; 
for (nb = nb_non_nul; nb > 1; nb--) 
{ 
n1 = table[nb - 2]; 
n2 = table[nb - 1]; 
nouveau = nouveau_noeud('_', n1 -> nb_occ + n2 -> nb_occ, n1, n2); 
inserer(table, nouveau, nb - 2); 
} 
return table[0]; 
} 
int profondeur(Noeud * arbre) 
{ 
int g, d; 
if (arbre == NULL) return -1; 
g = profondeur(arbre -> f_g); 
d = profondeur(arbre -> f_d); 
if (g >= d) return g + 1; 
return d + 1; 
} 
void remplir_table(Noeud * arbre, char ** table_code, char * chaine, int hauteur) 
{ 
unsigned char lettre; 
if (arbre -> f_g == NULL) 
{ 
lettre = arbre -> lettre; 
chaine[hauteur] = '\0'; 
table_code[lettre] = (char *) malloc((hauteur + 1) * sizeof(char)); 
if (table_code[lettre] == NULL) 
{ 
printf("plus de place dans remplir_table\n"); 
exit(1); 
} 
strcpy(table_code[lettre], chaine); 
} 
else 
{ 
chaine[hauteur] = '0'; 
remplir_table(arbre -> f_g, table_code, chaine, hauteur + 1); 
chaine[hauteur] = '1'; 
remplir_table(arbre -> f_d, table_code, chaine, hauteur + 1); 
} 
} 
void afficher(FILE * sortie, char ** table_code) 
{ 
int i; 
for (i = 0; i < 256; i++) 
if (table_code[i] != NULL) fprintf(sortie, "%c (%d) : %s\n", i, i, table_code[i]); 
} 
/* Retourne le nombre de 0 et de 1 correspondant au codage dans le texte codé 
des lettres contenus dans arbre */ 
int nb_0_1(Noeud * arbre, int hauteur) 
{ 
if (arbre -> f_g == NULL) return hauteur * arbre -> nb_occ; 
return nb_0_1(arbre -> f_g, hauteur + 1) + nb_0_1(arbre -> f_d, hauteur + 1); 
}