diff --git a/arbre_de_codage/liste.c b/arbre_de_codage/liste.c index 9ac5ff7..71f6a79 100644 --- a/arbre_de_codage/liste.c +++ b/arbre_de_codage/liste.c @@ -19,11 +19,31 @@ Freq ajouter(int nb, int lettre, Freq l){ return tmp; } -int tete(Freq l){ +Freq inserer(int nb, int lettre, Freq l){ + Occ *tmp = l; + if(est_liste_vide(l)){ + return ajouter(nb,lettre,creer_liste_vide()); + } + else{ + Freq new; + while(nb>tete_freq(l)){ + new=ajouter(nb,lettre,queue(tmp)); + } + tmp->suiv=new; + } + return l; +} + +int tete_lettre(Freq l){ assert(!est_liste_vide(l)); return(l->lettre); } +int tete_freq(Freq l){ + assert(!est_liste_vide(l)); + return(l->nb); +} + Freq queue(Freq l){ assert(!est_liste_vide(l)); return(l->suiv); @@ -47,7 +67,7 @@ int rechercher(int lettre,Freq l){ if(est_liste_vide(l)){ return 0; } - else if(lettre==tete(l)){ + else if(lettre==tete_lettre(l)){ return 1; } else{ @@ -60,14 +80,11 @@ Freq incrementer(int lettre, Freq l){ Incrémente de 1, l'occurence de la lettre associée (Attention ! Ici, la liste est parcourue complétement même si on a déjà incrémenté ... Autres solutions ?) */ - if(!est_liste_vide(l)){ + if(est_liste_vide(l)){ return l; } - else if(lettre == tete(l)){ - int occ; - occ=l->nb; - occ++; - l->nb=occ; + else if(lettre == tete_lettre(l)){ + l->nb++; return l; } else{ diff --git a/arbre_de_codage/liste.h b/arbre_de_codage/liste.h index 5def1c0..e47a4d9 100644 --- a/arbre_de_codage/liste.h +++ b/arbre_de_codage/liste.h @@ -11,7 +11,9 @@ typedef struct zoccurence * Freq; Freq creer_liste_vide(); int est_liste_vide(Freq l); Freq ajouter(int nb, int lettre, Freq l); -int tete(Freq l); +Freq inserer(int nb, int lettre, Freq l); +int tete_lettre(Freq l); +int tete_freq(Freq l); Freq queue(Freq l); void liberer_liste(Freq l); Freq liberer_maillon(Freq l); diff --git a/gestion_des_fichiers/test.txt b/gestion_des_fichiers/test.txt index 9d6879f..03b7f0a 100644 --- a/gestion_des_fichiers/test.txt +++ b/gestion_des_fichiers/test.txt @@ -1 +1 @@ -NULLazd \ No newline at end of file +AAABBBCCCCCDDDDDD \ No newline at end of file diff --git a/main_compress.c b/main_compress.c index 536b981..4ad6c58 100644 --- a/main_compress.c +++ b/main_compress.c @@ -2,8 +2,8 @@ #include "arbre_de_codage/arbre_binaire.c" #include "arbre_de_codage/liste.c" -Freq freq_apparition(FILE *file, int *nb_char); -arbre huffman(arbre H, Freq L[]); +Freq freq_apparition(FILE *file); +arbre huffman(arbre H, Freq L); // main_compress.c [nom_du_fichier_a_compresser] @@ -13,7 +13,7 @@ int main(int argc, char **argv){ const char *mode= "rb"; // Vérification de l'existance du second argument (Nom du fichier à compresser) printf("Argc : %d\n",argc); - if(argc == 2){ + if(argc != 2){ printf("\nErreur : Veuillez mettre en argument un nom de fichier à compresser (Ex: %s text.txt)\n",argv[0]); return -1; } @@ -22,19 +22,28 @@ int main(int argc, char **argv){ printf("\nErreur : Fichier %s inexistant\n",filename); return -2; } - printf("test\n"); - int nb_char; - nb_char=0; - int *p; - p=&nb_char; - Freq freq; - freq = freq_apparition(file, p); - printf("hey"); + + // Récupération des fréquences d'apparition des caractères dans le fichier + Freq tmp,freq; + freq = freq_apparition(file); + tmp=freq; + // Affichage pour vérification + while(!est_liste_vide(tmp)){ + printf("%d (%d)\n",tete_lettre(tmp),tete_freq(tmp)); + tmp=queue(tmp); + } + + // freq à ordonner dans l'ordre croissant + printf("Test Huffman\n"); + arbre huff; + huff = huffman(creer_arbre_vide(),freq); + printf("FIN Test Huffman\n"); + return 0; } -Freq freq_apparition(FILE *file, int *nb_char){ +Freq freq_apparition(FILE *file){ Freq text; text = creer_liste_vide(); int c; @@ -45,15 +54,44 @@ Freq freq_apparition(FILE *file, int *nb_char){ else{ text=ajouter(1,c,text); } - *nb_char++; } return text; } -arbre huffman(arbre H, Freq L[]){ +arbre huffman(arbre H, Freq L){ /* Création de l'arbre de codage de Huffman en considérant une liste avec les fréquences d'apparition des caractères ordonnée croissante */ - int i; + if(est_liste_vide(L)){ + printf("Liste vide\n"); + return H; + } + else{ + printf("Liste NON vide\n"); + // récupérer les deux plus petits poids (cf : deux premieres occurences) + arbre A,B,AB; + Freq l; + l=L; + int al,bl,ap,bp; + al = tete_lettre(l); + ap = tete_freq(l); + l = queue(l); + bl = tete_lettre(l); + bp = tete_freq(l); + l = queue(l); + + printf("CREATION ARBRE\n"); + A = creer_arbre_huffman(al,ap,creer_arbre_vide(),creer_arbre_vide()); + B = creer_arbre_huffman(bl,bp,creer_arbre_vide(),creer_arbre_vide()); + AB = creer_arbre_huffman(al*100+bl,ap+bp,A,B); + + l = inserer(ap+bp,al*100+bl,l); + printf("test\n"); + while(!est_liste_vide(l)){ + printf("%d (%d)\n",tete_lettre(l),tete_freq(l)); + l=queue(l); + } + + } return H; } \ No newline at end of file