Arbres generaux C++

Signaler
-
Messages postés
5
Date d'inscription
vendredi 11 octobre 2013
Statut
Membre
Dernière intervention
21 novembre 2013
-
Bonjour,
je suis entrain de construire un arbre general en C++ a partir d'un fichier mais je suis bloque sur la fonction lirefichier:



#include <iostream>
using namespace std;
#include <fstream>;
#include <cstring>;
#include<string>;
#include<sstream>;
struct noeud{
 char lettre;
  noeud*frere,*fils;
  noeud(char let, noeud*fr , noeud*fi){
   this->lettre=let;
   this->frere=fr;
   this->fils=fi;
 }
};

class Abres_generaux{
public:
 Abres_generaux();//constructeur pour creer l'arbre
 noeud*recherche(char l){noeud*rechercherec(char lettre, noeud*r);};
 void ajouterfils(noeud*pere, noeud*fils);
 void lirefichier(string nom);
 noeud*racine;
 bool comparer_arbre(Abres_generaux arbre);
}




void Abres_generaux :: lirefichier(string nom){
 ifstream f(nom.c_str());
 string ligne; int n=0;
 while(getline(f, ligne))
 {
 n++;
 stringstream ss(ligne);
 noeud*pere,*fils;
 char per_c, fils_c;
 ss>>pere_c;
 if(n==1)
  racine=pere=noeud(pere_c, NULL, NULL);
 
 else
  noeud*pere=recherche(pere_c);
  while(!ss.eof){
   ss>>fils_c;
   fils=new noeud (fils_c, NULL, NULL);
   ajouterfils(pere, fils);
  }
 }
}





noeud*rechercherec(char lettre, noeud*r)
{
 if (r==NULL) return NULL;
 if(r->lettre==lettre) return r;
 noeud*temp;
 for(noeud*c=r->fils; c!=NULL; c=c->frere){
 if((temp=rechercherec(lettre,c))!=NULL)
  return temp;
 }
 return NULL;
}

void Abres_generaux::ajouterfils(noeud*pere, noeud*fils){
 if(pere->fils==NULL)
  pere->fils=fils;
 else{
  noeud*c=pere->fils;
  while(c->frere!=NULL){
   c=c->frere;
  }
  c->frere=fils;
 }

}


merci pour votre aide

13 réponses

Messages postés
14884
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 novembre 2020
93
Hello,
J'ai rajouté des balises code dans ta demande (4e icone au-dessus de la zone de texte).
Merci d'y penser la prochaine fois ;)
Messages postés
14884
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 novembre 2020
93
Hello,
Qu'est-ce qui te bloques exactement?
J essai de definir une fonction recherche depuis, qui doit faire appel a rechercherec dans lire fichier....mais j y arrive pas
Messages postés
14884
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 novembre 2020
93
mais j y arrive pas
Quel est le comportement attendu? Quel est le comportement constaté?
Déjà, tu utilises 2 fois la variable père, c'est dangereux. Ensuite, je ne comprends pas ta méthode: pour chaque ligne du fichier, tu parcours ton arbre...pour faire quoi?
Je pense que tu mélanges la construction de ton arbre et la recherche à l'intérieur de celui-ci..
En fait l'objectif est de creer deux arbres generaux et de les comparer a la fin, ¨je mattends a ske lirefichier aille prendre mes donnees et cree mon arbre. pere_c est le nouveau caractere a ajouter

A

B C D

E F
dans cet exemple je voudrais ajouter E et F comme fils de B donc il faut savoir c ki leur pere (B) d ou :
noeud*pere=recherche(char pere_c)...peut etre que ma loqiue ne fonctionne pas si t as une idee merci de la partager !
Messages postés
5
Date d'inscription
vendredi 11 octobre 2013
Statut
Membre
Dernière intervention
21 novembre 2013

ca plante juste quand j essaie de deboguer1
Messages postés
14884
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 novembre 2020
93
ça ne planterait pas ici?
racine=pere=noeud(pere_c, NULL, NULL);

Je ne vois pas de déclaration de
racine
...
@+
Buno, Modo CS-CCM
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, envisage a time ...
Messages postés
5
Date d'inscription
vendredi 11 octobre 2013
Statut
Membre
Dernière intervention
21 novembre 2013

racine est define dans la classe abres_generaux

noeud*racine;
Messages postés
14884
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 novembre 2020
93
Désolé, ma boule de cristal est en réparation, donc ça va être difficile de deviner ce qui se passe...
As-tu testé en pas-à-pas? ça plante où?

Question annexe: pourquoi
noeud
est une struct et non une classe?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Question annexe: pourquoi noeud est une struct et non une classe?
En C++, une classe et une struct sont identiques (à part le niveau de visibilité par défaut). Donc s'il veut accéder à ses attributs sans faire d'acesseur (dont l'utilité ici serait effectivement discutable), alors ça me paraît cohérent.
En revanche, je suis plus choqué par le fait que "Arbre_generaux" soit une classe alors que la plupart des méthodes n'utilise pas d'attribut...
(Le nom devrait aussi être au singulier).

ca plante juste quand j essaie de deboguer1
Enfin, pour répondre à la question, peux-tu poster ce que t'affiche ton "debuger" ?
Messages postés
5
Date d'inscription
vendredi 11 octobre 2013
Statut
Membre
Dernière intervention
21 novembre 2013

Arbre est au pluriel juste une question de grammaire...;)
plus serieusement mon compil dit:
'Abres_generaux::recherche' : doit retourner une valeur
donc ce qui nous rammene a la case depart comment definir ma fonction recherche pour ke ca marche

Thx guys vous etes sympa....
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Arbre est au pluriel juste une question de grammaire...;)
Non, je ne parlais pas de ça. Je parlais d'une question de logique de conception.
Soit ta classe représente *un* seul arbre, et elle doit s'appeler "ArbreGeneral", soit elle représente *plusieurs* arbres et elle doit s'appeler "ArbresGeneraux". Ici, tu l'as appelé "ArbresGeneraux" donc tu veux que cette classe représente une liste d'arbre ? (J'en doute, ça serait bizarre).
Attention, ce n'est pas une question d'orthographe, mais de compréhension.

plus serieusement mon compil dit:
Compilateur ou débugger ? J'ai l'impression que tu confonds. Petit rappel:
- Une erreur de syntaxe ou de code, est donné par le compilateur. Le code ne compile pas.
- Une erreur d'exécution est donné par le débugger. Le code a compilé mais celui-ci plante ou n'a pas le comportement voulu.

Or tu disais que "ça plantait", vu que ton code ne compile pas, je pense que tu voulais dire qu'il ne compilait pas.
Attention d'utiliser les bons termes. Ce n'est pas pour t'embêter, mais si tu utilises les mauvais mots, on sera perdu, et on ne pourra pas t'aider :(.

'Abres_generaux::recherche' : doit retourner une valeur
Le message est très explicite. Ta fonction doit retourner une valeur, et actuellement, elle ne retourne rien. De plus le contenu de la fonction "rechercher" est très étrange, on dirait que tu mélanges déclaration et utilisation.
Messages postés
5
Date d'inscription
vendredi 11 octobre 2013
Statut
Membre
Dernière intervention
21 novembre 2013

thx mon gars j ai appris de nouvelles choses...en terme de terminologie surtout!!!