广义表及本章小结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 .广义表的同层结点链存储结构 在这种结构中,无论是单元素结点还是子表结点均由三个域构成。其结点结 构如下图所示。
tag=1 hp tp
表结点
tag=0 atom tp
原子结点
广义表的同层结点链结点结构
广义表 A、 B、 C、 D 的扩展线性链表存储结构如下图所示。
D 1 ∧∧
A
1
∧
0a
1
∧
B
1
第 5 讲 广义表及本章小结——教学讲义 广义表,也是线性表的一种推广。它被广泛的应用于人工智能等领域的表处 理语言 LISP 语言中。在 LISP 语言中,广义表是一种最基本的数据结构,LISP 语言 编写的程序也表示为一系列的广义表。
一、 广义表的概念
在第 2 章中,线性表被定义为一个有限的序列( a1 ,a2 ,a3 ,…, an),其中 ai 被限定 为是单个数据元素。广义表也是 n 个数据元素( d1 ,d2 ,d3 ,…, dn)的有限序列,但不 同的是,广义表中的 di 既可以是单个元素,还可以是一个广义表,通常记做: GL =( d1 ,d2 ,d3 ,…, dn)。 GL 是广义表的名字,通常广义表的名字用大写字母表示。 n 是广义表长度。若其中 di 是一个广义表,则称 di 是广义表 GL 的子表。在广义表 GL 中,d1 是广义表表头,而广义表 GL 其余部分组成的表( d2 ,d3 ,…, dn)称为广义表 表尾。由此可见广义表的定义是递归定义的,因为在定义广义表时又使用了广义 表的概念。下面给出一些广义表的例子,以加深对广义表概念的理解。 D=() 空表;其长度为零。 A=(a,(b,c)) 表长度为 2 的广义表,其中第一个元素是单个数据 a,
A[i][j] f B[K]
实现了原二维矩阵到压缩存储后的一维数组的存储映射。 ②非零元素很少的稀疏矩阵,只存非零元素所在的行号、列号、元素值来实现压缩存储。
压缩存储既可采用三元组表顺序存储结构,也可采用十字链表的链式存储结构。 ( 3 )广义表 ①广义表是 n 个数据元素( d1 ,d2 ,d3 ,…, dn)的有限序列,其中 di 既可以是单个元素,也可
第二个元素是一个子表(b,c)。 B=(A,A,D) 长度为 3 的广义表,其前两个元素为表 A,第三个元素
为空表 D。 C=(a,C) 长度为 2 递归定义的广义表,C 相当于无穷表 C=(a,(a,
(a,(…))))。 其中,A、B、C、D 是广义表的名字。 下面以广义表 A 为例,说明求表头、表尾的操作。 head( A)= a;表 A 的表头是: a tail( A)=(( b,c));表 A 的表尾是(( b,c))。广义表的表尾一定是一个表。 从上面的例子可以看出: ( 1 )广义表的元素可以是子表,而子表还可以是子表……,因此,广义表是一个 多层的结构。 ( 2 )广义表可以被其他广义表共享。如广义表 B 就共享表 A。在表 B 中不必 列出表 A 的内容,只要通过子表的名称就可以引用该表。 ( 3 )广义表具有递归性,如广义表 C。
以是一个广义表。广义表的定义具有递归性,其常用操作通常采用递归实现。 ②一个非空的广义表 GL 可以看成是由表头和表尾构成。表中的第一个元素称为 GL 的
表头,而表中除表头以外的其余元素构成的表称为 GL 的表尾。 ③广义表常用的存储方式有:头尾链表存储结构和同层结点链存储结构。
tag=1 hp tp
tag=0 atom
表结点
原子结点
广义表的头尾链表结点结构
广义表的头尾链表存储结构类型定义如下:
typedef enum {ATOM, LIST} ElemTag; /* ATOM=0,表示原子;LIST=1,
表示子表*/
typedef struct GLNode
{ ElemTag tag;
{
AtomType
atom;
struct GLNode * hp; /*表头指针域*/
} atom_hp;
/* atom_hp 是原子结点的值域 atom 和
表结点的表头指针域 hp 的联合体域*/
struct GLNode * tp;
/*同层下一个结点的指针域*/
ห้องสมุดไป่ตู้
} GLNode,*GList;
三、本章小结
∧
0b
0 c∧
1
1
C
1
∧
1 ∧∧
0a
1
∧
广义表的同层结点链存储结构
广义表的同层结点链存储结构类型定义如下:
typedef enum {ATOM,LIST} ElemTag; /* ATOM=0,表示原子;LIST=1,表
示子表*/
typedef struct GLNode
{
ElemTag tag;
union
二、 广义表的存储结构
由于广义表 GL=( d1 ,d2 ,d3 ,…, dn)中的数据元素既可以是单个元素,也可以是 子表,因此对于广义表来说,难以用顺序存储结构来表示它,通常用链式存储结构 来表示。
1 .广义表的头尾链表存储结构 广义表中的每个元素用一个结点来表示,表中有两类结点:一类是单个元素结 点,另一类是子表结点。任何一个非空的广义表都可以将其分解成表头和表尾两 部分,反之,一对确定的表头和表尾可以惟一地确定一个广义表。因此,一个表结点 可由三个域构成:标志域、指向表头的指针域和指向表尾的指针域,而元素结点只 需要两个域:标志域和值域,其结点结构如下图所示。
表结点的指针域 htp 的联合体域*/
} GLNode,*GList;
前面提到的广义表 A、B、C、D 的存储结构如下图所示:
D∧
0a A
1
0b 1 1
0c
1
∧
B 1
C 1
0a
1
1
∧
1 ∧∧
广义表 A、B、C、D 的头尾链表存储结构
在这种存储结构中,能够很清楚地分清单元素和子表所在的层次,在某种程度 上给广义表的操作带来了方便。
/*标志位 tag 用来区别原子结点和表结点
*/
union
{ AtomType
atom;
/*原子结点的值域 atom*/
struct { struct GLNode * hp, *tp;} htp; /*表结点的指针域 htp, 包括
表头指针域 hp 和表尾指针
域 tp*/
} atom_htp;
/* atom_htp 是原子结点的值域 atom 和
主要知识点
( 1 )数组的基本知识点 ① n 维数组可以看成是这样一个线性表,其中每个数据元素均是一个 n -1 维数组。 ②数组是一组有固定个数的元素的集合。给出数组的维数和每一维的上下限,数组中的 元素个数就固定。 ③数组采用顺序存储结构,其主要操作是随机存取,即数据元素的定位,给定元素的下标, 得到该元素在计算机中的存放位置。 ( 2 )特殊矩阵的压缩存储 特殊矩阵的特殊性表现在: ①元素分布有规律(对称、带状)的矩阵,只需找到对应规律的数学函数,将二维矩阵 A 中 元素 ai j 的下标作为转换函数 f 的自变量,计算出到一维内存空间的地址值 K,即