2016-10-25 04:51:07 +00:00
|
|
|
#ifndef __IN303_HUFTREE_H__
|
|
|
|
#define __IN303_HUFTREE_H__
|
|
|
|
|
2016-10-27 16:19:44 +00:00
|
|
|
#include <stdio.h>
|
2016-10-25 04:51:07 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2016-11-20 13:33:55 +00:00
|
|
|
#include "common.h"
|
|
|
|
|
2016-11-19 20:38:56 +00:00
|
|
|
typedef struct WriteBuffer WriteBuffer;
|
|
|
|
typedef struct ReadBuffer ReadBuffer;
|
2016-10-28 14:35:50 +00:00
|
|
|
|
2016-10-25 04:51:07 +00:00
|
|
|
/**
|
2016-11-19 20:38:56 +00:00
|
|
|
* Représente un des sommets d'un arbre de Huffman (représente l'arbre
|
|
|
|
* en entier s'il s'agit de la racine)
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
|
|
|
typedef struct HufVertex HufVertex;
|
2016-11-19 20:38:56 +00:00
|
|
|
typedef HufVertex* HufTree;
|
2016-10-25 04:51:07 +00:00
|
|
|
struct HufVertex {
|
2016-11-20 14:57:15 +00:00
|
|
|
// 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;
|
2016-10-25 04:51:07 +00:00
|
|
|
|
2016-11-20 14:57:15 +00:00
|
|
|
// 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;
|
2016-10-25 04:51:07 +00:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2016-11-20 13:33:55 +00:00
|
|
|
* Construire un arbre de Huffman basé sur les effectifs
|
|
|
|
* de caractères passés dans `counts`
|
2016-10-25 04:51:07 +00:00
|
|
|
*
|
|
|
|
* (résultat à libérer avec `freeTree`)
|
|
|
|
*/
|
2016-11-20 13:33:55 +00:00
|
|
|
HufTree createTree(bytecount* counts);
|
2016-10-25 04:51:07 +00:00
|
|
|
|
2016-10-27 16:19:44 +00:00
|
|
|
/**
|
2016-10-28 14:27:25 +00:00
|
|
|
* Écrit une représentation binaire de l'arbre dans le
|
|
|
|
* tampon passé en paramètre
|
2016-10-27 16:19:44 +00:00
|
|
|
*/
|
2016-11-19 20:38:56 +00:00
|
|
|
void writeTree(HufTree, WriteBuffer*);
|
2016-10-27 16:19:44 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Reconstruit un arbre de Huffman à partir du fichier passé
|
|
|
|
* en paramètre
|
|
|
|
*/
|
2016-11-19 20:38:56 +00:00
|
|
|
HufTree readTree(ReadBuffer*);
|
2016-10-27 16:19:44 +00:00
|
|
|
|
2016-10-25 04:51:07 +00:00
|
|
|
/**
|
|
|
|
* 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
|