Yûki - Chain List

This commit is contained in:
name 2019-12-12 13:36:12 +01:00
parent a4700a9e3c
commit 04ffeb3403
No known key found for this signature in database
GPG key ID: 03E8F3CF3183323A
4 changed files with 82 additions and 25 deletions

View file

@ -19,11 +19,31 @@ Freq ajouter(int nb, int lettre, Freq l){
return tmp; 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)); assert(!est_liste_vide(l));
return(l->lettre); return(l->lettre);
} }
int tete_freq(Freq l){
assert(!est_liste_vide(l));
return(l->nb);
}
Freq queue(Freq l){ Freq queue(Freq l){
assert(!est_liste_vide(l)); assert(!est_liste_vide(l));
return(l->suiv); return(l->suiv);
@ -47,7 +67,7 @@ int rechercher(int lettre,Freq l){
if(est_liste_vide(l)){ if(est_liste_vide(l)){
return 0; return 0;
} }
else if(lettre==tete(l)){ else if(lettre==tete_lettre(l)){
return 1; return 1;
} }
else{ else{
@ -60,14 +80,11 @@ Freq incrementer(int lettre, Freq l){
Incrémente de 1, l'occurence de la lettre associée 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 ?) (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; return l;
} }
else if(lettre == tete(l)){ else if(lettre == tete_lettre(l)){
int occ; l->nb++;
occ=l->nb;
occ++;
l->nb=occ;
return l; return l;
} }
else{ else{

View file

@ -11,7 +11,9 @@ typedef struct zoccurence * Freq;
Freq creer_liste_vide(); Freq creer_liste_vide();
int est_liste_vide(Freq l); int est_liste_vide(Freq l);
Freq ajouter(int nb, int lettre, 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); Freq queue(Freq l);
void liberer_liste(Freq l); void liberer_liste(Freq l);
Freq liberer_maillon(Freq l); Freq liberer_maillon(Freq l);

View file

@ -1 +1 @@
NULLazd AAABBBCCCCCDDDDDD

View file

@ -2,8 +2,8 @@
#include "arbre_de_codage/arbre_binaire.c" #include "arbre_de_codage/arbre_binaire.c"
#include "arbre_de_codage/liste.c" #include "arbre_de_codage/liste.c"
Freq freq_apparition(FILE *file, int *nb_char); Freq freq_apparition(FILE *file);
arbre huffman(arbre H, Freq L[]); arbre huffman(arbre H, Freq L);
// main_compress.c [nom_du_fichier_a_compresser] // main_compress.c [nom_du_fichier_a_compresser]
@ -13,7 +13,7 @@ int main(int argc, char **argv){
const char *mode= "rb"; const char *mode= "rb";
// Vérification de l'existance du second argument (Nom du fichier à compresser) // Vérification de l'existance du second argument (Nom du fichier à compresser)
printf("Argc : %d\n",argc); 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]); printf("\nErreur : Veuillez mettre en argument un nom de fichier à compresser (Ex: %s text.txt)\n",argv[0]);
return -1; return -1;
} }
@ -22,19 +22,28 @@ int main(int argc, char **argv){
printf("\nErreur : Fichier %s inexistant\n",filename); printf("\nErreur : Fichier %s inexistant\n",filename);
return -2; return -2;
} }
printf("test\n");
int nb_char; // Récupération des fréquences d'apparition des caractères dans le fichier
nb_char=0; Freq tmp,freq;
int *p; freq = freq_apparition(file);
p=&nb_char; tmp=freq;
Freq freq; // Affichage pour vérification
freq = freq_apparition(file, p); while(!est_liste_vide(tmp)){
printf("hey"); 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; return 0;
} }
Freq freq_apparition(FILE *file, int *nb_char){ Freq freq_apparition(FILE *file){
Freq text; Freq text;
text = creer_liste_vide(); text = creer_liste_vide();
int c; int c;
@ -45,15 +54,44 @@ Freq freq_apparition(FILE *file, int *nb_char){
else{ else{
text=ajouter(1,c,text); text=ajouter(1,c,text);
} }
*nb_char++;
} }
return text; 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 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; return H;
} }