1.1线性表的定义
线性表:零个或多个数据元素的有限序列。
注:
(1)它是一个序列。元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。
(2)有限。元素个数是有限的。
将线性表记为
由图可以看到,是
的直接前驱元素,
是
的直接后继元素。
线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。
若 是第一个元素,
是最后一个,第i个元素是
,i叫做
线性表中的位序。
在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
1.2线性表的抽象数据类型
线性表的操作:创建和初始化、重置为空表、根据位序得到数据元素、查找、表长、插入删除数据。
抽象数据类型定义:
ADT 线性表(List)
Data
线性表的数据集合为,每个元素类型均为DataType。其中,除了
,其他元素都有且仅有一个直接前驱,除了
,其他元素都有且仅有一个直接后继。数据元素之间的关系是一对一的关系。
Operation
InitList(*L); 初始化操作,建立一个空的线性表L
ListEmpty(L); 若线性表为空,返回true,否则返回false
ClearList(*L); 线性表清空
GetElem(L, i, *e); 将线性表L的第i个位置元素值返回给e
LocateElem(L, e); 在线性表L中查找与e相等的元素,查找成功,返回表中序列,否则返回0
ListInsert(*L, i, e); 在线性表L中的第i个位置插入元素e
ListDelete(*L, i, e); 删除线性表L中第i个位置的元素,并用e返回其值
ListLength(L); 返回线性表L中的元素个数
endADT
例:实现线性表集合A和B的并集操作。
思路:把存在在B集合但不存在在A集合的元素插入到A中,循环集合B,判断元素是否存在在A集合中,不存在则插入。
void union(SqList *La, SqList Lb)
{
int La_len, Lb_len, i;
ElemType e; /*声明与La和Lb相同的数据元素e*/
La_len = ListLength(*La); /*求线性表的长度*/
Lb_len = ListLength(Lb);
for(i = 1; i <= Lb_len; i++)
{
GetElem(Lb, i &e); /*取Lb中第i个数据元素赋给e*/
if(!LocateElem(*La, e)) /*La中不存在和e相同的数据元素*/
ListInsert(La, ++La_len, e); /*插入*/
}
}
注:
当传递一个参数给函数时,这个参数会不会在函数内被改动决定了使用什么参数形式。
如果需要被改动,则需要传递指向这个参数的指针。
如果不需要被改动,可以直接传递这个参数。
1.3线性表的顺序存储结构
1.3.1顺序存储定义
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序存储示意图:
1.3.2顺序存储方式
顺序存储结构将一片连续空间占了,将相同数据类型的数据元素依次存放在这块空间。使用一维数组来实现顺序存储结构,即第一个元素存放在下标为0的位置(起始位置),然后依次存放。
这个数组的长度就是顺序存储的最大容量,线性表长度不能超过最大存储容量。
顺序存储结构代码:</