Constrution d'un arbre

eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009 - 8 mai 2009 à 09:33
eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009 - 14 mai 2009 à 09:38
bonjour,
 j'esseye de construire un arbre pour la compression jpeg d'une image, et j'utilise le methode de huffman.
g utilisé une liste qui contiendra les noeuds de l'arbre.
au debut je crée ma liste par la suite je teste le premier element avec les 2 suivants val1 et val2, le probleme est que des que je lis les valeur de la liste l'execution ce ferme.
voila mon programme:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
int main()
{typedef struct elt {int valeur;
                     struct elt *fg;
                     struct elt *fd;
                     struct elt *suivt;}liste;
liste *p;liste *tete,*z,*q,*sauv,*tri,*o,*var,*g,*save;
int val1,val2,h,i,n;
bool b;
b=true;
////////**********creation de la liste*************////////////
tete=(liste*)malloc(sizeof(liste*));
printf("entrer n:",n);
scanf("%d",&n);
printf("entrer h:");
scanf("%d",&h);
tete->valeur=h;
o=tete;
i=1;
while (i<n)
 {p=(liste*)malloc(sizeof(liste*));
  printf("entrer h:",h);
  scanf("%d",&h);
  p->valeur=h;
  o->suivt=p;
  o=p;
  i++;}
p->suivt=NULL;
///////******affichage de la liste*******/////////
g=tete;
while (g!=NULL)
  {printf("%d",g->valeur);
   g=g->suivt;}
///////////////**********construction de l'arbre**********//////////
while (tete->suivt!=NULL)
  {p=tete;
   //while (p->suivt!=NULL)
     val1=p->valeur;
    
      p=p->suivt;
      save=p;
      val2=p->valeur;
      sauv=p->suivt;
      p=(liste*)malloc(sizeof(liste*));
      p->valeur=val1+val2;
      printf("%d",p->valeur);
      p->fg=tete;
      p->fd=save;
      p->suivt=sauv;
      tete=p;
      z=tete->suivt;
      if (q!=NULL)
       {val1=z->valeur;}
      q=z->suivt;
      if (q!=NULL)
         {val2=q->valeur;}
      /*g=tete;
      while (g!=NULL)
        {printf("%d",g->valeur);
         g=g->suivt;}*/
      p=tete;
      while ((q!=NULL)&&(z!=NULL)&&(val1<=p->valeur)&&(val2<=p->valeur))
         {sauv=p;
          p=(liste*)malloc(sizeof(liste*));
          p->valeur=val1+val2;
          p->fg=z;
          p->fd=q;
          sauv->suivt=p;
          p->suivt=q->suivt;
          z=p->suivt;
          q=z->suivt;
          val1=z->valeur;
          val2=q->valeur;
          /*g=tete;
         while (g!=NULL)
          {printf("%d",g->valeur);
           g=g->suivt;}*/
         }
     if ((q!=NULL)&&(z!=NULL)&&(val1>p->valeur)&&(val2>p->valeur))  
       {p=tete;}
     else
        if ((q!=NULL)&&(z!=NULL)&&(val1<=p->valeur)&&(val2>p->valeur)) 
          {p=tete;
           while (b==true)
             {b=false;
              tri=p->suivt;
              while(p!=NULL)
               {if(p->valeur>tri->valeur)
                  {if (p==tete)
                   {var= tri->suivt;
                    tri->suivt=p;
                    p->suivt=var;
                    tete=tri;
                    tri=p->suivt;
                   }
                  else
                     if (tri->suivt!=NULL)
                        {var=tri->suivt;
                         tri->suivt=p;
                         p->suivt=var;
                         tri=p->suivt;
                        }
                     else
                        {tri->suivt=p;
                         p->suivt=NULL;
                        }
                  b=true;
                 }
               else
                 {p=p->suivt;
                  tri=p->suivt;
                  }
              }  
              p=tete; 
              }
              /*g=tete;
           while (g!=NULL)
            {printf("%d",g->valeur);
             g=g->suivt;}*/
              }
        else
            if ((q==NULL)&&(z!=NULL))
                {if (p->valeur>z->valeur)
                    {p=tete;
                     while (b==true)
                     {b=false;
                      tri=p->suivt;
                      while(p!=NULL)
                     {if(p->valeur>tri->valeur)
                       {if (p==tete)
                         {var= tri->suivt;
                          tri->suivt=p;
                          p->suivt=var;
                          tete=tri;
                          tri=p->suivt;
                       }
                       else
                        if (tri->suivt!=NULL)
                          {var=tri->suivt;
                           tri->suivt=p;
                           p->suivt=var;
                           tri=p->suivt;
                          }
                       else
                         {tri->suivt=p;
                          p->suivt=NULL;
                         }
                    b=true;
                   }
               else
                  {p=p->suivt;
                  tri=p->suivt;
                  }
              } 
              p=tete;
              }
              /*g=tete;
          while (g!=NULL)
          {printf("%d",g->valeur);
           g=g->suivt;}*/
              }
              }
            p=tete;
           }
getche();
}              
est ce que quelqun peu m'aidez, merci d'avance.

4 réponses

Thaumasnot Messages postés 7 Date d'inscription vendredi 1 mai 2009 Statut Membre Dernière intervention 8 mai 2009
8 mai 2009 à 15:03
oui, est ce que quelqun peu l'aider s'il vous plait, excuse moi
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
8 mai 2009 à 17:03
Salut,

Premiere erreur :  <strike>p=(liste*)malloc(sizeof(liste*));</strike>  p=(liste*)malloc(sizeof(liste));

Bonne continuation.

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
0
eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009
12 mai 2009 à 17:13
mercii pour ta reponse, je n'ai plus le probleme que j'avais.
la  je voudré faire un parcourt prefixe de l'arbre, donc j'ai ecrit une procedure prefixe :
 
void prefixe(liste *r)
 {if (!vide(r))
     {printf("%d",r->valeur);
      if (!feuille(r))
        {prefixe(filsgauche(r));
         prefixe(filsdroit(r));}
      }
}  

et dans le main j'appel la fonction avec le parametre tete, mais voila j'ai droit a un affichage qui ne s'arréte pas et qui n'est meme pas juste.
je c que la fonction est correcte car je l'ai esseyé sur un autre arbre et ca marche, mais sur mon arbre ca ne marche pas.
g aussi esseyé de parcourir sans la fonction prefixe pour voir si le chainage est bien fait et il m'affiche le resultat correcte.
donc est ce que quelqu'un peu voir si mon programme est correcte
merciii d'avance.
0
eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009
14 mai 2009 à 09:38
bonjour,
je voulais juste vous remerciez de vos nombreuses reponses.
0
Rejoignez-nous