huffman/inc/huftree.h

77 lines
2.0 KiB
C

#ifndef __IN303_HUFTREE_H__
#define __IN303_HUFTREE_H__
#include <stdio.h>
#include <stdlib.h>
#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