IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Arbre N-aire avec des vecteurs de pointeurs


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Arbre N-aire avec des vecteurs de pointeurs
    Bonjour,

    Je souhaite implémenter des arbres N-aires, avec une structure de vecteurs, afin de pouvoir construire mon arbre dynamiquement.
    J'ai donc crée une classe PrefixNode défini ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    class PrefixNode;
    typedef string ItemType;
    typedef vector<PrefixNode*> VectChild;
    class PrefixNode {
     
    private:
     
    	ItemType 	Val;
    	int      	Proba;
    	int 		Niveau;
     
    	//Calcul du Niveau
    	void CalculerNiveau();
     
    	//calcul la probabilité du noeud courant
    	void CalculerProba();
     
    public:
     
    	//Liens
    	VectChild	Successeurs;
            PrefixNode* 	Pere;
     
           //Constructeur par défault
           PrefixNode(){};
     
           //Constructeur
    	PrefixNode(ItemType S){
    		Val 		= S;
    		Proba 		= 0;
    		Niveau 		= 0;
    		Pere		= NULL;
    	}
            // Accesseurs
    	ItemType 	getVal() const;
    	int 	 	getProba() const;
    	int     	getNiveau() const;
    	VectChild getChildren() const;
    	PrefixNode* getFather() const;
     
    	// Mutateurs
    	void setVal(ItemType);
    	void setSuccesseurs(VectChild);
    	void setNiveau(int);
     
    	//Affichage
    	void PrintNode();
    	void PrintTree();
     
    	//Gestion des noeuds enfants
    	void CreateChildren(ItemType);
    };
    Un PrefixNode comporte donc ses attributs(valeur,niveau,etc...)et un vector de pointeurs vers des PrefixNode. Je ne sais pas si cette structure est optimale, mais elle me semble cohérente.

    Il semble que j'ai un problème dans la méthode CreateChildren qui ajoute un Noeud Fils au noeud qui appelant ( créé un nouveau fils si aucun fils, ajoute un frère si un ou plusieurs fils est déjà présent). Je vous donne son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void PrefixNode::CreateChildren(ItemType S){
     
    	VectChild::iterator it;
    	VectChild::iterator it2;
     
    	if (Successeurs.empty()){
    		//créer 1 fils
    		(Successeurs).push_back(new PrefixNode(S));
    		it=(Successeurs).begin();
    		(*it)->Pere = this;
    		(*it)->CalculerNiveau();
    		(*it)->CalculerProba();
    	}
     
    	else{
    		//creer un frere
    		(Successeurs).push_back(new PrefixNode(S));
    		 it2=(Successeurs).end();
    		(*it)->Pere = this;
    		(*it)->CalculerNiveau();
    		(*it)->CalculerProba();
    	}
    }

    Je teste tout ça en créant d'abord un premier fils, puis en créant ce qui devrai être un frère de ce dernier. Ce qui se fait par le main suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main() {
     
    			PrefixNode* racine;
    			racine= new PrefixNode("ROOT");
    		        racine->CreateChildren("FILS1");
    		       (racine)->PrintTree();
            	       (racine)->CreateChildren("FILS11");racine->PrintTree();
     
    return 0;
    }

    A l'éxecution, le programme plante à la création du frère. ça affiche ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    + Noeud (0x20fd0) :
     - Niveau = 0
     - Valeur= ROOT
     - Predecesseur = 0
     - Successeurs= { 0x21018 }
      + Noeud (0x21018) :
       - Niveau = 1
       - Valeur= FILS1
       - Predecesseur = 0x20fd0
       - Successeurs= { Aucun }
    ...puis ça plante. Le frère "FILS11" n'est pas crée.Je m'arrache les cheveux depuis des heures; donc je fais appel à vos connaissances ! Je débute vraiment en c++, est-il besoin de le préciser ... Merci par avance de votre aide.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		//creer un frere
    		(Successeurs).push_back(new PrefixNode(S));
    		 it2=(Successeurs).end();
    Attention ici it2 ne va pas pointer sur le dernier élément mais une position après. Le dernier élément c'est *(Successeurs.end()-1) ou Successeurs.back().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		(*it)->Pere = this;
    		(*it)->CalculerNiveau();
    		(*it)->CalculerProba();
    Attention ici it est utilisé sans avoir été initialisé.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour votre réponse. ça marche en prenant effectivement it2=(Successeurs).end()-1.
    je vais pouvoir travailler sur mes algo de recherche maintenant que la structure est bien définie

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pourquoi ne pas utiliser un variant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef boost::make_recursive_variant<
        std::string,
        std::vector< boost::recursive_variant_ >
    >::type string_tree_t;

Discussions similaires

  1. [Débutant] Créer une matrice avec des vecteurs de dimensions différente
    Par MATHVIP dans le forum MATLAB
    Réponses: 1
    Dernier message: 16/01/2015, 12h12
  2. [Débutant] ordonnancement étrange avec des vecteurs
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 13
    Dernier message: 25/05/2011, 14h14
  3. Travail avec des vecteurs (rentabilité)
    Par Caspi dans le forum R
    Réponses: 5
    Dernier message: 27/09/2009, 20h05
  4. Petits soucis avec des vecteurs
    Par Superzobi dans le forum SL & STL
    Réponses: 3
    Dernier message: 03/05/2007, 10h04
  5. Probleme avec des pointeurs...
    Par barucca dans le forum C++
    Réponses: 5
    Dernier message: 23/08/2005, 22h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo