希望能提供帮助,感激不尽!
这个是结点抽象类型
//BTreeNode.h
#ifndef BTREENODE_H
#define BTREENODE_H
#include <cstdlib>
template<class T> class BTree;
template<class T> class BTreeNode
{
friend class BTree<T>;
public:
BTreeNode():lchild(NULL),rchild(NULL){ };
BTreeNode(T&dt, BTreeNode<T> *lch =NULL , BTreeNode<T> *rch = NULL)
:data(dt),lchild(lch),rchild(rch){};
T get_data()const {return data; };
BTreeNode<T>* get_lchild()const {return lchild; };
BTreeNode<T>* get_rchild()const {return rchild; };
protected:
private:
T data;
BTreeNode<T> *lchild, *rchild;
};
#endif
//二叉树的抽象类型
//BTree.h
#ifndef BTREE_H
#define BTREE_H
#include "BTreeNode.h"
#include <iostream>
#include <cstdlib> //NULL的定义在这里
template <class T>
class BTree
{
friend std::ostream& operator <<(std::ostream&os, const BTree<T> bt);
public:
BTree(T *a,int m)
{
n = m;
elems = new T[n];
elems = a;
//问题出在这里,没有这条语句时主函数中cout << bt ;还能输出正确结果,加上这条就不显示了,不知道哪里错了?
//root = build_body(0);加上这条语句不能显示
};
int get_n()const {return n; };
T* get_p()const{ return elems;};
protected:
private:
BTreeNode<T>* build_body(int i);
T *elems;
int n;
BTreeNode<T>* root;
};
template<class T>
std::ostream& operator <<(std::ostream&os, const BTree<T>& bt)
{
std::cout << "The tree is: " <<std::endl;
for(int i = 0; i != bt.get_n(); ++i)
std::cout << bt.get_p()[i];
std::cout << std::endl;
return os;
}
//构造子树
template <class T>
BTreeNode<T>* BTree<T>::build_body(int i)//suffix
{
BTreeNode<T> *p;
int l = 0, r = 0;
if( i < n && elems[i] != ' ')
{
p = new BTreeNode<T>;
p->data = elems[i];
l = 2*i;
r = 2*i + 1;
p->lchild = build_body(l);
p->rchild = build_body(r);
return p;
}
else
return NULL;
}
#endif
测试函数
//MainFn.cpp
#include "BTree.h"
#include "BTreeNode.h"
#include <iostream>
using namespace std;
int main()
{
cout << 1 <<endl;
char *str = "12345 6";//字符数组的定义形式
BTree<char> bt(str,7);
cout << bt ; //不输出结果,为何??
//bt.inorder();
return 0;
}
6 个解决方案
#1
模板的声明跟定义都放在.h里,你分开编译没报错吗?
一般要用export关键字才能分开编译.
一般要用export关键字才能分开编译.
#2
我试了一下能输出的
输出为
1
this tree is
12345 6
输出为
1
this tree is
12345 6
#3
BTree<char> bt(str,7);
p->lchild = build_body(l);
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!
#4
你可能看走眼了,我都是放在头文件里包含编译的
#5
谢谢回答,我已经把有问题的那一句注释掉了,所以又结果。代码中说明了,那一句不注释掉的话没有结果
#6
谢谢,很想知道问题出在哪里了,我不会跟踪调试,我去找找看这方面的资料吧
#1
模板的声明跟定义都放在.h里,你分开编译没报错吗?
一般要用export关键字才能分开编译.
一般要用export关键字才能分开编译.
#2
我试了一下能输出的
输出为
1
this tree is
12345 6
输出为
1
this tree is
12345 6
#3
BTree<char> bt(str,7);
p->lchild = build_body(l);
嵌套调用,结构不好,看不出有没有无限循环,跟踪调试吧!
#4
你可能看走眼了,我都是放在头文件里包含编译的
#5
谢谢回答,我已经把有问题的那一句注释掉了,所以又结果。代码中说明了,那一句不注释掉的话没有结果
#6
谢谢,很想知道问题出在哪里了,我不会跟踪调试,我去找找看这方面的资料吧