线性表
线性表的定义和基本操作
线性表的定义
线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n \ge 0) n(n≥0)个数据元素的有限序列,其中 n n n为表长,当 n n n为表长,当
n = 0 n=0 n=0时,该线性表为空表。
线性表的一般表示为 L = ( a 1 , a 2 , . . . , a i , a i + 1 , . . . , a n ) L=(a_{1},a_{2},...,a_{i},a_{i+1},...,a_{n}) L=(a1,a2,...,ai,ai+1,...,an)。式中, a 1 a_{1} a1是唯一的“第一个”数元素,又称表头元素; a n a_{n} an是唯一的“最后一个”元素,又称表尾元素。
除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后续。
线性表的特点:
- 表中元素的个数是有限的;
- 表中元素具有逻辑上的顺序性,在序列中个元素排序有其先后次序;
- 表中元素都是数据元素,每个元素都是单个元素;
- 表中元素的数据类型相同,每个元素占用相同大小的存储空间;
- 表中元素具有抽象性。
线性表的基本操作
- InitList(&L): 初始化表(构造一个空表)
- Length(L): 求表长(返回表 L L L的长度,即表中的数据元素个数)
- LocateElem(L, e): 按值查找(在表 L L L中查找具有给定关键字值的元素)
- GetElem(L, i): 桉位查找(获取表 L L L中第 i i i个位置上的元素值)
- ListInsert(&L, i, e): 插入操作(在表 L L L中的第 i i i个位置上插入指定元素 e e e)
- ListDelete(&L, i, &e): 删除操作(删除表 L L L中第 i i i个位置上的元素,并用 e e e返回元素的值)
- PrintList(L): 输出操作(按前后顺序输出线性表 L L L的所有元素值)
- Empty(L): 判空操作(若 L L L为空表,返回 t r u e true true,否则返回 f a l s e false false)
- DestroyList(&L): 销毁操作(清空线性表,并释放线性表 L L L所占用的内存空间)
‘
线性表的顺序定义
顺序表的定义
线性表的顺序存储又称为顺序表,是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻。
数组下标 | 顺序表 | 内存地址 |
---|---|---|
0 | a 1 a_{1} a1 | LOC{A} |
1 | a 2 a_{2} a2 | LOC{A}+sizeof(ElemType |
… | … | … |
i-1 | a i a_{i} ai | LOC{A}+(i-1) ∗ * ∗sizeof(ElemType} |
… | … | … |
n-1 | a n − 1 a_{n-1} an−1 | LOC{A}+(n-1) ∗ * ∗sizeof(ElemType} 就、吗,吗, |
线性表的顺序存储类型描述为
//静态分配
#define MaxSize 50 //定义线性表的最大长度
typedef struct{
ElemType data{MaxSize}; //顺序表的元素
int Length; //顺序表的当前长度
}SqList; //顺序表的类型定义
//动态分配
#define InitSize 100 //表长度的初始定义
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize, Length; //数组的最大容量和当前个数
}SeqList; //动态分配数组顺序表的类型定义
//初始动态分配语句
L.data = (ElemType*)malloc(sizeof(ElemType)*Initsize);
顺序表的主要特点是随机访问,即通过首地址和元素序号就可在时间 O ( 1 ) O(1) O(1)内找到指定的元素。顺序表的存储密度高,每个结点只存储数据元素。顺序表逻辑上相邻的元素物理上也相邻。
顺序表上的基本操作实现
插入操作
在顺序表 L L L的第 i i i个位置插入新元素 e e e ( 1 ≤ i ≤ L , . L e n g t h + 1 ) (1 \le i \le L,.Length+1) (1≤i≤L,.Length+1) 。若 i i i的输入不合法,则返回 f a l s e false