广义表(线性表的推广)

广义表的定义
广义表是线性表的推广。
广义表一般记作LS=(d0,d1,...dn-1)

其中,LS是广义表(d1,d2,...dn)的名称,n是它的长度.在线性表的定义中,ai(1<=i<=n)只限于是单个元素.而在广义表的定义中,di可以是单个元素。也可以是广义表,分别称为广义表LS的单元素和子表。习惯上,用大写字母表示广义表的名称,用小写字母表示单元素。当广义表LS非空时,称第一个元素d0为表头(Head),称其余元素组成的表(d1,d2,...dn-1)是LS的表尾(Tail)。

显然,广义表的定义是一个递归的定义,因为在描述广义表时又用到了广义表的概念。下面列举一些广义表的例子。

  1)
A=( ); A是一个空表,它的长度为0。
  2) B=( e );  广义表B只有一个单元e,B的长度为1。
  3) C=( a,(
b,c,d ) ); 广义表C的长度为2,两个元素分别为单元素a和子表( b,c,d )。
  4) D=( A,B,C );
广义表D的长度为3,三个元素都是列表。显然,将子表的值代入后,则有D=( ( ),( e ), ( a,( b,c,d ) ) )。
  5) E=(
a,E ); 这是一个递归的表,它的长度为2。E相当于一个无限的广义表E=( a,( a,( a......) )
)。

从上述定义和例子可推出广义表的三个重要结论:
  1)  广义表的元素可以是子表,而子表的元素还可以是子表,...。

  2)  广义表可为其他广义表所共享。
  3) 
广义表可以是一个递归的表,即广义表也可以是其本身的一个子表。

广义表的深度
一个广义表的深度是指该广义表展开后所含括号的层数。
例如,A=(b,c)的深度为1,B=(A,d)的深度为2,C=(f,B,h)的深度为3。

广义表的存储结构

由于广义表的元素类型不一定相同,因此,难以用顺序结构存储表中元素,通常采用链接存储方法来存储广义表中元素,并称之为广义链表。
采用链式存储结构,每个数据元素可用一个结点表示:
·
(1)表结点,用以表示子表
· (2)元素结点,用以表示单元素
第一种表示

用C语言描述结点的类型如下:

1 typedef struct node
2 {
3 int tag;
4 union{struct node *hp,*tp;
5 char data;
6 }dd;
7 }NODE;

第二种表示 :

用C语言描述结点的类型如下:

1 typedef struct node
2 {
3 int tag;
4 union{struct node *hp;
5 char data;
6 }dd;
7 struct node *tp;
8 }NODE;

广义表的递归算法
一、求广义表的深度

深度公式:
(1)maxdh(p)=0 当p->tag=1

(2)maxdh(p)=1 当空表(p->tag=1&&p->dd.sublist=NULL)

(3)maxdh(p)=max(maxdh(p1),...,maxdh(pn))+1 其余情况

其中p=(p1,p2,...,pn)

 1 int depth(NODE *p) /*求表的深度函数 */
 2 {
 3 int h,maxdh;
 4 NODE *q;
 5 if(p->tag==0) return(0);
 6 else
 7 if(p->tag==1&&p->dd.sublist==NULL) return 1;
 8 else
 9 {
10 maxdh=0;
11 while(p!=NULL)
12 {
13 if(p->tag==0) h=0;
14 else
15 {q=p->dd.sublist;
16 h=depth(q);
17 }
18 if(h>maxdh)maxdh=h;
19 p=p->link;
20 }
21 return(maxdh+1);
22 }
23 }

二、求原子结点个数
原子结点个数公式:

(1)f(p)=0 当p=NULL

(2)f(p)=1+f(p->link) 当p->tag=0

(3)f(p)=f(p->dd.sublist)+f(p->link) 当p->tag=1

 1 int count(NODE *p) /*求原子结点的个数函数 */
 2 {
 3 int m,n;
 4 if(p==NULL) return(0);
 5 else
 6 {
 7 if(p->tag==0) n=1;
 8 else
 9 n=count(p->dd.sublist);
10 if(p->link!=NULL)
11 m=count(p->link);
12 else m=0;
13 return(n+m);
14 }
15 }

三、求原子结点数据域之和

原子结点数据域之和公式:

(1)f(p)=0 当p=NULL

(2)f(p)=p->data+f(p->link) 当p->tag=0

