Yûki - Compress

This commit is contained in:
name 2019-12-14 14:39:37 +01:00
parent 71980e4541
commit 1c30cadbd1
No known key found for this signature in database
GPG key ID: 03E8F3CF3183323A
3 changed files with 80 additions and 89 deletions

View file

@ -8,7 +8,7 @@ arbre creer_arbre_vide (void)
return NULL ; return NULL ;
} }
arbre creer_arbre_huffman(Elt e, int p, arbre fg, arbre fd) arbre creer_arbre_huffman(int e, int p, arbre fg, arbre fd)
{ {
noeud * tmp = malloc(sizeof(noeud)); noeud * tmp = malloc(sizeof(noeud));
tmp->elt=e; tmp->elt=e;
@ -30,7 +30,7 @@ arbre fils_droit(arbre b)
return b->fils_droit; return b->fils_droit;
} }
Elt racine(arbre a) int racine(arbre a)
{ {
assert(!est_arbre_vide(a)); assert(!est_arbre_vide(a));
return a->elt; return a->elt;
@ -41,7 +41,7 @@ bool est_arbre_vide(arbre a)
return (a == NULL) ; return (a == NULL) ;
} }
arbre creer_feuille(Elt e, int p) arbre creer_feuille(int e, int p)
{ {
return creer_arbre_huffman(e, p, creer_arbre_vide(), creer_arbre_vide()) ; return creer_arbre_huffman(e, p, creer_arbre_vide(), creer_arbre_vide()) ;
} }

View file

