Tree & SmartPtr
没有命名冲突后,考虑是否要去掉库前缀.
本来想重写泛化N叉树,再派生出泛化二叉树.考虑到效率而且常用性,暂时不重写N叉树.
:第一季tree实现的更改版本
/**//* tree.h :base::adt::tree */
#ifndef TREE__
#define TREE__
#include "base.h"
#include "ptr.h"
namespace adt
{
using code::ptr;
template<typename VType>
class tree:/**//* Adt:Generalization binary tree */public base::adt
{
private:
int i;
typedef struct VNode
{
private:
int empty(ptr<VNode>& tree_)
{
if(tree_.isNull())
return 1;
empty(tree_().lChild);
empty(tree_().rChild);
tree_.free();
return 1;
}
public:
VType elem;
ptr<VNode> lChild;
ptr<VNode> rChild;
ptr<VNode> parent;
int extend_lChild(ptr<VNode>& lChild_=0)
{
if(lChild_.isNull())
{
lChild=new VType;
}
else
{
lChild=lChild_;
}
lChild().parent=this;
return 1;
}
int extend_rChild(ptr<VNode>& rChild_=0)
{
if(rChild_.isNull())
{
rChild=new VType;
}
else
{
rChild=rChild_;
}
rChild().parent=this;
return 1;
}
int set_value(VType& value_)
{
elem=value_;
return 1;
}
int empty_lTree()
{
empty(lChild());
return 1;
}
int empty_rTree()
{
empty(rChild());
return 1;
}
};
public:
ptr<VNode>/**//*tree root.*/ root;
int/**//*node number*/ n;
ptr<VNode> /**//* op position */pos;
tree()
{
root=new VNode;
n=1;
pos=root;
}
tree(tree & tree_)
{
*this=tree_;
}
virtual ~tree()
{
;
}
int copyFrom_(ptr<VNode> & subTree_,ptr<VNode> & newTree)
{
if(subTree_.isNull())
return 0;
if(newTree.isNull())
newTree=new VNode;
newTree().set_value(subTree_().elem);
copyFrom_(subTree_().lChild,newTree().lChild);
copyFrom_(subTree_().rChild,newTree().rChild);
return 1;
}
int operator = (tree & tree_)
{
copyFrom_(tree_.root,root);
n=tree_.n;
pos=tree_.pos;
return 1;
}
int set(VType value_)
{
pos().set_value(value_);
return 1;
}
int setLeft(VType value_)
{
if(pos().lChild.isNull()){
pos().lChild=new VNode;
++n;
}
pos().lChild().set_value(value_);
return 1;
}
int setRight(VType value_)
{
if(pos().rChild.isNull()){
pos().rChild=new VNode;
++n;
}
pos().rChild().set_value(value_);
return 1;
}
int goLeft()
{
if(pos().lChild.isNull()){
pos().lChild=new VNode;
++n;
}
pos=pos().lChild;
return 1;
}
int goLeft(VType value_)
{
goLeft();
pos().set_value(value_);
return 1;
}
int goRight()
{
if(pos().rChild.isNull()){
pos().rChild=new VNode;
++n;
}
pos=pos().rChild;
return 1;
}
int goRight(VType value_)
{
goRight();
pos().set_value(value_);
return 1;
}
int goParent()
{
if(pos().parent.isNull()){
pos().parent=new VNode;
++n;
}
pos=pos().parent;
return 1;
}
int goParent(VType value_)
{
goParent();
pos().set_value(value_);
return 1;
}
int go(int i,VType value_)
{
if(i==0)
{
goLeft(value_);
}else if(i==1)
{
goRight(value_);
}else if(i==2)
{
goParent(value_);
}
return 1;
}
int go(int i)
{
if(i==0)
{
goLeft();
}else if(i==1)
{
goRight();
}else if(i==2)
{
goParent();
}
}
int preOrder(ptr<VNode> &subTree_,VType * list)
{
if(subTree_.isNull())
return 1;
static int i=0;
list[i]=subTree_().elem;
++i;
preOrder(subTree_().lChild,list);
preOrder(subTree_().rChild,list);
return 1;
}
int inOrder(ptr<VNode> &subTree_,VType * list)
{
if(subTree_.isNull())
return 1;
inOrder(subTree_().lChild,list);
list[i]=subTree_().elem;
++i;
inOrder(subTree_().rChild,list);
return 1;
}
int postOrder(ptr<VNode> &subTree_,VType * list)
{
if(subTree_.isNull())
return 1;
postOrder(subTree_().lChild,list);
postOrder(subTree_().rChild,list);
list[i]=subTree_().elem;
++i;
return 1;
}
int travel(VType* list,int select=0)
{
i=0;
if(select==0)
preOrder(root,list);
else if(select==1)
inOrder(root,list);
else if(select==2)
postOrder(root,list);
return 1;
}
};
}
#endif
code.ptr
ptr<VType> 的用法:
ptr<Type> pValue = new Type[5];
set(pValue[1]);
pValue().rebirth();//第一个()用于暂时解开智能指针外壳.
SmartPtr的实现:
0 同时支持数组及单指针的功能.
1 当要调用智能指针内实体类型的方法时,可以用重载的 ( ) 直接 返回指针的值,方便调用方法.如果是数组,则用[ ].
2 引用计数,不会出现挂空.
3 删除了之前智能指针可以指向常量地址并且自动检(提高速度
/**//* ptr.h :base::code::ptr */
#ifndef PTR__
#define PTR__
#pragma warning (disable: 4244)
#include "base.h"
#ifdef PTR__CONST__
#include "runtime.h"
#endif
namespace code
{
template<typename VType,int VType_=0>
class ptr:public base::code
{
private:
VType * obj;
int *refCount;
public:
ptr()
{
obj=0;
refCount=0;
}
ptr(VType * _obj)
{
if(_obj)
{
refCount=new int(1);
obj=_obj;
}else
{
obj=0;
refCount=0;
}
}
ptr( ptr<VType> * _ptr)
{
if(_ptr.isNull())
{
obj=0;
refCount=0;
return;
}else
{
obj=_ptr.obj;
refCount=_ptr.refCount;
up();
}
}
void reset()
{
if(obj&&refCount)
*refCount=0;
}
void up()
{
if(obj&&refCount)
++*refCount;
}
void down()
{
if(obj&&refCount)
{
--*refCount;
if(*refCount==0)
{
delete obj;
delete refCount;
}
obj=0;
refCount=0;
}
}
VType *const adr()
{
return obj;
}
VType& operator () ()
{
if(!refCount)
{
#ifdef TEST_OPEN
TEST_THROW("Exception in ptr.h ptr:operator () function.")
#endif
}
return *obj;
}
VType& operator [](int i)
{
return obj[i];
}
ptr& operator = ( ptr<VType> * _ptr)
{
if(obj==_ptr.obj)return;
down();
if(!_ptr.isNull())
{
obj=_ptr.obj;
refCount=_ptr.refCount;
up();
}
return *this;
}
ptr& operator = ( VType * _ptr)
{
if(obj==_ptr)return *this;
down();
if(_ptr)
{
obj=_ptr;
refCount=new int(1);
}
return *this;
}
ptr& operator = ( VType elem)
{
down();
obj=new VType(elem);
refCount=new int(1);
return *this;
}
int isNull()
{
if(!obj)
return 1;
else
return 0;
}
~ptr()
{
down();
}
};
}
#endif
另一个case:
string buf[20];
using namespace adt;
using code::ptr;
ptr<tree<string>,1> natGramList=new tree<string>[3];
natGramList[0].set("[Expression]");
natGramList[0].setLeft("[LeftExpression]");
natGramList[0].setRight("[Op]");
natGramList[0].goLeft();
natGramList[0].setLeft("[LeftExpression]");
natGramList[0].setRight("[Right]");
natGramList[1].set("+");
natGramList[1].setLeft("1");
natGramList[1].setRight("2");
natGramList[0].travel(buf,1);//参数0,1,2代表前序,中序,后序遍历
for(int i=0;i!=natGramList[0].n;i++)
cout<<buf[i];
cout<<endl;
natGramList[1].travel(&buf[10],1);
for(int i=0;i!=natGramList[1].n;i++)
cout<<buf[i+10];
cout<<endl;
暂时保留智能指针与指针数组的兼容.