71 lines
1.9 KiB
C
71 lines
1.9 KiB
C
|
#ifndef __IN303_HUFTREE_H__
|
||
|
#define __IN303_HUFTREE_H__
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
/**
|
||
|
* Représente un des sommets d'un arbre de Huffman
|
||
|
*/
|
||
|
typedef struct HufVertex HufVertex;
|
||
|
struct HufVertex {
|
||
|
// Indique la fréquence d'apparition de la lettre du sommet
|
||
|
// dans le corpus original, ou bien la somme des fréquences
|
||
|
// de ses enfants (si ce n'est pas une feuille)
|
||
|
double frequency;
|
||
|
|
||
|
// Caractère du corpus original associé à ce sommet. Uniquement
|
||
|
// valable pour les feuilles. Pour les autres sommets, la valeur
|
||
|
// de (character) n'est pas garantie
|
||
|
char character;
|
||
|
|
||
|
// 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;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Représente un arbre de Huffman
|
||
|
*/
|
||
|
typedef struct HufTree HufTree;
|
||
|
struct HufTree {
|
||
|
// Pointeur sur la racine de l'arbre
|
||
|
HufVertex* root;
|
||
|
|
||
|
// Quantité de sommets dans l'arbre
|
||
|
size_t size;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Construire un arbre de Huffman basé sur les fréquences
|
||
|
* de caractères passées dans `frequencies`
|
||
|
*
|
||
|
* (résultat à libérer avec `freeTree`)
|
||
|
*/
|
||
|
HufTree createTree(double* frequencies);
|
||
|
|
||
|
/**
|
||
|
* 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
|