Add the correct letter to the binary huffman tree

This commit is contained in:
Mylloon 2021-12-26 16:05:24 +01:00
parent 5c432ee7b7
commit 2d8dfccb33
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

20
arbre.c
View file

@ -170,10 +170,28 @@ Arbre lectureDonnees(FILE *fichier, int *tailleTotale) {
Arbre arbre = allouerCellule('\0'); Arbre arbre = allouerCellule('\0');
for (int i = 0; i < nombreLettresDansFichier; i++) { for (int i = 0; i < nombreLettresDansFichier; i++) {
// Lecture de l'entête
lecture += fread(&(entete[i].lettre), sizeof(char), 1, fichier); lecture += fread(&(entete[i].lettre), sizeof(char), 1, fichier);
lecture += fread(&(entete[i].code), sizeof(int), 1, fichier); lecture += fread(&(entete[i].code), sizeof(int), 1, fichier);
lecture += fread(&(entete[i].longueur), sizeof(int), 1, fichier); lecture += fread(&(entete[i].longueur), sizeof(int), 1, fichier);
// ajouter la lettre à l'arbre ici
// Ajout de la lettre à l'arbre
Cellule *curseur = arbre;
int gaucheOuDroite, mask = 1; // mask est le masque de bit appliqué pour savoir si on doit aller a la gauche ou a la droite de l'arbre
mask <<= entete[i].longueur - 1; // décalage vers la gauche de la longueur de la lettre - 1
for (int j = 0; j < entete[i].longueur; j++) {
gaucheOuDroite = entete[i].code & mask;
entete[i].code <<= 1; // décalage de 1 vers la gauche pour éviter la segfault
if (!gaucheOuDroite) { // gauche
if (curseur->gauche == NULL) curseur->gauche = allouerCellule('\0'); // on remplace NULL par le caractère correspondant
curseur = curseur->gauche;
} else { // droite
if (curseur->droite == NULL) curseur->droite = allouerCellule('\0'); // on remplace NULL par le caractère correspondant
curseur = curseur->droite;
}
}
curseur->lettre = entete->lettre; // on assigne la bonne lettre correspondante
} }
free(entete); // on libère l'entête car on en a plus besoin free(entete); // on libère l'entête car on en a plus besoin