数据结构(广义表)

广义表:
广义表的基本概念:
允许线性表中元素既可以是原子元素,也可以是另外一个表,则称这样的表为广义表。
广义表的定义是递归的,因为在描述广义表时时又用到了广义表自身的概念。广义表可以记作:LS=(a1,a2,a3,a4…an)
LS为广义表的名字,ai为广义表的元素。
当广义表为空时,称第一个元素为a1为广义表LS的表头,称其余元素组成广义表的表尾,任何一个非空广义表的表头元素可能是原子元素,也可能是表元素,但其尾元素一定是广义表。
广义表具有以下特征:
1.广义表是一种线性结构,,其长度为最外层包含的元素个数。
2.广义表中的元素可以是子表,而子表的元素还可以是子表,因此,广义表是一种多层次的结构。
3.一个广义表可以为其他广义表所共享
4.广义表可以是递归的
广义表的存储结构(链式存储)
为了区分某个链接点存储的是原子元素还是表元素,每个连接点都应该含有一个标志。因此,由三部分组成:
flag data/pointer link
其中flag为标志位,令
1 本链节点为表元素节点
flag=
0 本链接点为原子节点
广义表的这种链表类型可以描述如下:
typedef struct node {
int flag; //标志变量
union
{
int data;
struct node *pointer;
}; //第二个域定义
struct node *link;
}BSNode,*BSLinkList;
求广义表的长度
int BsListLEN(BSLinkList list)
{
BSLinkList p;
int n = 0;
p = list->pointer;
while (p != NULL)
{
n++;
p = p->link;
}
return n;
}
采用到递归方式:
int BsListLEN(BSLinkList list)
{
if (list != NULL)
return BsListLEN(list->link) + 1;//指向的节点非空
else
return 0;
}
求广义表的深度:
int BSListDepth(BSLinkList list)
{
BSLinkList Stack[M], p;
int stack[M], depth = 0, maxdep = 0,top = -1;
p = list->pointer;
if (p != NULL)
{
do
{
while (p != NULL)
{
Stack[++top] = p;
stack[top] = depth;
if (p->flag) {
depth++;
p = p->pointer;
}
else
p = NULL;
}
if (depth > maxdep)//求得最大层次数
maxdep = depth;
p = Stack[top];
depth = stack[top–];
p = p->link;

	} while (p!=NULL||top!=-1);
}
return maxdep + 1;//求得广义表的深度

}
主要应用为多元多项式的表示

你可能感兴趣的:(数据结构(广义表))