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');
|
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
|
||||||
|
|
Reference in a new issue