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__
|
||||
#define __IN303_HUFTREE_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
|
@ -45,6 +46,18 @@ struct HufTree {
|
|||
*/
|
||||
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
|
||||
* généré par la fonction `createTree`
|
||||
|
|
|
@ -12,7 +12,7 @@ Buffer createBuffer(FILE* file) {
|
|||
}
|
||||
|
||||
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
|
||||
buffer->data <<= 8 - buffer->used_bits;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "huftree.h"
|
||||
#include "common.h"
|
||||
#include "buffer.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -10,6 +11,12 @@
|
|||
*/
|
||||
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
|
||||
* 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) {
|
||||
_freeTreeVertex(tree.root);
|
||||
tree.root = NULL;
|
||||
|
|
Loading…
Reference in New Issue