Codage Huffman - Affichage d'un tableau des caractères

Fermé
zibrata Messages postés 37 Date d'inscription samedi 12 novembre 2011 Statut Membre Dernière intervention 13 décembre 2016 - 13 déc. 2016 à 13:22
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 14 déc. 2016 à 13:48
Mes salutation !

Dans le cadre d'un projet en C je dois réaliser un algorithme d'Huffman.
Afin de valider le projet il m'est demandé quelques points essentiels :

1) La lecture d’un fichier texte sur le disque
2) L'affichage du tableau des caractères, de la fréquence et du code associé
3) La génération d'un arbre en fonction des occurrences des caractères

J'ai réussi le 1) :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAILLE_MAX 1000

typedef struct Noeud Noeud;
struct Noeud {
    char caractere;
    int frequence;
    struct Noeud *droit,*gauche;
};



void lireTexte(FILE* fichier) {
    
    char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
    
    if (fichier != NULL)
    {
        fgets(chaine, TAILLE_MAX, fichier); // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
        printf("Lecture du fichier : '%s'\n\n", chaine);
        
        fclose(fichier);
    }
}


Mais je me trouve bloqué pour le 2)... J'ai crée la structure Noeud car je pense que j'en aurais besoin mais je ne sais pas vraiment comment l'utiliser afin d'afficher un tableau des fréquences des caractères ainsi que du code associé.

Je ne demande pas le code tout fait, je demande de l'aide afin de comprendre comment manipuler ces caractères un par un et en sortir leurs fréquences.

Merci d'avance,
zibrata
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
14 déc. 2016 à 10:42
Salut zibrata,

Je n'ai jamais fait d'implémentation de l'algorithme d'Huffman, mais comme personne ne répond, je te donne quelques indications qui me viennent à l'esprit.

Ma compréhension est que tu dois ici faire une première passe, puisque tu dis devoir décompter les fréquences correspondant exactement à ton texte.

Si je devais le faire, je le ferais avec un tableau de 256
struct Noeud
(256 étant sur ma machine, la valeur de 2 élevé à la puissance
CHAR_BIT
tel que définie dans
limits.h
sur mon implémentation), initialisé à 0, que tu utilises comme un tableau associatif, en utilisant en index le char à décompter.

Ensuite, tu te sers du contenu du tableau pour construire ton arbre, en utilisant les pointeurs vers les entrées du tableau associatif qui contiennent ton décompte...

cela paraît pas mal... non ? :-)

Sinon, avec ton code, tu ne vas lire qu'une ligne de ton fichier.. car
fgets()
va s'arrêter au premier retour à la ligne trouvé...

http://www.cplusplus.com/reference/cstdio/fgets/


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 14/12/2016 à 14:02
Ensuite, tu te sers du contenu du tableau pour construire ton arbre, en utilisant les pointeurs vers les entrées du tableau associatif qui contiennent ton décompte...

en créant ta "priority queue"
0