Affichage d'un arbre dynamique(en C) [Résolu]

cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 26 mai 2007 à 00:31 - Dernière réponse : cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

13 réponses

The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 26 mai 2007 à 14:56
+3
Utile
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

=
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de The_Guardian
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 26 mai 2007 à 10:16
0
Utile
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

=
Commenter la réponse de The_Guardian
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 26 mai 2007 à 13:07
0
Utile
bonjour,

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

merci
Commenter la réponse de cs_marocweb
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 26 mai 2007 à 13:28
0
Utile
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)

=
Commenter la réponse de The_Guardian
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 26 mai 2007 à 14:49
0
Utile
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.
Commenter la réponse de cs_marocweb
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 26 mai 2007 à 15:38
0
Utile
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.
Commenter la réponse de cs_marocweb
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 26 mai 2007 à 15:53
0
Utile
RE

colle le code STP merci que je regarde et evite d'utiliser variable globale.
Commenter la réponse de The_Guardian
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 27 mai 2007 à 01:28
0
Utile
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)
Commenter la réponse de cs_marocweb
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 27 mai 2007 à 11:06
0
Utile
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

=
Commenter la réponse de The_Guardian
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 27 mai 2007 à 14:53
0
Utile
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
Commenter la réponse de cs_marocweb
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 27 mai 2007 à 16:58
0
Utile
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é.
Commenter la réponse de cs_marocweb
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 27 mai 2007 à 17:03
0
Utile
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!

=
Commenter la réponse de The_Guardian
cs_marocweb 8 Messages postés samedi 5 mai 2007Date d'inscription 27 mai 2007 Dernière intervention - 27 mai 2007 à 17:27
0
Utile
merci encore une fois.
Commenter la réponse de cs_marocweb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.