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;
暂时保留智能指针与指针数组的兼容.