2016-11-30 10:55:10 +00:00
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* @brief Représentation mémoire des arbres binaires de Huffman.
|
|
|
|
*
|
|
|
|
* Définir une structure permettant de représenter en mémoire les
|
|
|
|
* arbres binaires de Huffman et des fonctions permettant de manipuler
|
|
|
|
* ces arbres.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __HUFFMAN_HUFTREE_H_INCLUDED__
|
|
|
|
#define __HUFFMAN_HUFTREE_H_INCLUDED__
|
2016-10-25 04:51:07 +00:00
|
|
|
|
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-30 10:55:10 +00:00
|
|
|
//! \{
|
2016-11-19 20:38:56 +00:00
|
|
|
typedef struct WriteBuffer WriteBuffer;
|
|
|
|
typedef struct ReadBuffer ReadBuffer;
|
2016-11-30 10:55:10 +00:00
|
|
|
//! \}
|
2016-10-28 14:35:50 +00:00
|
|
|
|
2016-10-25 04:51:07 +00:00
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Sommet d'un arbre binaire de Huffman.
|
|
|
|
*
|
|
|
|
* Sommet possédant éventuellement une valeur (caractère associé),
|
|
|
|
* un effectif d'apparition (nombre d'occurences du caractère dans la source)
|
|
|
|
* et un sommet enfant à gauche et/ou à droite.
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
2016-11-30 10:55:10 +00:00
|
|
|
typedef struct HufVertex {
|
|
|
|
/**
|
|
|
|
* Caractère associé au sommet, ou -1 si aucun caractère
|
|
|
|
* n'est associé (par exemple pour les sommets internes).
|
|
|
|
*/
|
2016-11-20 14:57:15 +00:00
|
|
|
unsigned int value;
|
2016-10-25 04:51:07 +00:00
|
|
|
|
2016-11-30 10:55:10 +00:00
|
|
|
/**
|
|
|
|
* Effectif du caractère associé au sommet, ou -1 si aucun
|
|
|
|
* caractère n'est associé.
|
|
|
|
*/
|
2016-11-20 14:57:15 +00:00
|
|
|
bytecount count;
|
2016-10-25 04:51:07 +00:00
|
|
|
|
2016-11-30 10:55:10 +00:00
|
|
|
/**
|
|
|
|
* Sommet enfant à gauche, ou NULL si ce sommet n'a pas d'enfant
|
|
|
|
* à gauche.
|
|
|
|
*/
|
|
|
|
struct HufVertex* child_l;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sommet enfant à droite, ou NULL si ce sommet n'a pas d'enfant
|
|
|
|
* à droite.
|
|
|
|
*/
|
|
|
|
struct HufVertex* child_r;
|
|
|
|
} HufVertex;
|
2016-10-25 04:51:07 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Arbre binaire de Huffman (pointeur vers un @c HufVertex)
|
|
|
|
*/
|
|
|
|
typedef HufVertex* HufTree;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Construire un arbre de Huffman.
|
2016-10-25 04:51:07 +00:00
|
|
|
*
|
2016-11-30 10:55:10 +00:00
|
|
|
* Lire les effectifs de caractères dans @p counts et en déduire
|
|
|
|
* un arbre binaire de Huffman. Le résultat doit être libéré avec
|
|
|
|
* la fonction @c freeTree.
|
|
|
|
* @param counts Comptes des caractères.
|
|
|
|
* @return Arbre construit.
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
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-11-30 10:55:10 +00:00
|
|
|
* @brief Écrire un arbre dans le tampon d'écriture donné.
|
|
|
|
*
|
|
|
|
* Écrire une représentation binaire de l'arbre @p tree
|
|
|
|
* dans le tampon @p buffer.
|
|
|
|
* @param tree Arbre à représenter.
|
|
|
|
* @param buffer Tampon cible.
|
2016-10-27 16:19:44 +00:00
|
|
|
*/
|
2016-11-30 10:55:10 +00:00
|
|
|
void writeTree(HufTree tree, WriteBuffer* buffer);
|
2016-10-27 16:19:44 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Lire un arbre depuis le tampon de lecture donné.
|
|
|
|
*
|
|
|
|
* Reconstruire un arbre de Huffman à partir du tampon de lecture
|
|
|
|
* @p buffer. Le résultat doit être libéré avec la fonction @c freeTree.
|
|
|
|
* @return L'arbre reconstruit.
|
2016-10-27 16:19:44 +00:00
|
|
|
*/
|
2016-11-30 10:55:10 +00:00
|
|
|
HufTree readTree(ReadBuffer* buffer);
|
2016-10-27 16:19:44 +00:00
|
|
|
|
2016-10-25 04:51:07 +00:00
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Libérer la mémoire occupée par un arbre.
|
|
|
|
* @param tree Arbre à libérer.
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
|
|
|
void freeTree(HufTree tree);
|
|
|
|
|
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Créer la clé de codage à partir d'un arbre de Huffman.
|
|
|
|
*
|
|
|
|
* 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. Le résultat doit être
|
|
|
|
* libéré avec @c freeTreeLabels.
|
2016-10-25 04:51:07 +00:00
|
|
|
*
|
2016-11-30 10:55:10 +00:00
|
|
|
* @param tree Arbre source de la clé de codage.
|
|
|
|
* @return Clé générée.
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
|
|
|
char** createTreeLabels(HufTree tree);
|
|
|
|
|
|
|
|
/**
|
2016-11-30 10:55:10 +00:00
|
|
|
* @brief Libérer la mémoire occupée par une clé de codage.
|
|
|
|
* @param labels Clé à libérer.
|
2016-10-25 04:51:07 +00:00
|
|
|
*/
|
|
|
|
void freeTreeLabels(char** labels);
|
|
|
|
|
2016-11-30 10:55:10 +00:00
|
|
|
#endif // __HUFFMAN_HUFTREE_H_INCLUDED__
|