线性表
线性表的定义
线性表(List):零个或多个数据元素的有限序列,直接前驱元素,直接后继元素。在线性表中间的数据元素,有且只有一个直接前驱元素和直接后继元素。线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时称为空表。在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
线性表的抽象数据类型
ADT 线性表
DATA | Operation |
---|---|
线性表的数据对象集合为{ a 1 a_1 a1, a 2 a_2 a2,……, a n a_n an},数据类型DataType。其中,除了第一个元素外,每个元素有且只有一个前驱元素,除了最后一个元素外,没有元素有且只有一个后继元素。数据元素之间的关系是一对一的关系 | InitList(*L):初始话操作,建立一个空的线性表 ,ListEmpty(L),ClearList(*L),GetElem(L,i,*e) |
end ADT
Tip:感觉像面向对象编程一样
线性表的顺序存储结构
指的是用一段地址连续的存储单元一次存储线性表的数据元素。所以可以用一维数组来实现顺序存储结构。顺序存储结构的三个属性:
- 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
- 线性表的最大存储容量:数组长度MaxSize。
- 线性表的当前长度:length。
数组长度与线性表长度的区别:
数组长度一般不变,线性表长度会随着数据的插入和删除操作而产生变化,不过,在任意时刻,线性表的长度应该小于等于数组的长度。
顺序存储结构的插入与删除
获取元素操作
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
Status GetElem(SqList L,int i,ElemType *e)
{
if (L.length == 0 || i < 1 || i > L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
插入操作
插入算法的思路:
- 如果插入位置不合理,抛出异常;
- 如果线性表长度大于等于数组的长度,则抛出异常或动态增加容量;
- 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
- 将要插入元素填入位置i处;
- 表长加1。
/*初始条件:顺序线性表L已存在,1 <=i <=ListLength(L)*/
/*操作结果:在L中第i个位置之前插入新的数据元素e,表长+1*/
Status ListInsert(SqList *L, int i,ElemType e)
{
int k;
if (L->length==MAXSIZE) //线性表满
{
return ERROR;
}
if (i<1 || i> L->length+1) //不在表范围