在C ++

时间:2017-10-12 03:40:07

标签: c++ c++11 templates

我对模板编程完全不熟悉。所以我开始使用一些基本的模板编程。我已经在其中创建了一个头文件BinaryTree.h,我收到了一些错误。请参阅下面的代码:

#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_ */

现在我的主要test.cpp看起来像这样:

#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;
}

但是当我试图运行代码时,它显示了一些错误

  

0 [main] Containers 8796 cygwin_exception :: open_stackdumpfile:将堆栈跟踪转储到Containers.exe.stackdump

任何人都可以在我收到错误的地方帮助我

1 个答案:

答案 0 :(得分:2)

您正在尝试访问尚未创建的元素。那是我得到的错误。您从未创建过新的Root节点。我强烈建议您查看平台的所有调试选项。到目前为止,我遇到了超过1个错误。

以下是一些需要修复的步骤。

1,在你的void addNode(T value)函数中,你需要这样的东西。

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

或者在你的构造函数中创建一个根节点,然后让它为空。

第二。在addhelper函数中,您需要先创建新子项,然后再分配它们。见下文

else if (leaf->lChild == NULL)
    {
        leaf->lChild = new Node<T>();
        leaf->lChild->data = value;
        leaf->lChild->lChild = NULL;
        leaf->lChild->rChild = NULL;
    }
然后,您需要为其他案例执行此操作。

在调试过程中,您可以看到哪些指针是NULL,哪些指针不是,您可以逐步查看代码并查看它何时中断。

希望这些提示能让您走上正轨。到目前为止工作很好,代码非常易读,很容易看到发生了什么。你只是陷入Null指针。