@ -1,10 +1,9 @@
#ifndef __ARBRE_BINAIRE__ #ifndef __ARBRE_BINAIRE__
#define __ARBRE_BINAIRE__ #define __ARBRE_BINAIRE__
typedef int Elt;
typedef int bool; typedef int bool;
struct znoeud { struct znoeud {
Elt elt ; int elt ;
int poids; int poids;
struct znoeud *fils_gauche; struct znoeud *fils_gauche;
struct znoeud *fils_droit; struct znoeud *fils_droit;
@ -13,13 +12,13 @@ typedef struct znoeud noeud ;
typedef struct znoeud * arbre; typedef struct znoeud * arbre;
arbre creer_arbre_vide(void); arbre creer_arbre_vide(void);
arbre creer_arbre_huffman(Elt e, int p, arbre fg, arbre fd); arbre creer_arbre_huffman(int e, int p, arbre fg, arbre fd);
arbre fils_gauche(arbre a); arbre fils_gauche(arbre a);
arbre fils_droit(arbre a); arbre fils_droit(arbre a);
Elt racine(arbre a); int racine(arbre a);
bool est_arbre_vide(arbre a); bool est_arbre_vide(arbre a);
arbre creer_feuille(Elt e, int p) ; arbre creer_feuille(int e, int p) ;
bool est_feuille(arbre a) ; bool est_feuille(arbre a) ;
char *arbre_rechercher(arbre a, char c, char*s); char *arbre_rechercher(arbre a, char c, char*s);
#endif #endif

View file

@ -2,11 +2,11 @@
#include "arbre_de_codage/arbre_binaire.c" #include "arbre_de_codage/arbre_binaire.c"
#define ASCII_EXT 256 #define ASCII_EXT 256
arbre huffman(arbre H, int Tp[], int Tl[]); arbre huffman(arbre T);
void frequence(int Tp[], int Tl[], FILE *file); void frequence(arbre T, FILE *file);
void tri_tab(int T[],int T2[],int n); void tri_tab(arbre T,int n);
void afficher_tab(int Tp[], int Tl[], int n); void afficher_tab(arbre T, int n);
void init_tab(int T[], int Elt, int n); void init_tab(arbre T, int Elt, int n);
// main_compress.c [nom_du_fichier_a_compresser] // main_compress.c [nom_du_fichier_a_compresser]
int main(int argc, char **argv){ int main(int argc, char **argv){
@ -19,118 +19,110 @@ int main(int argc, char **argv){
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;
} }
// Vérification de l'ouverture du fichier en mode lecture binaire !! FONCTION A MODIFIER // Vérification de l'o(uverture du fichier en mode lecture binaire !! FONCTION A MODIFIER
else if(!(file=fopen(filename,mode))){ else if(!(file=fopen(filename,mode))){
printf("\nErreur : Fichier %s inexistant\n",filename); printf("\nErreur : Fichier %s inexistant\n",filename);
return -2; return -2;
} }
// Récupérer fréquence printf("Tableau : \n");
int Tp[ASCII_EXT],Tl[ASCII_EXT]; arbre N = malloc(ASCII_EXT*sizeof(noeud)); // Initialisation de l'arbre
init_tab(Tp,-1,ASCII_EXT); printf("Tableau initialisé -1: \n");
init_tab(Tl,-1,ASCII_EXT); init_tab(N,-1,ASCII_EXT); // On initialise l'arbre avec des poids de -1
int compteur; printf("Tableau get freq : \n");
compteur=0; frequence(N,file); // On récupère la fréquence d'apparition des lettres du fichiers
frequence(Tp,Tl,file); printf("Tableau tri : \n");
// Tri tri_tab(N,ASCII_EXT); // On fait un tri à bulle sur ce tableau
tri_tab(Tp,Tl,ASCII_EXT); printf("Tableau affichage : \n");
afficher_tab(Tp,Tl,ASCII_EXT); afficher_tab(N,ASCII_EXT);
arbre huff; arbre huff;
huff = huffman(creer_arbre_vide(),Tp,Tl); printf("Huffman : \n");
//huff = huffman(T);
printf("Arbre :\n");
return 0; return 0;
} }
void init_tab(int T[], int Elt, int n){ void init_tab(arbre T[], int Elt, int n){
int i; int i;
for(i=0;i<n;i++){ for(i=0;i<n;i++){
T[i]=Elt; T[i]=creer_feuille(Elt,Elt);
} }
} }
void frequence(int Tp[], int Tl[], FILE *file){ void frequence(arbre T, FILE *file){
int c; int c;
while((c=fgetc(file))!=EOF){ while((c=fgetc(file))!=EOF){
if(Tl[c]!=-1){ if(T[c].poids!=-1){
Tp[c]++; T[c].poids++;
} }
else{ else{
Tl[c]=c; T[c].elt=c;
Tp[c]=1; T[c].poids=1;
} }
} }
} }
void tri_tab(int T[],int T2[],int n){ void tri_tab(arbre T,int n){
int i,j,tmp,tmp2; int i,j;
noeud tmp;
for(i=0;i<n-1;i++){ for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){ for(j=i+1;j<n;j++){
if(T[i]>T[j]){ if(T[i].poids>T[j].poids){
tmp=T[i]; tmp=T[i];
tmp2=T2[i];
T[i]=T[j]; T[i]=T[j];
T2[i]=T2[j];
T[j]=tmp; T[j]=tmp;
T2[j]=tmp2;
} }
} }
} }
} }
void afficher_tab(int Tp[], int Tl[], int n){ int compteur_tab(arbre T, int n){
printf("\n"); int i,compteur;
int i;
for (i=0;i<n;i++){
printf("T[%d] = %d (%d)\n",i,Tp[i],Tl[i]);
}
}
int compteur_tab(int T[],int n){
int compteur,i;
compteur=0; compteur=0;
for(i=0;i<n;i++){ for(i=0;i<n;i++){
if(T[i]!=-1){ if(T[i].poids != -1){
compteur++; compteur++;
} }
} }
return compteur; return compteur;
} }
int i_index_min_tab(int T[],int i,int n){ void afficher_tab(arbre T, int n){
int index_min; printf("\n");
index_min=0; int i;
int k; for (i=0;i<n;i++){
for(k=1;k<n;k++){ printf("T[%d] = %d (%d)\n",i,T[i].poids,T[i].elt);
if(T[k]<T[index_min]){
index_min=k;
i--;
} }
if(i==0){
return index_min;
}
}
return index_min;
} }
arbre huffman(arbre H, int Tp[], int Tl[]){ arbre huffman(arbre T){
/* // 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
*/
// récupérer les deux plus petits poids (cf : deux premieres occurences) // récupérer les deux plus petits poids (cf : deux premieres occurences)
int i,compteur; arbre H = malloc(sizeof(arbre));
H=creer_arbre_vide();
while(compteur_tab(T,ASCII_EXT)>1){
// Récupération des plus faibles poids
int i;
i=0; i=0;
compteur=compteur_tab(Tl,ASCII_EXT); while(T[i].poids!=-1){
while(compteur != 1){ i++;
printf("\n Test n°%d \n",i++); }
int l1,l2,p1,p2; arbre tmp;k
l1=Tl[i_index_min_tab(Tl,1,ASCII_EXT)]; tmp1=creer_arbre_vide();
p1=Tp[i_index_min_tab(Tl,1,ASCII_EXT)]; tmp2=creer_arbre_vide();
l2=Tl[i_index_min_tab(Tl,2,ASCII_EXT)]; tmp3=creer_arbre_vide();
p2=Tp[i_index_min_tab(Tl,2,ASCII_EXT)]; int newpoids;
arbre fg,fd; newpoids=T[i].poids+T[i+1].poids;
fg=creer_feuille(l1,p1); tmp->fils_gauche=creer_feuille(T[i].elt,T[i].poids);
fd=creer_feuille(l2,p2); tmp->fils_droit=creer_feuille(T[i+1].elt,T[i+1].poids);
H=creer_arbre_huffman(0,p1+p2,fg,fd); tmp->poids=newpoids;
// ajouter le nouveau poid
compteur--; T[i].poids=-1;
T[i].elt=-1;
T[i+1].poids=newpoids;
T[i+1].elt=-1;
tri_tab(T,ASCII_EXT);
H=
} }
return H;
} }