add conversion tree to list

This commit is contained in:
Mylloon 2021-12-24 00:15:30 +01:00
parent 0d909dce64
commit 24ed3c5aea
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
2 changed files with 26 additions and 5 deletions

28
arbre.c
View file

@ -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) {
}

View file

@ -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