学习目录:
学习内容:
1.线性表
(1)定义:由n(n>=0)个数据特征相同的元素构成的有限序列,称为线性表;若线性表中元素的个数n定义为线性表的长度,当n=0时称之为空表。
(2)对于非空的线性表或线性结构,其特点是:
- 存在唯一的一个被称作“第一个”的数据元素;
- 存在唯一的一个被称作“最后一个”的数据元素;
- 除第一个元素之外,结构中的每个数据元素均只有一个前驱;
- 除最后一个元素之外,结构中的每个数据元素均只有一个后继。
(3)线性表的类型定义——ADT定义
InitList(&L)
操作结果:构造一个空的线性表L
DestroyList(&L)
初始条件:线性表L已存在
操作结果:销毁线性表L
ClearList(&L)
初始条件:线性表L已存在
操作结果:将L重置为空表
ListEmpty(L)
初始条件:线性表L已存在
操作结果:若L为空表,则返回true,否则返回 false
ListLength(L)
初始条件:线性表L已存在
操作结果:返回L中数据元素的个数
GetElem(L,i,&e)
初始条件::线性表L已存在,且1<=i<=ListLength(L)
操作结果:用e返回L中第i个数据元素的值
LocateElem(Lre)
初始条件:线性表L已存在
操作结果:返回L中第1个值与e相同的元素在L中的位置。若这样的数据元素不存在,则返回值为0
PriorElem(L,cur_e,&pre_e)
初始条件 :线性表工已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回其前驱,否则操作失败,pre_e无定义
NextElem(L,cur_e,&next_e)
初始条件 :线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败,next_e无定义
ListInsert(&L,i,e)
初始条件:线性表L已存在,且1<=i<=ListLength(L)+1。
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。
ListDelete(&L,i)
初始条件:线性表L已存在且非空,且1iListLength(I)。
操作结果 :删除L的第i个数据元素,L的长度减1
TraverseList(L)
初始条件:线性表L已存在。
操作结果:对线性表L进行遍历,在遍历过程中对L的每个节点访问一次
抽象的数据类型仅是一个模型的定义,并不涉及模型的具体实现,因此这里描述中所涉及的参数不必考虑具体数据类型。在实际应用中,数据元素可能有多种类型,到时可根据具体的需要选择使用不同的数据类型。
2.线性表的顺序表示和实现
(1)线性表的顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素,这种表示称为线性表的顺序存储结构或顺序映像。通常称这种存储结构的线性表为顺序表。其特点是:逻辑上相邻的数据元素,其物理位置也是相邻的。同时线性表的顺序存储结构是一种随机存取的存储结构。
顺序表的存储结构:
#define MAXSIZE 100 //顺序表可达到的最大长度
typedef struct
{
ElemType *elem; //存储空间的基地址
int length; //当前长度
}SqList; 顺序表的结构类型为SqList
图书数据的实例:
#define MAXSIZE 10000
typedef struct //图书信息的定义
{
char no[20]; //图书编号
char name[50]; //图书名称
float price; //图书价格
}Book;
typedef struct
{
ElemType *elem;
int length;
}SqList;
(2)顺序表中基本操作的实现:初始化、取值、查找、插入、删除