我对模板编程完全不熟悉。所以我开始使用一些基本的模板编程。我已经在其中创建了一个头文件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
任何人都可以在我收到错误的地方帮助我
答案 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指针。