严蔚敏视频 笔记03
线性结构 数据元素的有序集
线性结构的基本特征:
集合中必存在唯一一个“第一元素”
集合中必存在唯一一个“最后元素”
除最后元素外均有唯一的后继
除第一元素外均有唯一的前驱
2.1 线性表的类型定义
ADT List {
数据对象:
D={ai|ai∈ElemSet,i=1,2,...n,n>=0}
{称n为线性表的表长,n=0时的线性表为空表}
数据关系:
R1={<ai-1,ai>|ai-1,ai∈D,i=2,...n}
{设线性表为(a1,a2,...an),称i为ai在线性表中的位序}
基本操作:
{结构初始化}
InitList(&L)
操作结果:构造一个空的线性表L
{销毁结构}
DestroyList(&L)
初始条件:线性表L已存在
操作结果:销毁线性表L
{引用型操作}
操作结果不改变原来
ListEmpty(L)
初始条件:线性表L已存在
操作结果:若L为空表,则返回TRUE,否则返回FALSE
ListLength(L)
初始条件:线性表L已存在
操作结果:返回L中元素个数
PriorElem(L,cur_e,&pre_e)
初始条件:线性表L已存在
操作结果:若cur_e是L的元素,但不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
NextElem(L,cur_e,&next_e)
初始条件:线性表L已存在
操作结果:若cur_e是L的元素,但不是最后一个,则用next_e返回它的前驱,否则操作失败,next_e无定义
GetElem(L,i,&e)
初始条件:线性表L已存在,1<=i<=LengthList(L)
操作结果:用e返回L中第i个元素的值
LocateElem(L,e,compare())
初始条件:线性表L已存在,compare()时元素判定函数
操作结果:返回L中第一个与e满足关系compare()的元素的位序,若这样的元素不存在,则返回值为0
ListTraverse(L,visit())
初始条件:线性表L已存在
操作结果:依次对L的每个元素调用函数visit(),一旦visit()失败,则操作失败
{加工型操作}
ClearList(&L)
初始条件:线性表L已存在
操作结果:将L重置为空表
PutElem(L,i,&e)
初始条件:线性表L已存在,1<=i<=LengthList(L)
操作结果:L中第i个元素赋值同e的值
ListInsert(&L,i,e)
初始条件:线性表L已存在,1<=i<=LengthList(L)+1
操作结果:在L的第i个元素之前插入新的元素e,L的长度增1
ListDelete(&L,i,&e)
初始条件:线性表L已存在且非空,1<=i<=LengthList(L)
操作结果:删除L的第i个元素,并用e返回其值,L的长度减1
}
例1
假设有两个集合A、B分别用两个线性表LA和LB表示(即线性表中的数据元素即为集合中的成员)
现要求一个新的集合A=A∪B
例2
已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素
例3
归并两个“其数据元素按值非递减有序排列”的线性表LA和LB,求得线性表LC也具有同样特性
2.2 线性表类型的实现 ——顺序映象
用一组地址连续的存储单元依次存放线性表中的数据元素
起始地址 基地址
LOC(ai)=LOC(a1)+(i-1)*C
顺序映象的C语言描述
#define LIST_INIT_SIZE 80 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;
顺序表