71Fermer73
geogeoLe 04/03/2004 à 22:37
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. sad rage