6-1 写出用广义表表示法表示的树的类声明,并给出如下成员函数的实现:
(1) operator >>() 接收用广义表表示的树作为输入,建立广义表的存储表示;
(2) 复制构造函数 用另一棵树表示为广义表的树初始化一棵树;
(3) operator ==() 测试用广义表表示的两棵树是否相等;
(4) operator<< () 用广义表的形式输出一棵树;
(5) 析构函数 清除一棵用广义表表示的树。


class GenTree;
class GenTreeNode{
friend class GenTree;
private:
int utype; //标志结点
GenTreeNode* nextSibling;

union(
char RootData; //utype=0
char Childdata; //utype=1
GenTreeNode* firstChild; //utype=2
}
public:
GenTreeNode(int tp,char item):utype(tp),nextSibling(NULL)
{if(tp==0) RootData=item;else ChildData=item;}
//构造函数:构造广义表表示的树的数据结点.
GenTreeNode(GenTreeNode* son=NULL)
:utype(2),nextSibling(NULL),firstChild(son){}
//构造函数:广义表表示的树的子树结点
int nodetype(){return utype;} //返回结点数据类型
char GetData(){return data;} //返回结点的值
GenTreeNode* GetFchild(){return firstChild;}
//返回子树结点的地址
GenTreeNode* GetNsibling(){return nextSibling;}
//返回下一个兄弟结点的地址
void setInfo(char item){data=item;}
void setFchild(GenTreeNode* ptr)
{firstChild=ptr;}
void setNsibling(GenTreeNode* ptr)
{nexSibling=ptr;}
};

class GenTree{
private:
GenTreeNode *first; //根指针
char reValue; //建树时的输入停止标志
GenTreeNode *Copy(GenTreeNode * ptr);
//复制一个ptr指示的子树
void Traverse(GenListNode *ptr);
//对ptr为根的子树遍历并输出
void Remove(GenTreeNode *ptr);
//将以ptr为根的广义树结构释放
friend int Equal(GenTreeNode *s,GenTreeNode *t);
//比较以s和t为根的树是否相等.
void ConstructTree(istream&in,char& value)
//从输入流in接受用广义表表示的非空树,建立广义表的存储表示t
public:
GenTree();
GenTree(GenTree& t);
~GenTree();
friend int operator==(GenTree& t1,GenTree& t2);
//判断两棵树t1和t2是否相等
friend istream& operator >>(istream& in,GenTree& t);
//输入
friend istream& operator<< (istream& out,GenTree& t);
//输出
}

(1) oerator >>() 接收用广义表表示的树作为输入,建立广义表的存储表示

istream& operator >>(istream& in,GenTree& t){
//友元函数,从输入流对象in接受用广义表表示的树,建立广义表的存储表示t
t.ConstructTree(in,reValue);
return in;
}

void GenTree::ConstructTree(istream& in,char& value){
Stack< GenTreeNode* >st;
GenTreeNode * p,q,r;
Type ch;
cin >>value;
cin >>ch;first=q=new GenTreeNode(0,ch);
cin >>ch;if(ch=='(')st.Push(q);
cin >>ch;
while(ch!=value){
switch(ch){
case'(':p=new GenTreeNode< Type >(q);
r=st.GetTop();st.Pop();
r->nextSibling=p;
st.Push(p);
st.Push(q);
break;
case')':q->nextSibling=NULL;
st.Pop();
if(st.IsEmpty()==0)
q=st.GetTop();
else return 0;
break;
case',':break;
default:p=q;
if(isupper(ch))
q=new GenTreeNode(0,ch);
else q=new GenTreeNode(1,ch);
p->nextSibling=q;
}
cin>>ch;
}
}

先去吐血了……

Comments (0)