数据结构(广义表)

广义表:
广义表的基本概念:
允许线性表中元素既可以是原子元素,也可以是另外一个表,则称这样的表为广义表。
广义表的定义是递归的,因为在描述广义表时时又用到了广义表自身的概念。广义表可以记作: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;//求得广义表的深度

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值