我制作了树数据结构,但是当我擦除
下面的对象问题内容时遇到问题:
* `./t' 中的错误:free(): 无效指针:0x00007ffd1df99400 *
???(核心转储)
源代码
主程序
#include<iostream>
#include"tree.h"
#include"point.h"
using namespace std;
template<class T>
void ShowIntData(Point<T> data)
{
cout<<data.x<<" "<<data.y<<endl;
}
typedef Point<double> pd;
int main(void)
{
BTreeNode<pd> bt1; bt1.make();
BTreeNode<pd> bt2; bt2.make();
BTreeNode<pd> bt3; bt3.make();
BTreeNode<pd> bt4; bt4.make();
bt1.SetData(pd(1,10));
bt2.SetData(pd(2,20));
bt3.SetData(pd(3,30));
bt4.SetData(pd(4,40));
bt1.MakeLeftSubTree(&bt2);
bt1.MakeRightSubTree(&bt3);
bt2.MakeLeftSubTree(&bt4);
bt1.InorderTraverse(ShowIntData);
cout<<endl;
bt1.PreorderTraverse(ShowIntData);
cout<<endl;
bt1.PostorderTraverse(ShowIntData);
cout<<endl;
bt1.DeleteTree(); // Error occurred
return 0;
}
Run Code Online (Sandbox Code Playgroud)
点.h
#ifndef __T_POINT_H__
#define __T_POINT_H__
template<class T>
struct Point
{
T x;
T y;
Point() : x(0),y(0){}
Point(T x,T y) : x(x),y(y) {}
};
#endif
Run Code Online (Sandbox Code Playgroud)
树.h
#ifndef __B_TREE_H__
#define __B_TREE_H__
#include<iostream>
#include<cstdlib>
using namespace std;
template<class T>
class BTreeNode
{
private:
T data;
BTreeNode<T>* left;
BTreeNode<T>* right;
public:
typedef void VisitFuncPtr(T data);
BTreeNode();
BTreeNode<T>* make();
~BTreeNode();
T GetData();
void SetData(T data);
BTreeNode<T>* GetLeftSubTree();
BTreeNode<T>* GetRightSubTree();
void MakeLeftSubTree(BTreeNode<T>* sub);
void MakeRightSubTree(BTreeNode<T>* sub);
void DeleteTree();
void InorderTraverse(VisitFuncPtr action); //?? ??
void PreorderTraverse(VisitFuncPtr action); //?? ??
void PostorderTraverse(VisitFuncPtr action); // ?? ??
};
template<class T>
BTreeNode<T>::BTreeNode()
{
left = NULL;
right = NULL;
}
template<class T>
BTreeNode<T>::~BTreeNode()
{
cout<<"Destructor"<<endl;
}
template<class T>
BTreeNode<T>* BTreeNode<T>::make(void)
{
left = NULL;
right = NULL;
return this;
}
template<class T>
T BTreeNode<T>::GetData()
{
return data;
}
template<class T>
void BTreeNode<T>::SetData(T data)
{
this->data = data;
}
template<class T>
BTreeNode<T>* BTreeNode<T>::GetLeftSubTree()
{
return left;
}
template<class T>
BTreeNode<T>* BTreeNode<T>::GetRightSubTree()
{
return right;
}
template<class T>
void BTreeNode<T>::MakeLeftSubTree(BTreeNode<T>* sub)
{
if(this->left != NULL)
delete this->left;
this->left = sub;
}
template<class T>
void BTreeNode<T>::MakeRightSubTree(BTreeNode<T>* sub)
{
if(this->right != NULL)
delete this->right;
this->right = sub;
}
template<class T>
void BTreeNode<T>::InorderTraverse(VisitFuncPtr action)
{
if(this==NULL)
return;
left->InorderTraverse(action);
action(data);
right->InorderTraverse(action);
}
template<class T>
void BTreeNode<T>::PreorderTraverse(VisitFuncPtr action)
{
if(this==NULL)
return;
action(data);
left->PreorderTraverse(action);
right->PreorderTraverse(action);
}
template<class T>
void BTreeNode<T>::PostorderTraverse(VisitFuncPtr action)
{
if(this==NULL)
return;
left->PostorderTraverse(action);
right->PostorderTraverse(action);
action(data);
}
template<class T>
void BTreeNode<T>::DeleteTree()
{
if(this==NULL)
return;
left->DeleteTree();
right->DeleteTree();
delete this; //Error occurred
}
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2705 次 |
| 最近记录: |