Double-chaînage de l'arbre
This commit is contained in:
parent
8ce897ce33
commit
1bedf2120e
|
@ -7,6 +7,7 @@
|
|||
#define FALSE 0
|
||||
#define NUM_CHARS 256
|
||||
|
||||
// structure représentant un sommet d'un arbre de Huffman
|
||||
typedef struct Vertex Vertex;
|
||||
struct Vertex {
|
||||
// le double `freq` indique la fréquence d'apparition de la lettre
|
||||
|
@ -17,18 +18,24 @@ struct Vertex {
|
|||
// représente (caractère ASCII 0 - 255)
|
||||
char value;
|
||||
|
||||
// les sommets virtuels sont ceux qui ne correspondent pas à une lettre
|
||||
// du corpus, mais chapeautent les autres sommets
|
||||
int is_virtual;
|
||||
|
||||
// pointe vers le sommet parent à celui-ci, ou NULL s'il n'a pas de parent,
|
||||
// comme par exemple pour la racine et les sommets en cours de traitement
|
||||
Vertex* parent;
|
||||
|
||||
// pointe vers les deux enfants de ce sommet, ou NULL s'il n'a pas
|
||||
// d'enfants, comme par exemple pour les feuilles
|
||||
Vertex *child_l, *child_r;
|
||||
};
|
||||
|
||||
// structure représentant un arbre de Huffman
|
||||
typedef struct Tree Tree;
|
||||
struct Tree {
|
||||
// quantité de sommets dans l'arbre. Le tableau des sommets contient
|
||||
// exactement `size` éléments
|
||||
size_t size;
|
||||
|
||||
// tableau contenant les sommets de l'arbre, liés à leur parent,
|
||||
// excepté pour la racine
|
||||
Vertex* vertices;
|
||||
};
|
||||
|
||||
|
@ -36,8 +43,7 @@ struct Tree {
|
|||
// indexé par la valeur numérique ASCII de chaque caractère
|
||||
double* computeFrequencies(const char* filepath);
|
||||
|
||||
// déduit du tableau de fréquences l'arbre de Huffman, représenté
|
||||
// par une liste de sommets chaînés
|
||||
// déduit d'un tableau de fréquences de caractères un arbre de Huffman
|
||||
Tree buildTree(double* frequencies);
|
||||
|
||||
#endif
|
||||
|
|
11
src/huf.c
11
src/huf.c
|
@ -52,8 +52,10 @@ Tree buildTree(double* frequencies) {
|
|||
if (frequencies[i] > 0) {
|
||||
vertices[next_available].frequency = frequencies[i];
|
||||
vertices[next_available].value = (char) i;
|
||||
vertices[next_available].is_virtual = FALSE;
|
||||
vertices[next_available].parent = NULL;
|
||||
vertices[next_available].child_l = NULL;
|
||||
vertices[next_available].child_r = NULL;
|
||||
|
||||
next_available++;
|
||||
}
|
||||
}
|
||||
|
@ -95,12 +97,13 @@ Tree buildTree(double* frequencies) {
|
|||
}
|
||||
}
|
||||
|
||||
// création d'un sommet parent à ces deux sommets. Ce sommet est
|
||||
// créé à la prochaine position disponible dans le tableau
|
||||
// création d'un sommet virtuel parent de ces deux sommets
|
||||
// ce sommet est créé à la première position libre dans le tableau
|
||||
vertices[next_available].frequency =
|
||||
vertices[min_vert].frequency + vertices[min_vert_sec].frequency;
|
||||
vertices[next_available].is_virtual = TRUE;
|
||||
vertices[next_available].parent = NULL;
|
||||
vertices[next_available].child_l = &vertices[min_vert];
|
||||
vertices[next_available].child_r = &vertices[min_vert_sec];
|
||||
|
||||
// assignation du nouveau parent et des enfants
|
||||
vertices[min_vert].parent = &vertices[next_available];
|
||||
|
|
|
@ -30,12 +30,14 @@ int main(int argc, const char** argv) {
|
|||
Vertex* vertex = &tree.vertices[i];
|
||||
|
||||
printf(
|
||||
"[%p] Sommet %c (%4f, %s) : parent %p\n",
|
||||
"[%8p] Sommet %c (%4f) : parent %8p, enfants %8p %8p\n",
|
||||
(void*) vertex, vertex->value, vertex->frequency,
|
||||
vertex->is_virtual ? "est virtuel" : "non virtuel",
|
||||
(void*) vertex->parent
|
||||
(void*) vertex->parent, (void*) vertex->child_l,
|
||||
(void*) vertex->child_r
|
||||
);
|
||||
}
|
||||
|
||||
printf("\n\n--- 3 : ATTRIBUTION DES CODES ---\n\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue