diff --git a/arbre.c b/arbre.c index 8981d4b..b420f55 100644 --- a/arbre.c +++ b/arbre.c @@ -29,14 +29,32 @@ void convertisseurListeEnArbre(Liste *liste) { } } -void prefix(Arbre arbre, int codeActuel, int longueur, Lettre *lettresListe, int *i, int longueurTotale) { - if (arbre->lettre != '\0') { - lettresListe[*i].lettre = arbre->lettre; - lettresListe[*i].code = codeActuel; - lettresListe[*i].longueur = longueur; +void assignationCode(Arbre arbre, int codeActuel, int longueur, Lettre *lettresListe, int *i, int *longueurTotale) { + if (arbre->lettre != '\0') { // si c'est une lettre qu'on regarde + lettresListe[*i].lettre = arbre->lettre; // ajout de la lettre + lettresListe[*i].code = codeActuel; // assignation de son code + lettresListe[*i].longueur = longueur; // longueur du code (ex: 1001 est de taille 4) + + *i += 1; // on incrémente de 1 + *longueurTotale += longueur * arbre->frequence; // incrémente la taille du code à la taille totale finale + } else { // si c'est une "mini-racine" + longueur++; + codeActuel <<= 1; // décalage de bit vers la gauche + assignationCode(arbre->gauche, codeActuel, longueur, lettresListe, i, longueurTotale); // appel récursif arbre de gauche + codeActuel |= 1; // copie de bit si nécessaire (porte ou) + assignationCode(arbre->droite, codeActuel, longueur, lettresListe, i, longueurTotale); // appel récursif arbre de droite } } +Lettre * arbreVersListe(Arbre arbre, int taille, int *tailleTotale) { + Lettre *lettres = (Lettre*)malloc(taille * sizeof(Lettre)); // on alloue la la liste qui va contenir nos caractères + int i = 0; // initialisation de `i` au début car `assignationCode` est récursif + assignationCode(arbre, '\0', 0, lettres, &i, tailleTotale); // on commence avec une racine nulle et une taille de 0 + free(arbre); + + return lettres; +} + void compression(FILE *entree, FILE *sortie) { } diff --git a/arbre.h b/arbre.h index a2a1cfb..ab64c40 100644 --- a/arbre.h +++ b/arbre.h @@ -39,4 +39,7 @@ void decompression(FILE *entree, FILE *sortie); */ void assignationCode(Arbre arbre, int codeActuel, int longueur, Lettre *lettresListe, int *i, int *longueurTotale); +// Convertis un arbre (struct Arbre) en Liste (struct Letre) +Lettre * arbreVersListe(Arbre arbre, int taille, int *tailleTotale); + #endif