复习:广义表

广义表

广义表特性

(1)广义表中的数据元素有相对次序
(2)广义表的长度定义为最外层包含元素的个数
(3)广义表的深度定义为所含括弧的重数,其中原子的深度为0,空表的深度为1
(4)广义表可以共享,一个广义表可以为其他广义表共享,这种广义表叫做再入表
(5)广义表可以是一个递归的表;一个广义表可以是自己的子表,这种广义表叫做递归表,递归表的深度是无穷的,长度是有限的
(6)任何一个非空广义表GL=(a1,a2,a3,…,an)均可分为表头head=a1和表尾tail=(a2,a3….,an)

//广义表的存储结构

typedef struct Inode
{
int tag; //节点类型标识:1 - 子表 0 - 原子
union
{
ElemType data; //原子
struct Inode *sublist; //子表
}val;
struct Inode *link; //指向下一个元素
}GLNode;

求广义表的长度

原理:在广义表中,同一层次的每个节点是通过link域连接起来的,所以可以把它看成link域连接起来的单链表
算法:求广义表长度就是第一层单链表的长度,求单链表的长度得到广义表长度

//求广义表的长度
int GLLength(GLNode *g)
{
int n=0;
g=g->val.sublist;
while(g!=NULL)
{
n++;
g=g->link;
}
return n;

}

求广义表的深度

原理:对于带头节点的广义表g,其深度等于所有子表中最大深度加1,若g为原子,其深度为0;g为空表,其深度为1.
0 —— g为原子
1 —— g为空表
max(f(subg))+1 —— g有子表

//利用递归求广义表深度
int GLDepth(GLNode *g)
{
int max=0,dep;
if(g->tag==0) //g为原子
return 0;
g=g->val.sublist;
if(g==NULL)
return 1;
while(g!=NULL)
{
if(g->tag=1)
{
dep=GLDepth(g); //递归调用
if(dep>max) //判断此子表是否为最深的子表
max=dep;
}
g=g->link; //在兄弟中找到深度最深的子表
}
return(max+1);
}

输出广义表

队子表递归式输出
//输出广义表
void DispGL(GLNode *g)
{
if(g!NULL)
{
//先处理g的元素
if(g->tag==0)
cout<val.data;
else
{
cout<<”(“;
if(g->val.sublist==NULL)
cout<<”#”;
else
DispGL(g->val.sublist);
cout<<”)”;
}
//再处理g的兄弟
if(g->link!=NULL)
{
cout<<”,”;
DispGL(g->link);
}

}       

}

建立广义表的链式存储结构

输入

猜你喜欢

转载自blog.csdn.net/weixin_38195506/article/details/80874699