//求深度的那儿得好好推敲
#include
#include
using namespace std;
typedef char elemType;
enum NodeType
{
	HEAD,
	VALUE,
	SUB
};
struct GNode
{
	NodeType _type;
	GNode *_next;
	union
	{
		elemType _value;
		GNode *_subList;
	};
	GNode(NodeType type=HEAD,elemType value=0)
		:_type(type)
		,_next(NULL)
	{
		if(_type==VALUE)
			_value=value;
		else if(_type==SUB)
			_subList=NULL;
	}
};
class Generalizedlist
{
public:
	Generalizedlist(const elemType* str)
	{
		_head=_CreateList(str);
	}
	Generalizedlist(Generalizedlist& g)
	{
		_head=_Copy(g._head);
	}
	Generalizedlist& operator=(Generalizedlist& g)
	{
		_head=_Copy(g._head);
		return *this;
	}
	~Generalizedlist()
	{
		Clear();
	}
	void Clear()
	{
		_Clear(_head);
		_head=NULL;
	}
	void Print()
	{
		_Print(_head);
		cout<_next=sub;
				cur=cur->_next;
				sub->_subList=_CreateList(str);//递归创建子表并链接到子表节点后面
			}
			else if(*str==')')
			{
				++str;
				return head;//>>??   //递归返回条件
			}
			else if(_IsValue(*str))
			{
				GNode* node=new GNode(VALUE,*str);
				cur->_next=node;
				cur=cur->_next;
				++str;
			}
			else
			{
				++str;
			}
		}
		return head;
	}
	bool _IsValue(elemType value)
	{
		if((value>='0'&&value<='9')||(value>='A'&&value<='Z')||(value>='a'&&value<='z'))
			return true;
		else
			return false;
	}
	GNode* _Print(GNode* head)
	{
		GNode* cur=head;
		while(cur)
		{
			if(cur->_type==HEAD)
			{
				cout<<"(";
			}
			else if(cur->_type==VALUE)
			{
				cout<_value;
			    if(cur->_next!=NULL)
				{
					cout<<",";
			        }
			}
			else if(cur->_type==SUB)
			{
				_Print(cur->_subList);
				if(cur->_next!=NULL)//
				{
					cout<<",";
			        }
		        }
			cur=cur->_next;
		}
		cout<<")";
		return head;
	}
	void _Clear(GNode* head)
	{
		GNode* cur=head;
		while(cur)
		{
			if(cur->_type==HEAD||cur->_type==VALUE)
			{
			      GNode* del=cur;
			      cur=cur->_next;
			      delete del;
			}
			else//有问题
			{
				GNode* del=cur;
				cur=cur->_next;
				_Clear(del->_subList);
				delete del;
			}
		}
	}
	int _NodeSize(GNode* head)
	{
		GNode* cur=head;
		int size=0;
		while(cur)
		{
			/*if(cur->_type==HEAD||cur->_type==VALUE)
			{
				cur=cur->_next;
				size++;
			}*/
			if(cur->_type==SUB)
			{
				size+=_NodeSize(cur->_subList);
			}
			cur=cur->_next;
			size++;
		}
		return size;
	}
	int _Size(GNode* head)
	{
		int size=0;
		GNode* cur=head;
		while(cur)
		{
			if(cur->_type==VALUE)
			{
				size++;
			}
			else if(cur->_type==SUB)
			{
				size+=_Size(cur->_subList);
			}
			cur=cur->_next;
		}
		return size;
	}
	int _Depth(GNode* head)
	{
		GNode* cur=head;
		int max=1;
		int depth=0;
		while(cur)
		{
			if(cur->_type==SUB)
			{
				depth=_Depth(cur->_subList);
				depth++;
			}
			if((depth+1)>max)
			{
				max=depth;
			}
			cur=cur->_next;
		}
		return max;
	}
	GNode* _Copy(GNode* head)///////
	{
		GNode* cur=head;
		cur=cur->_next;
		GNode* newHead=new GNode(HEAD);
		GNode* newCur=newHead;
		while(cur)
		{
			if(cur->_type==VALUE)
			{
				GNode* node=new GNode(VALUE,cur->_value);
				newCur->_next=node;
			        newCur=newCur->_next;
			}
			else if(cur->_type==SUB)
			{
				GNode* node=new GNode(SUB);
				newCur->_next=node;
			        newCur=newCur->_next;
				newCur->_subList=_Copy(cur->_subList);
			}
			cur=cur->_next;
		}
		return newHead;
	}
private:
	GNode* _head;
};
void Test1()
{
	char* str1="()";
	Generalizedlist gl1(str1);
	gl1.Print();
	char* str2="(a,b)";
	Generalizedlist gl2(str2);
	gl2.Print();
	char* str3="(a,(b,c),d)";
	Generalizedlist gl3(str3);
	gl3.Print();
	char* str4="(a,b,(c,d,(e)),(f))";
	Generalizedlist gl4(str4);
	gl4.Print();
	/*gl1.Clear();
	gl1.Print();
	gl2.Clear();
	gl2.Print();
	gl3.Clear();
	gl3.Print();
	gl4.Clear();
	gl4.Print();*/
	/*cout<