广义表的两种存储表示

广义表的两种存储表示

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。

A=();
B=(e);
C=(a,(b,c,d))D=(A,B,C)=((),(e),(a,(b,c,d)));
E=((a,(a,b),((a,b),c)));  

  其中,A是一个空表,不含任何元素,其长度为0;B是一个只含有单元素e的表,其长度为1;C中有两个元素,第1个元素是单元素a,第2个元素是表元素(a,b,c),C的长度为2;D中有3个元素,其中每个元素又都是一个表;E的长度为3,E中只含有一个元素,该元素是一个表,该表中含3个元素,其中后两个元素又都是表。

  广义表有两种表示方式,即广义表的头尾链表存储表示和扩展性链表表示;两种方法的区别在于:

  1. 头尾链表存储表示:链表中有两种结点,表结点和原子结点(数据结点);表结点是表中每个元素在链表中的结点,链表中两个元素或元素相连都通过表结点;原子结点就是数据结点,它是表结点的数据域,存储某一节点内特定的元素数据;表结点有三个指针域,依次为:表头指针(标致域)、指向数据的数据域、指向下一个元素的next指针;原子结点有两个指针域,依次为:标致域和值域;图示如下,分别为表结点和原子结点:
表头指针(tag=1)数据域表尾指针(next)
标致域(tag=0)值域

在这里插入图片描述

  1. 扩展性链表表示:表结点存储的节点与头尾相同,但是原子结点(数据结点)多存储一个指向下一个数据的next指针域;从画图角度来说可以使用简单的技巧为:看两个元素之间的逗号。如果这个逗号存在两个单元素结点之间,就是用原子结点的next指针域;如果是两个子表(括号之间)之间的逗号,使用表结点的next指针域。
标致域(tag=1)数据域next域
标致域(tag=0)值域next域

在这里插入图片描述

  1. 针对同一广义表的两种存储表示
    L = (f, (b, e), ((c, d), a))
      使用头尾链表存储表示时,最上层存在三个表结点,第一个表结点值域存储一个f,第二个表结点的值域存储一个子表,第三个表结点,存储一个子表,第一个子表再存储一个子表;
      使用扩展性链表存储表示时,只需注意,第一个next指针为f发出指向子表,子表内包好(b, e);括号内的(b, e)next指针由b发出,再出来第三个next指针由子表(b, e)的next指针发出,指向子表(P, a),此处P为(c, d);最后的next指针由P发出指向a;
    两种表示法分别如下:
    在这里插入图片描述
  • 16
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值