广义表的两种存储表示
广义表(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个元素,其中后两个元素又都是表。
广义表有两种表示方式,即广义表的头尾链表存储表示和扩展性链表表示;两种方法的区别在于:
- 头尾链表存储表示:链表中有两种结点,表结点和原子结点(数据结点);表结点是表中每个元素在链表中的结点,链表中两个元素或元素相连都通过表结点;原子结点就是数据结点,它是表结点的数据域,存储某一节点内特定的元素数据;表结点有三个指针域,依次为:表头指针(标致域)、指向数据的数据域、指向下一个元素的next指针;原子结点有两个指针域,依次为:标致域和值域;图示如下,分别为表结点和原子结点:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181130190752554.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3ODk3NDM3,size_16,color_FFFFFF,t_70)
- 扩展性链表表示:表结点存储的节点与头尾相同,但是原子结点(数据结点)多存储一个指向下一个数据的next指针域;从画图角度来说可以使用简单的技巧为:看两个元素之间的逗号。如果这个逗号存在两个单元素结点之间,就是用原子结点的next指针域;如果是两个子表(括号之间)之间的逗号,使用表结点的next指针域。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181130190806877.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3ODk3NDM3,size_16,color_FFFFFF,t_70)
- 针对同一广义表的两种存储表示:
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;
两种表示法分别如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181130190823443.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3ODk3NDM3,size_16,color_FFFFFF,t_70)