Arbre Binaire. Probleme de concatenation

YnOThAr Messages postés 22 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 9 juillet 2006 - 3 juin 2006 à 18:55
Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007 - 3 juin 2006 à 20:20
Bonjour tout le monde !

La fin de l'année arrive et avec elle vient la fin des
projets...généralement inachevés. En ce moment je travail sur la
compression d'huffman et donc les arbres binaires. Disons que j'ai un
petit probleme tout con que je n'arrive pas a résoudre. Je ne pense pas
que le probleme vienne de ma fonction et dans ce cas je voudrais savoir
pourquoi windows réagit stupidement.


Bon un arbre grosso modo c'est ca :


Bon, si on dit par exemple qu'a un noeud, la branche qui part vers la
gauche portera le numéro 1 et celle vers la droite le numéro 0 et qu'a
chaque étage on concatène le nom ca donne un truc du genre :

e = "0"

a = "11"

i = "101"

o = "100"


Et mon probleme vient de la fonction qui, une fois l'arbre créer passe dedans pour associé un code de 0 et de 1 a chaque lettre.

Voici la fonction :


char * ajouter_lettre(char * str,char car)

{

     char * str_temp;

     str_temp = malloc((1+strlen(str))*sizeof(char));

     int i;

     for(i=0;i<strlen(str);i++)

             *(str_temp+i) = *(str+i);

     *(str_temp+strlen(str)) = car;

     //printf("%s",str_temp);

     return str_temp;

}


void creer_tab(arbre temp_tree,char * tab[256],char * str_temp)

{

     if(temp_tree -> lettre == -1) {

            
creer_tab((*temp_tree).g,tab,ajouter_lettre(str_temp,'0'));

            
creer_tab((*temp_tree).d,tab,ajouter_lettre(str_temp,'1'));

     }

     else

     {

            
//Etant donné que ca marche pas, j'affiche le résultat pour voir les
dégats...

            
//tab[temp_tree -> lettre] = malloc(strlen(str_temp)*sizeof(char));

             //tab[temp_tree -> lettre] = str_temp;

            
printf("%c : %s\n",(char)(temp_tree -> lettre),str_temp);

     }

}


et le typage des arbres :


typedef struct noeud {

        int lettre; //lettre associe au noeud

        int f; //frequence d'apparition de la lettre

        struct noeud * g; //le fils de gauche

        struct noeud * d; //le fils de droite

} noeud, * arbre;


Et donc voici ce que m'affiche ma fonction creer_tab :


On obtient bien une séie de 1 et de 0 pour chaque lettre, mais y'a des
caractères qui se sont invités et moi j'aime pas trop mdr ^^

QQun saurait pourquoi cela fait ca ?

1 réponse

Bel0 Messages postés 71 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 14 septembre 2007
3 juin 2006 à 20:20
Petit rappel de base: toutes les chaines de caractères doivent se termine par '\0' en C. C'est une convention obligatoire, sinon à peu près toutes les fonctions des api sont foireuses si cette condition n'est pas remplie.

Mon conseil serait donc que tu alloues un caractère de plus à chaque fois pour stocker le '\0' final.

Belo
0
Rejoignez-nous