2.1线性表的定义和基本操作
线性表:具有相同数据类型的n(n>=0)个数据元素的有限序列。L=(a1,a2,a3,...,ai,...,an),其中a1为表头元素,an为表尾元素。除表头元素外每个元素有且仅有一个直接前驱,除表尾元素外每个元素有且仅有一个直接后继。注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系;顺序表和链表是存储结构。两者属于不同层面的概念。
线性表基本操作:
InitLsit(&L):初始化表。构造一个空的线性表。
Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
LocateElem(L,e):按值查找操作。在L中查找具有给定关键字值的元素。
GetElem(L,i):按位查找操作。获取L中第i个位置的元素的值。
ListInsert(&L,i,e):插入操作。在L中的第i个位置上插入元素e。
ListDelete(&L,i,&e):删除操作。删除L中第i个位置的元素,并用e返回删除元素的值。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L):判空操作。若L为空表,则返回true,否则返回false。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
注意:基本操作的实现取决于采用哪种存储结构。存储结构不同算法实现也不同。&表示C++的引用调用,在C语言中采用指针效果一样。
2.2线性表的顺序表示
2.2.1顺序表的定义
顺序存储:线性表为顺序存储,即逻辑上相邻的两元素在物理位置上也相邻,故又称顺序表。线性表中的任一数据元素都可以随机存取。注意:线性表中元素位序从1开始,而数组中元素下标从0开始。
顺序表占用存储空间:存储空间=表长 x sizeof(元素类型),影响存储空间的是顺序表的长度与元素的类型。
顺序表是一种随机存取的存取结构:存取方式是指读写方式。顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以很方便地访问任意一个元素,这是随机存取的概念。
数组下标 | 顺序表 | 内存地址 |
---|---|---|
0 | a1 | LOC(A) |
1 | a2 | LOC(A)+sizeof(ElemType) |
... | ... | ... |
i-1 | ai | LOC(A)+(i-1)*sizeof(ElemType) |
... | ... | ... |
n-1 | an | LOC(A)+(n-1)*sizeof(ElemType) |
... | ... | ... |
Maxsize-1 | ... | LOC(A)+(Maxsize-1)*sizeof(ElemType) |
图1 线性表的顺序存储结构
静态与动态分配:静态分配时数组大小和空间事先已经固定,一旦空间占满,再加入新的数据就会产生溢出。动态分配时存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间替代原来的空间,以实现存储数组空间扩展。注意:动态分配并非链式存储,同样属于顺序存储结构,依然采用随机存取方式,只是分配的空间大小可以在运行时动态决定。
2.2.2顺序表基本操作的实现
插入操作:(最好情况、最坏情况、平均情况)注意线性表插入算法的平均时间复杂度为O(n)。
删除操作:(最好情况、最坏情况、平均情况)注意线性表删除算法的平均时间复杂度也为O(n)。
顺序表中插入和删除操作的时间主要耗费在移动元素上,而移动元素的个数取决于插入和删除元素的位置。
按值查找(顺序查找):查找第一个元素值等于e的元素并返回其位序。注意线性表插入算法的平均时间复杂度也为O(n)。