2017-10-12 1 views
1

Je suis totalement nouveau dans la programmation de modèles. J'ai donc commencé avec une programmation de base. J'ai fait un fichier d'en-tête BinaryTree.h à l'intérieur duquel j'ai des erreurs. S'il vous plaît voir ci-dessous mon code:Déclarez une autre variable de modèle à l'intérieur d'un modèle en C++

#ifndef BINARYTREE_H_ 
#define BINARYTREE_H_ 

#include <cstdlib> 
#include<ctime> 


template<typename T> 
struct Node 
{ 
    T data; 
    Node *lChild; 
    Node *rChild; 
}; 

template<class T> 
class BinaryTree 
{ 
    private: 
     Node<T> *root; 

     void addHelper(T value, Node<T> *leaf) 
     { 

      if(leaf == NULL) 
      { 
       leaf->data = value; 
       leaf->lChild = NULL; 
       leaf->rChild = NULL; 
      } 

      else if(leaf->lChild == NULL) 
      { 
       leaf->lChild->data = value; 
       leaf->lChild->lChild = NULL; 
       leaf->lChild->rChild = NULL; 
      } 
      else if(leaf->rChild == NULL) 
      { 
       leaf->rChild->data = value; 
       leaf->rChild->lChild = NULL; 
       leaf->rChild->rChild = NULL; 
      } 
      else 
      { 
       srand((int)time(0)); 
       int i = rand() % 2; 
       if(i == 0) 
       { 
        addHelper(value, leaf->lChild); 
       } 
       else 
       { 
        addHelper(value, leaf->rChild); 
       } 
      } 
     } 

     void traverseHelper(Node<T> *leaf) 
     { 
      if(leaf == NULL) 
       return; 
      traverseHelper(leaf->lChild); 
      traverseHelper(leaf->rChild); 
      std :: cout << leaf->data; 
     } 
    public: 
     BinaryTree() 
     { 
      root = NULL; 
     } 

     void addNode(T value) 
     { 
      addHelper(value, root); 
     } 

     void traverseNode() 
     { 
      traverseHelper(root); 
     } 
}; 



#endif /* BINARYTREE_H_ */ 

Maintenant, ma principale test.cpp ressemble à ceci:

#include<iostream> 
#include "BinaryTree.h" 

using namespace std; 

int main() 
{ 
    BinaryTree<int> bt; 
    bt.addNode(5); 
    bt.addNode(6); 
    bt.addNode(15); 
    bt.addNode(20); 
    bt.traverseNode(); 
    return 0; 
} 

Mais quand j'ai essayé d'exécuter le code, il me montre une erreur

0 [principal] Conteneurs 8796 cygwin_exception :: open_stackdumpfile: Récupérer la trace de la pile vers Containers.exe.stackdump

Quelqu'un peut-il m'aider où je reçois l'erreur

Répondre

2

Vous essayez d'accéder à un élément qui n'a pas été créé. C'était l'erreur que j'ai eue. Vous n'avez jamais créé de nouveau nœud racine. Je recommande fortement d'examiner les options de débogage de votre plate-forme. J'ai frappé plus d'une erreur jusqu'à présent.

Voici quelques étapes à corriger. 1er, dans votre fonction void addNode(T value), vous aurez besoin de quelque chose comme ça.

void addNode(T value) 
{ 
    if (root == NULL){ 
     root = new Node<T>(); 
     root->data = value; 
     root->lChild = NULL; 
     root->rChild = NULL; 
    } 
    else{ 
     addHelper(value, root); 
    } 
} 

que ce soit, ou dans votre constructeur, faire un nœud racine et juste que ce soit vide.

2ème. Dans votre fonction addhelper, vous devez d'abord créer de nouveaux enfants avant de les affecter. voir ci-dessous

else if (leaf->lChild == NULL) 
    { 
     leaf->lChild = new Node<T>(); 
     leaf->lChild->data = value; 
     leaf->lChild->lChild = NULL; 
     leaf->lChild->rChild = NULL; 
    } 

vous devez ensuite faire cela pour le reste de vos cas. Pendant le débogage, vous pouvez voir quels pointeurs sont NULL et lesquels ne le sont pas, et vous pouvez voir votre code pas à pas et voir quand il se casse.

J'espère que ces conseils vous mettront sur la bonne voie. Bon travail jusqu'à présent, le code était très lisible et facile à voir ce qui se passait. Vous êtes juste coincé sur des pointeurs Null.