Add the correct letter to the binary huffman tree
This commit is contained in:
parent
5c432ee7b7
commit
2d8dfccb33
1 changed files with 19 additions and 1 deletions
20
arbre.c
20
arbre.c
|
@ -170,10 +170,28 @@ Arbre lectureDonnees(FILE *fichier, int *tailleTotale) {
|
|||
|
||||
Arbre arbre = allouerCellule('\0');
|
||||
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].code), 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
|
||||
|
|
Reference in a new issue