Rechercher : dans
Par :

Les arbres en c++

Dernière réponse le 26 mar 2009 à 01:09:18 han-n, le 24 mar 2009 à 16:51:08 
 Signaler ce message aux modérateurs

Bonjour,
j'ai besoin d' aide pour la manipulation des arbres n-aire en c++(parcoure,supression )
aidez-moi svp!c'est urgent
merci d'avance

Configuration: Windows Vista
Internet Explorer 7.0

Meilleures réponses pour « les arbres en c++ » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

mamiemando, le 24 mar 2009 à 20:14:25
Répondre à mamiemando

2

han-n, le 25 mar 2009 à 11:37:33

Bonjour,
voila je suis entraine de manipuler un arbre(n-aire) qui represente une repertoire qui contient des fichiers,
donc je veux supprimer un noued donner (fichier ou repertoire) mais j'arrive pas a le faire!
pouvez vous m'aide? et merci bqp

Répondre à han-n

3

mamiemando, le 25 mar 2009 à 13:05:58

Cela dépend fortement de ta structure d'arbre, il faudrait que tu me la donnes. A priori il s'agit simplement de faire un parcours récursif de ton arbre et d'examiner le noeud visité pour voir s'il correspond à ce que tu cherches.

Un exemple pour t'inspirer :

typedef struct _noeud_t{
  unsigned id; // l'identifiant d'un noeud
  unsigned nb_fils; // le nombre de noeud fils
  struct _noeud_t ** fils; // les noeuds fils (un tableau de pointeur sur chaque noeud fils)
} noeud_t;

typedef noeud_t * arbre_t;

void afficher_arbre(arbre_t a){
  unsigned i;
  printf("noeud %d\n",a->id);
  // appel récursif
  for(i=0;i<a->nb_fils;++i) afficher_arbre(a->fils[i]);
}

Dans ton cas il suffit d'interrompre les appels récursifs dès que tu as trouvé le noeud qui t'intéresse :
int chercher_noeud(arbre_t a,unsigned id,struct _node_t ** p){
  unsigned i,trouve = 0;

  // Le noeud courant est le noeud recherché
  // *p pointe sur le noeud recherché.
  if(id == a->id){
    *p = a;
    return 1; // trouvé (on remonte la valeur 1)
  }

  // On visite les noeuds fils du noeud courant à la recherche du noeud id
  // Si le noeud cherché si trouve, l'appel récursif basculera la valeur 0
  // Si c'est une feuille  on n'entre pas dans la boucle for et on remonte la valeur 0
  for(i=0;i<a->nb_fils && !trouve;++i) trouve = chercher_noeud(a->fils[i],id);
  return trouve;
}

Bonne chance

Répondre à mamiemando

4

han-n, le 25 mar 2009 à 17:40:18

Merci bqp pour votre reponse ,ma structure d'arbre est:
struct noeud{
string nom;//nom du repertoire
char etq;//etiquette(p:pour une partition,r:pour une repertoire et f:pour un fichier)
noeud*pfg;//pointeur vers le premier fils gauche
noeud*fr;//pointeur vers les freres
};
et j'avais fait la fonction qui verifier l'existance d'un noued donner voila:
bool find(noeud*rep,string nom){
noeud*b=rep,*l,*l1;
bool v;
if((b!=NULL)){
if((b->nom==nom)){v=true;}
else{l=sous_arb(b);
while((l!=NULL)&&(!v)){
l1=l;
while((l1!=NULL)&&(!v)){
v= find(l1,nom);
l1=l1->fr;
}
b=b->pfg;l=sous_arb(b);
}
}
}
return v;
}
mais je ne sais pas comment supprimer, vous pouvez me donne une idee?
merci

Répondre à han-n

5

 mamiemando, le 26 mar 2009 à 01:09:18

C'est exactement le même principe. Tu repères avec un appel récursif le nœud à partir duquel supprimer. Puis avec un appel récursif à partir de ce nœud, tu supprimes tous les fils. Il faut évidemment supprimer en commençant par les descendants. Ainsi une suppression récursive ressemble à :

void supprimer(struct noeud_t * a){
  unsigned i;
  // appel récursif
  for(i=0;i<a->nb_fils;++i){
    if (a->fils[i]){
      supprimer(a->fils[i]);
      free(a->fils[i]);
    }
  }
  free(a->fils);
}

Bonne chance

Répondre à mamiemando