#ifndef __IN303_HUFTREE_H__ #define __IN303_HUFTREE_H__ #include #include #include "common.h" typedef struct WriteBuffer WriteBuffer; typedef struct ReadBuffer ReadBuffer; /** * Représente un des sommets d'un arbre de Huffman (représente l'arbre * en entier s'il s'agit de la racine) */ typedef struct HufVertex HufVertex; typedef HufVertex* HufTree; struct HufVertex { // Caractère associé à ce sommet ou -1 s'il n'y a aucun caractère // associé (notamment s'il s'agit d'une branche) unsigned int value; // Indique l'effectif du caractère associée à ce sommet // dans le fichier source, ou -1 s'il n'y a aucun caractère associé bytecount count; // Pointeurs vers les deux enfants de ce sommet. Ils valent tous // deux NULL si le sommet est une feuille. À noter qu'un sommet // a toujours 0 ou 2 enfants car un arbre de Huffman est binaire HufVertex* child_l; HufVertex* child_r; }; /** * Construire un arbre de Huffman basé sur les effectifs * de caractères passés dans `counts` * * (résultat à libérer avec `freeTree`) */ HufTree createTree(bytecount* counts); /** * Écrit une représentation binaire de l'arbre dans le * tampon passé en paramètre */ void writeTree(HufTree, WriteBuffer*); /** * Reconstruit un arbre de Huffman à partir du fichier passé * en paramètre */ HufTree readTree(ReadBuffer*); /** * Libérer la mémoire occupée par un arbre de Huffman * généré par la fonction `createTree` */ void freeTree(HufTree tree); /** * Associer à chaque feuille de l'arbre une étiquette unique basée * sur sa position dans l'arbre. Aucune étiquette n'est ainsi préfixe * d'une autre. Le tableau renvoyé associe chaque caractère ASCII * à son préfixe, ou à NULL s'il n'est pas présent dans l'arbre * * (résultat à libérer avec `freeTreeLabels`) */ char** createTreeLabels(HufTree tree); /** * Libérer la mémoire occupée par un tableau d'étiquettes renvoyé * par la fonction `labelTree` */ void freeTreeLabels(char** labels); #endif