diff --git a/include/huf.h b/include/huf.h index 0d596de..64282d3 100644 --- a/include/huf.h +++ b/include/huf.h @@ -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 diff --git a/src/huf.c b/src/huf.c index 4296dff..b89d725 100644 --- a/src/huf.c +++ b/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]; diff --git a/src/main.c b/src/main.c index 08f92e9..2ca624c 100644 --- a/src/main.c +++ b/src/main.c @@ -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; }