Arbres generaux C++

m-dy - Modifié par BunoCS le 21/11/2013 à 11:54
mdy405 Messages postés 5 Date d'inscription vendredi 11 octobre 2013 Statut Membre Dernière intervention 21 novembre 2013 - 21 nov. 2013 à 23:25
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

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
21 nov. 2013 à 11:54
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 ;)
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
21 nov. 2013 à 11:55
Hello,
Qu'est-ce qui te bloques exactement?
0
J essai de definir une fonction recherche depuis, qui doit faire appel a rechercherec dans lire fichier....mais j y arrive pas
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
21 nov. 2013 à 14:57
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..
0

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

Posez votre question
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 !
0
mdy405 Messages postés 5 Date d'inscription vendredi 11 octobre 2013 Statut Membre Dernière intervention 21 novembre 2013
21 nov. 2013 à 15:48
ca plante juste quand j essaie de deboguer1
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
Modifié par BunoCS le 21/11/2013 à 17:01
ç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 ...
0
mdy405 Messages postés 5 Date d'inscription vendredi 11 octobre 2013 Statut Membre Dernière intervention 21 novembre 2013
21 nov. 2013 à 17:05
racine est define dans la classe abres_generaux

noeud*racine;
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
21 nov. 2013 à 17:29
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?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2013 à 18:04
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" ?
0
mdy405 Messages postés 5 Date d'inscription vendredi 11 octobre 2013 Statut Membre Dernière intervention 21 novembre 2013
Modifié par mdy405 le 21/11/2013 à 19:32
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....
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 21/11/2013 à 19:56
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.
0
mdy405 Messages postés 5 Date d'inscription vendredi 11 octobre 2013 Statut Membre Dernière intervention 21 novembre 2013
21 nov. 2013 à 23:25
thx mon gars j ai appris de nouvelles choses...en terme de terminologie surtout!!!
0
Rejoignez-nous