Affichage d'un arbre dynamique(en C)

Résolu
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007 - 26 mai 2007 à 00:31
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007 - 27 mai 2007 à 17:27
bonjour tout le monde,

j'ai un arbre déja crée en mémoire en utilisant les listes chainées et cela comme suit :

Chaque noeud point vers une liste chainée qui contient un ou plusieurs éléments selon le nombre de sous-noeuds, chaque élément point lui même sur un autre noeud... ça passe comme ça..

maintenant la focntion que je cherche doit afficher l'arbre comme suit :
Ex :

Noeud1
    Noeud2
    Noeud3
Noeud4
    Noeud5
        Noeud6
        Noeud7
    Noeud8

13 réponses

The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
26 mai 2007 à 14:56
RE

Ajoute un parametre a ta fonction comme je l'ai fait.

Il suffit donc que tu fasses:
 void affichage(dossier * P, int n)
 puis ensuite une boucle pour faire n fois un espace

=
3
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
26 mai 2007 à 10:16
Salut,

Avec la récursion c'est pas difficile.
affichageArbre( liste L, decalage D )
pourtout element E de la liste L faire
afficher noeud(E) avec un decalage de D espaces
affichageArbre( sous-liste de E, D+2 )
 finpourtout

=
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
26 mai 2007 à 13:07
bonjour,

merci pour votre réponse ultra rapide, cependant j'ai pas bien compris.. l'utilité de la variable D ?

merci
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
26 mai 2007 à 13:28
RE

L'utilite de la variable D c'est d'afficher avec un decalage qui change selon le niveau dans l'arbre,  c'est plus joli si au niveau 3 y'a 6 espaces que si y'en avait aucun (sinon on voit pas la structure d'arbre)

=
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
26 mai 2007 à 14:49
C'est exactement ce que je cherche, la fonction que j'ai développé affiche uniquement l'arbre comme ça :

Noeud1
2
3
4
5
6

sans tabulation ni espace !

voila la fonction :

void affichage(dossier *P){

puts(P->nom);

if(P->racines!=NULL){

        R=P->racines;
       
        while(R!=NULL){
           
            affichage(R->pcible);
            R=R->next;
           
        }

}

}

J'ai pas réussi a integré une variable qui change selon la profondeur. pouvez vous svp me dire comment ?
voila les sctructures utilisées pour définir l'arbre et ses racines :

typedef struct rac{

struct rep *pcible;
struct rac *next;

}racine;

typedef struct rep{

char nom[30];
struct rac *racines;

}dossier;

Merci merci merci.
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
26 mai 2007 à 15:38
je l'ai déja testé mais, elle affiche l'arbre comme ca

noeud1
  noeud2
    noeud3
      noeud4
        noeud5
           noeudx

alors que noeud x doit être au même niveau que noeud1.
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
26 mai 2007 à 15:53
RE

colle le code STP merci que je regarde et evite d'utiliser variable globale.
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
27 mai 2007 à 01:28
j'ai ajouté quelques modifications sur la fonction.
Maintenant elle affiche l'arbre comme ça :

Noeud1
       Noeud2
       noeud3
       noeud4
       ...

ils onts tous une tabulation avant sauf le premier noeud, voila la fonction maintenant :

void affichage(dossier *P,int d){

for(i=0;i<d;i++) printf("\t");
puts(P->nom);

if(P->racines!=NULL){

        R=P->racines;
       
        while(R!=NULL){
           
            affichage(R->pcible,d+2);
            R=R->next;
           
        }

}

}

Je l'appel dans main la premier fois comme ça : affichage(L,0)
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
27 mai 2007 à 11:06
RE

OK y'a deux trucs a faire :
 - mettre les variables "i" et "R" en local dans la fonction
- s'assurer que la liste initiale est bien creee comme il faut
 sinon c'est bon

=
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
27 mai 2007 à 14:53
Je crois que l'arbre est mal construi dès le début ce qui donne l'affichage de l'arbre comme ça.

j'ai ajouté une variable niveau à la structure des racines pour déterminer la profondeur courante; et lors de l'affichage je voi que 1 1 1 1 1 1 donc je crois que lors de la création tout les noeud sont des sous noeud du noeud pére.

Je vais corriger ça et vous tenir au courant.

Merci
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
27 mai 2007 à 16:58
C'est bon j'ai réussi a l'afficher en utilisant la même fonction précédente, le problème a été dans la fonction creer(arbre)

merci beaucoups pour l'éffort et pour le temps que vous m'avez consacré.
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
27 mai 2007 à 17:03
Re

Fautre mettre les réponses validées en verte quand tu penses que c'est ok. Ca fait un peu le ménage dans le forum, on voit qui n'a plus besoin d'aide ainsi :)

Bonne continuation à toi!

=
0
cs_marocweb Messages postés 8 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 27 mai 2007
27 mai 2007 à 17:27
merci encore une fois.
0
Rejoignez-nous