Ajout de la fonction pour sérialiser les arbres
This commit is contained in:
parent
24f66c415e
commit
948f73027b
|
@ -1,6 +1,7 @@
|
||||||
#ifndef __IN303_HUFTREE_H__
|
#ifndef __IN303_HUFTREE_H__
|
||||||
#define __IN303_HUFTREE_H__
|
#define __IN303_HUFTREE_H__
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,6 +46,18 @@ struct HufTree {
|
||||||
*/
|
*/
|
||||||
HufTree createTree(double* frequencies);
|
HufTree createTree(double* frequencies);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Écrit une représentation binaire de l'arbre dans le fichier
|
||||||
|
* passé en paramètre
|
||||||
|
*/
|
||||||
|
void writeTree(HufTree, FILE*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconstruit un arbre de Huffman à partir du fichier passé
|
||||||
|
* en paramètre
|
||||||
|
*/
|
||||||
|
HufTree readTree(FILE*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Libérer la mémoire occupée par un arbre de Huffman
|
* Libérer la mémoire occupée par un arbre de Huffman
|
||||||
* généré par la fonction `createTree`
|
* généré par la fonction `createTree`
|
||||||
|
|
|
@ -12,7 +12,7 @@ Buffer createBuffer(FILE* file) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void flushBuffer(Buffer* buffer) {
|
void flushBuffer(Buffer* buffer) {
|
||||||
// TODO: gérer les erreurs d'écriture
|
// FIXME: gérer les erreurs d'écriture
|
||||||
|
|
||||||
// Alignement des données à gauche de l'octet
|
// Alignement des données à gauche de l'octet
|
||||||
buffer->data <<= 8 - buffer->used_bits;
|
buffer->data <<= 8 - buffer->used_bits;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "huftree.h"
|
#include "huftree.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "buffer.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -10,6 +11,12 @@
|
||||||
*/
|
*/
|
||||||
static void _findMinimalVertices(HufVertex**, size_t, size_t* min, size_t* sec);
|
static void _findMinimalVertices(HufVertex**, size_t, size_t* min, size_t* sec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Écrit dans le tampon donné les informations sur le sommet
|
||||||
|
* en question et tous ses fils
|
||||||
|
*/
|
||||||
|
static void _writeVertex(HufVertex, Buffer*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Libérer récursivement la mémoire occupée par le sommet
|
* Libérer récursivement la mémoire occupée par le sommet
|
||||||
* donné ainsi que celle de tous ses enfants (s'il en a).
|
* donné ainsi que celle de tous ses enfants (s'il en a).
|
||||||
|
@ -139,6 +146,56 @@ void _findMinimalVertices(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void writeTree(HufTree tree, FILE* output) {
|
||||||
|
Buffer buffer = createBuffer(output);
|
||||||
|
_writeVertex(*tree.root, &buffer);
|
||||||
|
flushBuffer(&buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _writeVertex(HufVertex vertex, Buffer* buffer) {
|
||||||
|
if (vertex.child_l != NULL && vertex.child_r != NULL) {
|
||||||
|
// Séquence de 9 bits indiquant un sommet qui
|
||||||
|
// n'est pas une feuille (100000000)
|
||||||
|
pushToBuffer(1, buffer);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
pushToBuffer(0, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Écriture du fils gauche et du fils droit
|
||||||
|
_writeVertex(*vertex.child_l, buffer);
|
||||||
|
_writeVertex(*vertex.child_r, buffer);
|
||||||
|
} else {
|
||||||
|
// Séquence de 9 bits encodant la feuille rencontrée
|
||||||
|
// (0 + octet du caractère)
|
||||||
|
pushToBuffer(0, buffer);
|
||||||
|
|
||||||
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
pushToBuffer(
|
||||||
|
// Écriture du n-ième bit du caractère du fils
|
||||||
|
// dans le tampon
|
||||||
|
(vertex.character & (1 << i)) != 0,
|
||||||
|
buffer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Séquence de 9 bits indiquant un sommet
|
||||||
|
// sans fils (100000001)
|
||||||
|
pushToBuffer(1, buffer);
|
||||||
|
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
pushToBuffer(0, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
pushToBuffer(1, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HufTree readTree(FILE* output) {
|
||||||
|
// TODO: implémenter la lecture des arbres
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
void freeTree(HufTree tree) {
|
void freeTree(HufTree tree) {
|
||||||
_freeTreeVertex(tree.root);
|
_freeTreeVertex(tree.root);
|
||||||
tree.root = NULL;
|
tree.root = NULL;
|
||||||
|
|
Loading…
Reference in New Issue