Aahhhhhhhhh
Après avoir redéveloppé tous les algos pour que ça soit plus facile à gérer et plus rapide j'ai réalisé une nouvelle structure:
//Arbre
typedef struct H_Tree {
H_Tree *FGauche;
H_Tree *FDroite;
H_Tree *ptr;
BOOL noeud;
unsigned char ascii_code;
unsigned long code;
unsigned char bits;
};
//Table ASCII
typedef struct {
H_Tree donnee;
unsigned long freq;
BOOL codifie;
unsigned char ascii_code;
unsigned long code;
unsigned char bits;
} H_ASCII;
Pour réaliser un arbre je procéde de cette façon:
//Création de l'arbre
int HUFF_MakeTree (H_ASCII *Table_ASCII, unsigned short DimAscii, H_Tree **PtrRacine)
{
H_ASCII tmp_table; //Table temporaire
H_Tree *PtrNoeud;
BOOL insert;
unsigned short index;
unsigned short i, j;
//Parcours fréquences ASCII ordre croissant
for (i=DimAscii-1; i>0; i--)
{
//Allocation pour noeud
PtrNoeud=(H_Tree *)malloc (sizeof (H_Tree));
PtrNoeud->FGauche=(H_Tree *)malloc (sizeof (H_Tree));
PtrNoeud->FDroite=(H_Tree *)malloc (sizeof (H_Tree));
//Erreur out of memory
if (PtrNoeud==NULL) return 0;
//Partie droite (plus petite fréquence)
memcpy (PtrNoeud->FDroite, &Table_ASCII [i].donnee, sizeof (H_Tree));
//Partie gauche (plus grande fréquence)
memcpy (PtrNoeud->FGauche, &Table_ASCII [i-1].donnee, sizeof (H_Tree));
//Cumul des données
//Ajoute les fréquences
tmp_table.freq=Table_ASCII [i].freq+Table_ASCII [i-1].freq;
tmp_table.donnee.noeud=true;
tmp_table.donnee.ptr=PtrNoeud;
//Reclassement du noeud dans la table
for (j=i, insert=false; (j>0) && (!(insert)); j--)
//Redéfinition de la table ASCII (enleve item)
if (Table_ASCII [j-1].freq < tmp_table.freq)
*(Table_ASCII+j)=*(Table_ASCII+j-1);
else {
insert=true;
index=j;}
if (!insert) index=0;
//Combine ASCII
*(Table_ASCII+index)=tmp_table;
}
//Création du pointeur vers la racine de l'arbre
*PtrRacine=PtrNoeud;
//Pas d'erreur
return -1;
}
Et donc enfin pour effacer un arbre je réalise cette fonction, théoriquement elle doit fonctionner? Si c'est pas le cas pourquoi ça plante?
//Suppression d'un arbre de huffman.
H_Tree *HUFF2_DeleteTree (H_Tree *arbre)
{
if (arbre->noeud && arbre)
{
if (arbre->FGauche && (arbre->FGauche->noeud)) arbre->FGauche=HUFF_DeleteTree (arbre->FGauche);
if (arbre->FDroite && (arbre->FDroite->noeud)) arbre->FDroite=HUFF_DeleteTree (arbre->FDroite);
free (arbre);
}
return NULL;
}
Après des recherches et des recherches je ne trouve pas de solutions, quand je pense que j'ai tout redéveloppé pour ça.