Yûki - Compress
This commit is contained in:
parent
71980e4541
commit
1c30cadbd1
3 changed files with 80 additions and 89 deletions
|
|
@ -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()) ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
140
main_compress.c
140
main_compress.c
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Reference in a new issue