J'ai un comme sujet de faire la compréssion et décompression d'huffman.
J'ai avancé le sujet mais je suis bloquer dans ma fonction de création de l'arbre. Si quelqu'un pouvais m'aider sa serais cool!
Des pistes pour la suite et la décompréssion seraient les bien venuent elles aussi!
Je galère vraiment pour une petite érreur je pense.
Merci par avance voila mon code :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node_
{
int bin;
char elt;
struct node_ *left;
struct node_ *right;
}node;
typedef node* tree;
typedef struct stat_
{
int nbr;
tree t;
}stat;
/*typedef struct cell_
{
int elt;
struct cel_ *next;
}cell;
typedef cell* list;
*/
// allocation
void AllocateStat(stat *i)
{
i=(stat*)malloc(sizeof(stat)*256);
}
node* AllocateNode(char elt)
{
node* n;
n=(node*)malloc(sizeof(node));
n->elt=elt;
n->left=NULL;
n->right=NULL;
return (n);
}
void AllocateNode1(tree t)
{
t=(node*)malloc(sizeof(node));
t->left=NULL;
t->right=NULL;
}
//ETAPE 1 & 2
//initialisation, argument et comptage (occurence).
void comptage(char *filename,stat *T)
{
int i;
char bufferLine[1024];
char *s;
int gh;
//initialisation
memset(bufferLine, 0,sizeof(bufferLine));
for(i=0;i<=255;i++)
{
T[i].nbr=0;
}
//fin initialisation
FILE *file;
file=fopen(filename,"r");
AllocateStat(T);
while(fgets(bufferLine,1024,file))
{
s=bufferLine;
gh=strlen(s);
for(i=0;i<=gh;i++)
{
T[(int)bufferLine[i]].nbr++;//voiir si les caractere sont bien entré.
T[(int)bufferLine[i]].t=AllocateNode(bufferLine[i]);
}
}
}
//ETAPE 3
//tri de mon tableau de stats
int compare(const void *a,const void *b){
stat *j=(stat*) a ;
stat *k=(stat*) b ;
return((k->nbr)-(j->nbr));
}
void Tri(stat *T)
{
qsort(T,256,sizeof(stat),compare);
}
//ETAPE 4
//éllaboration de l'arbre d'huffman
tree AlgoHuff(stat *T, tree Huff)
{
int i=0;
int tmp=0;
int tmp2=0;
while(T[1].nbr!=0)
{
for(i=0;i<=255;i++)
{
if (T[i].nbr!=0)tmp++;
}
AllocateNode1(Huff);
Huff->right=T[tmp].t;
Huff->left=T[tmp-1].t;
tmp2=T[tmp].nbr+T[tmp-1].nbr;
T[tmp-1].nbr=tmp2;
T[tmp].nbr=0;
T[tmp-1].t=Huff;
Tri(T);
}
return (Huff);
}
//ETAPE 5
//édition du tableau de code (les 0 et les 1, le dictionnaire)
//ETAPE6
//entête du fichier compressé
//ETAPE7
//compréssion
int main(int argc,char **argv)
{
stat T[256];
int i;
tree Huff=NULL;
printf("nombre d argument : %d\n",argc);
argv[0]="./huffman";
argv[1]="data.txt";
argv[2]="data.z";
if (argc==1)
{
printf("\n Ceci est un programme de compression\n Pour compresser un fichier taper : ./myCompress <nom du fichier sources> <nom du fichier de destination>\n Bonne compression!!!!\n");
}
comptage(argv[1],T);
Tri(T);
for(i=0;i<=255;i++)
{ printf("%d ",T[i].nbr);}
AlgoHuff(T,Huff);
return (0);
}