【数据结构】广义表的默认成员函数、深度、大小、打印

广义表的定义:

广义表是非线性的结构,是n个元素的有限序列。

wKiom1cTUC7RB4CcAAAw4q17T88241.png

举例:A=(a,b,(c,d))


我们先定义它的结构:

(1)它有三种节点,头节点、值节点、子表节点。

(2)两种指向下一节点的指针:指向下一值值节点的指针_next,指向子表节点的指针_sublink.


enumType//用枚举形式来定义广义表中三种节点类型
{
HEAD,//头类型
VALUE,//值类型
SUB,//子表类型
};

structGeneralizednode
{
Type_type;//类型
Generalizednode*_next;//指向下一节点的指针
union
{
int_value;//一个节点下一节点可能是值节点,也可能是子表节点
Generalizednode*_sublink;
};

Generalizednode(Typetype)
:_next(NULL),_type(type)
{}

Generalizednode(Typetype,intvalue)
:_next(NULL),_type(type),_value(value)
{}
};


下面,我们来看下实现的代码

classGeneralized
{
public:
Generalized()
:_head(NULL)
{}

Generalized(constchar*str)
{
_head=_CreateList(str);//调用函数创建节点
}

Generalized(constGeneralized&gr)
{
_head=_copy(gr._head);//调用函数拷贝节点
}

Generalized&operator=(constGeneralized&gr)
{
if(&gr!=this)
{
_copy(gr._head);
_Destroy(_head);
}
return*this;
}

~Generalized()
{
_Destroy(_head);
}

voidPrint()
{
_Print(_head);
}

size_tSize()
{
return_Size(_head);
}

size_tDepth()
{
return_Depth(_head);
}

protected:
//拷贝广义表
Generalizednode*_copy(Generalizednode*grhead)
{
Generalizednode*grcur=grhead;

Generalizednode*newHead=newGeneralizednode(HEAD);
Generalizednode*newcur=newHead;

while(grcur)
{
if(grcur->_type==VALUE)
{
Generalizednode*tmp=newGeneralizednode(VALUE);
newcur->_next=tmp;
newcur=newcur->_next;
newcur->_value=grcur->_value;
}

elseif(grcur->_type==SUB)
{
Generalizednode*tmp=newGeneralizednode(SUB);
newcur->_next=tmp;
newcur=newcur->_next;
newcur->_sublink=_copy(grcur->_sublink);
}
grcur=grcur->_next;
}
newcur=NULL;
returnnewHead;
}

//释放广义表
void_Destroy(Generalizednode*head)
{
Generalizednode*cur=head;
while(cur)
{
Generalizednode*del=cur;
cur=cur->_next;
if(del->_type==SUB)
{
_Destroy(del->_sublink);
}
else
{
deletedel;
del=NULL;
}
}
}

//打印
void_Print(Generalizednode*head)
{
Generalizednode*cur=head;
while(cur)
{
if(cur->_type==HEAD)
{
cout<<"(";
}
elseif(cur->_type==VALUE)
{
cout<<(char)(cur->_value);
if(cur->_next)
{
cout<<",";
}
}
elseif(cur->_type==SUB)
{
_Print(cur->_sublink);
if(cur->_next)
{
cout<<",";
}
}
cur=cur->_next;
}
cout<<")";
}

//判断是否是值
bool_IsValue(constchar*str)
{
if(*str>0&&*str<9
||*str>'a'&&*str<'z'
||*str>'A'&&*str<'Z')
{
returntrue;
}
else
{
returnfalse;
}
}

//创建节点
Generalizednode*_CreateList(constchar*str)
{
assert(*str=='(');
++str;
Generalizednode*head=newGeneralizednode(HEAD);
Generalizednode*cur=head;
while(cur)
{
if(_IsValue(str))
{
cur->_next=newGeneralizednode(VALUE,*str);
cur=cur->_next;
str++;
}
elseif(*str=='(')
{
Generalizednode*SubNode=newGeneralizednode(SUB);
cur->_next=SubNode;
cur=cur->_next;
SubNode->_sublink=_CreateList(str);
str++;
}
elseif(*str==')')
{
str++;
returnhead;
}
else
{
str++;
}
}
cout<<"广义表出错!"<<endl;
assert(false);
returnhead;
}

//大小(值节点数)
size_t_Size(Generalizednode*head)
{
Generalizednode*cur=head;
size_tsize=0;
while(cur)
{
if(cur->_type==VALUE)
{
size++;
}
elseif(cur->_type==SUB)
{
size+=_Size(cur->_sublink);
}
cur=cur->_next;
}
returnsize;
}

//深度
size_t_Depth(Generalizednode*head)
{
size_tdepth=1;
Generalizednode*cur=head;
while(cur)
{
if(cur->_type==SUB)
{
size_tcurdepth=_Depth(cur->_sublink);

if(curdepth+1>depth)
{
depth=curdepth+1;
}
}
cur=cur->_next;
}
returndepth;
}

private:
Generalizednode*_head;
};

voidtest()
{
Generalizedgr1("()");
Generalizedgr2("(a,d))");
Generalizedgr3("(a,(d),e))");
Generalizedgr4(gr3);
gr1.Print();
cout<<endl;
gr2.Print();
cout<<endl;

gr3.Print();
cout<<endl;

gr4.Print();
cout<<endl;

size_tsize=gr4.Size();
cout<<"gr4大小:"<<size<<endl;
intdepth=gr4.Depth();
cout<<"gr4深度:"<<depth<<endl;
}

intmain()
{
test();
system("pause");
return0;
}

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...