在绪论中,我们介绍了数据结构三要素, 第1章中,讲解了逻辑结构分类中线性结构的第一个部分——一般线性表,第2章讲述了逻辑结构线性结构的第二个部分——受限的线性表。本章开始讲解线性结构的最后一个部分——线性表推广。这里回顾下逻辑结构的分类,如下图所示:
前几章讨论的线性结构中的数据元素都是非结构的原子类型,元素的值是不可再分的,而本章所讲述的线性表的推广则是表中的数据元素本身也是一个数据结构,常见的形式一般有两种——数组和广义表。
一.数组
1.1定义
数组概念有双重含义,一是数据类型,二是实体(entity)。C语言标准中规定,一个数组类型描述了连续分配的非空的具有特定元素对象类型的对象集合。这些元素对象的类型称为元素类型。数组类型由元素类型与元素的数目确定。
数组名作为数组实体的标识符,具有特殊性,不同于整型、浮点型、指针型或结构类型等变量标识符。这是因为数组是一组元素的聚集,不能把一个聚集看作一个值直接读出(即右值),也不能把一个聚集看作一个地址直接赋值(即左值)。因此,数组名作为左值、右值,在C语言标准中都有特殊规定:
作为sizeof的操作数,数组名代表数组对象本身;
作为取地址运算符&的操作数,数组名代表数组对象本身;
作为字符串字面量用于初始化一个数组;
其他情形,表达式中的数组名从数组类型被转化为指向数组首元素的指针类型表达式(右值)。
1.2基本操作
InitArray(&A) //初始化数组A
DestroyArray(&A) //销毁数组A
二.广义表
2.1定义
广义表又称为列表,是一种非线性的数据结构,广义表中放松对表元素的原子限制,容许它们具有其自身结构。
2.2基本操作
InitGList(&L) //初始化广义表,创建一个空的广义表
DestroyGList(&L) //销毁广义表
GListLength(L) //求广义表的长度
GListDepth(L) //求广义表的深度