Parcours d'un arbre

Fermé
eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009 - 12 mai 2009 à 17:38
eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009 - 14 mai 2009 à 09:31
Bonjour,
g écrit un programme qui construit un arbre a partir d'une liste chainé
cad les élément de la liste contiennent les champs fils gauche et fils droit
mais voila lors du parcours prefixe de l'arbre, 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 essayé 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.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>
typedef struct elt {int valeur;
struct elt *fg;
struct elt *fd;
struct elt *suivt;}liste;
liste *r;
int vide(liste *r)
{if (r==NULL) return(1);
else return(0);}
int feuille(liste *r)
{if (r->fg==NULL && r->fd==NULL) return(1);
else return(0);}
liste *filsgauche(liste *r)
{return(r->fg);}
liste *filsdroit(liste *r)
{return(r->fd);}
void prefixe(liste *r)
{if (!vide(r))
{printf("%d",r->valeur);
if (!feuille(r))
{prefixe(filsgauche(r));
prefixe(filsdroit(r));}
}
}
int main()
{
liste *p;liste *tete,*z,*q,*sauv,*tri,*o,*var,*g,*save,*w;
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;
p->fg=NULL;
p->fd=NULL;
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;}
printf("\n");
///////////////**********construction de l'arbre**********//////////
while (tete->suivt!=NULL)
{p=tete;
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\n",p->valeur);
p->fg=tete;
p->fd=save;
p->suivt=sauv;
tete=p;
z=tete->suivt;
if (z!=NULL)
{q=z->suivt;
if (q!=NULL)
{val1=z->valeur;

val2=q->valeur;

}}

p=tete;
/////********** les deux inferieurs ou egales*********///////////////
while ((q!=NULL)&&(z!=NULL)&&(val1<=p->valeur)&&(val2<=p->valeur))
{sauv=p;
p=(liste*)malloc(sizeof(liste));
p->valeur=val1+val2;
printf("%d\n",p->valeur);
p->fg=z;
p->fd=q;
sauv->suivt=p;
p->suivt=q->suivt;
z=p->suivt;
if (z!=NULL)
{q=z->suivt;
if (q!=NULL)
{val1=z->valeur;
val2=q->valeur;

}}

}
////////******les deux superieur*****///////////
if ((q!=NULL)&&(z!=NULL)&&(val1>=p->valeur)&&(val2>p->valeur))
{p=tete;}
else /////////****** l'un inferieur et l'autre superieur*********//////////
if ((q!=NULL)&&(z!=NULL)&&(val1<p->valeur)&&(val2>=p->valeur))
{p=tete;
while (b==true)
{b=false;
tri=p->suivt;
while(p->suivt!=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;
sauv->suivt=tri;
p->suivt=var;
tri=p->suivt;
}
else
{tri->suivt=p;
sauv->suivt=tri;

p->suivt=NULL;
}
b=true;
}
else
{sauv=p;
p=p->suivt;
tri=p->suivt;
}
}
p=tete;
}
g=tete;
while (g!=NULL)
{printf("%d\n",g->valeur);

g=g->suivt;}
}
else /////////**********un seul element dans la liste******/////////////
if ((q==NULL)&&(z!=NULL))
{
if (p->valeur>z->valeur)
{b=true;
p=tete;
while ((b==true)&&(p->suivt!=NULL))
{
b=false;
tri=p->suivt;
while(p->suivt!=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;
sauv->suivt=tri;
p->suivt=var;
tri=p->suivt;
}
else
{tri->suivt=p;

sauv->suivt=tri;
p->suivt=NULL;
}
b=true;
}
else
{sauv=p;

p=p->suivt;
tri=p->suivt;}
}

p=tete;
}
}

g=tete;
while (g!=NULL)
{printf("%d\n",g->valeur);
g=g->suivt;}
}
}
printf("\n\n\n\n");
prefixe(tete);
getche();
}
A voir également:

1 réponse

eglentine Messages postés 5 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 14 mai 2009
14 mai 2009 à 09:31
bonjour,
je voulais vous remerciez pour vos nombreuse réponses.
0