(3)f(p)=f(p->dd.sublist)+f(p->link) 当p->tag=1

 1 int sum(NODE *p) /*求原子结点数据域之和函数 */
 2 {
 3 int m,n;
 4 if(p==NULL) return(0);
 5 else
 6 {
 7 if(p->tag==0) n=p->dd.data-’0’;
 8 else
 9 n=sum(p->dd.sublist);
10 if(p->link!=NULL)
11 m=sum(p->link);
12 else m=0;
13 return(n+m);
14 }
15 }
时间: 2025-01-31 06:38:49

广义表(线性表的推广)的相关文章

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

C#与数据结构线性表

线性表线性表是最简单也是最常用的一种数据结构.例如,英文字母表(A,B,…,Z)是一个线性表,表中的每一个英文字母是一个数据元素:又如成绩单是一个线性表,表中的每一行是一个数据元素,每个数据元素又是由学号.姓名.成绩等数据项组成.线性表是最简单的数据结构,而顺序表和链表作为线性表的两种重要存在形式,是堆栈.队列.串以及树和图等数据结构的实现基础,内容非常重要,一定要认真对待.本章将介绍线性表的定义.线性表的顺序存储结构和链式存储结构以及相关算法实现.这些存储结构在C#类库中都有相对应的集合类,本

二 线性表

一. 线性表的几种形式: 1.线性表是最常用且最简单的一种数据结构. 线性表中元素的个数n定义为线程表的长度,n= 0时称为空表. 2. 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 这种顺序存储结构的线性表为顺序表. 线性表的特点: 优点是:可以随机存取的存储结构 缺点是:插入和删除时间复杂度高,主要耗费在移动元素上. 时间复杂度O(n).      数组 3.线性表的链式表示和实现  [字典,集合] 链式表是一组任意的存储单元存储线性表的数据元素(这组存储单元可以

C# 数据结构 线性表(顺序表 链表 IList 数组)

线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. (2)线性表中的元素是有限的(List),线性表中的数据类型一致. (3)线性表表示方法 L={a1,a2,a3,a4…….an},L=(D,R) (4)每一个元素都有前驱和后继,第一个元素只有后继,最后一个元素只有前驱. 实例 例如:1-100的整数是一个线性表 {“zhangsan”, “lis

数据结构笔记--线性表(上)

2.0 线性表的定义与基本运算 线性结构 基本特点: 在* 同构 的N个数据元素的 非有限集 *中 存在唯一的一个被称作为"第一个" 的数据元素 存在唯一的一个被称作为"最后一个" 的数据元素 除第一个外,集合中的每个数据元素均只有一个直接前驱 除最后一个外,集合中的每个数据元素均只有一个直接后继 故此,有线性表如下的定义 : (a 1 ,a 2 ,a 3 ,?,a n ) 一个线性表是 n 个同构的数据元素的有限序列. 其特征如下: 元素是同构的,且不能出现缺项

简单数据结构(一)线性表

最简单的结构:线性表 先进先出的结构:队列 先进后出的结构:栈 线性表 线性表数据结构具有以下特征:   有且只有一个"首元素"   有且只有一个"末元素"   除末元素之外,其余元素均有惟一的后继元素   除首元素之外,其余元素均有惟一的前驱元素 对于线性表,主要可进行以下操作:   添加结点   插入结点   删除结点   查找结点   遍历结点   统计结点数 其中线性表也分为:顺序表 and 链表 顺序表:在计算机内,保存线性表最简单.最自然的方式,就是把表

线性表的顺序存储结构和实现

头文件 head.h #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof()

数据结构 - 线性表顺序存储结构

线性表 线性表是一种典型的线性结构.其基本特点是线性表中的数据元素是有序且是有限的.在这种结构中: ① 存在一个唯一的被称为"第一个"的数据元素: ② 存在一个唯一的被称为"最后一个"的数据元素: ③ 除第一个元素外,每个元素均有唯一一个直接前驱: ④ 除最后一个元素外,每个元素均有唯一一个直接后继. 线性表(Linear List) :是由n(n≧0)个数据元素(结点)a1,a2, -an组成的有限序列.该序列中的所有结点具有相同的数据类型. 线性表中的数据元素

【数据结构】线性表的顺序表示及实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 假设线性表的每个元素需要占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储地址.则线性表中第i+1个元素元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足关系: LOC(ai+1)=LOC(ai)+l 一般来说,线性表第i个数据元素ai的存储位置为: LOC(ai)=LOC(a1)+(i-1)*l 式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位

【数据结构】线性表&amp;&amp;顺序表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有一个前驱和一个后继.而开头元素只有后继,结尾元素只有前驱. 其次线性表是有限的,也就是里面的元素个数是有限的. 1.1 线性表的基本操作(描述) 1ADT 线性表(List) 2Data 3    线性表的数据对象集合为{a1, a2, a3, ...