考研数据结构笔记(2)线性表
线性结构的基本特点是除第一个元素无直接后继之外,其他每个数据元素都有一个前驱和后继
一、线性表的定义和特点
1.定义
存在有序序列例如a,b,c…,z这样由n个数据特效相同的元素构成的有限序列称为线性表(n=0时称为空表)
2.特点
存在唯一的首末元素,除第一个元素以外每个数据元素均只有一个前驱,除最后一个数据元素以外,结构中的每个数据元素均只有一个后继。
二、线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,也称作线性表的顺序存储结构。其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。(这一点与单链表常做比较)
1. 基本操作的实现
首先说明下顺序表的存储结构:
#define MAXSIZE 100 //定义顺序表可能达到的最大长度
typedef struct
{
ElemType *elem; //存储空间的基地址
int length; //顺序表长度
}SqList; //表明结构类型
a. 查找
查找操作是:
根据指定的元素值e, 查找顺序表中第1个与e相等的元素。若查找成功,则返 回该元素在表中的位置序号;若查找失败,则返回0。
课本代码范例:
int LocateELem(SqList L,ElemType e){
//在顺序表1中查找值为e的数据元素, 返回其序号
for(i=O;i< L.length;i++)
If(L.elem[i)==e)
return i+l; //查找成功, 返回序号i+l
return O; //查找失败, 返回 0
}
算法时间复杂度分析:
当在顺序表中查找一个数据元素时,其时间主要耗费在数据的比较上,而比较的次数取决千 被查元素在线性表中的位置。这里取算法的平均时间复杂度,查找n个元素的查询次数和为n*(n+1)/2,故最后得出平均值为(n+1)/2,所以查找算法的平均时间复杂度为O(n)。
b. 插入
步骤
- 判断插入位置i是否合法,若不合法(也就是i超过了顺便表的范围)则返回 ERROR。
- 判断顺序表的存储空间是否已满,若满见肤返回 ERROR。
- 将第n个至第l个位置的元素依次向后移动一个位置,空出第l个位置(i=n+1时无需移动)。
- 将要插入的新元素e放入第i个位置。5)表长加1。
课本的代码范例:
Status Listinsert(SqList &L,int i ,ElemType e) {
//在顺序表L 中第 l.个位置之前插入新的元素e, i值的合法范围是 1<=i<=L.length+l
if((i<l) 11 (i>L.length+l))
return ERROR; //i值不合法
if(L.length==MAXSIZE)
return ERROR; //当前存储空间已满
for (j=L. length-1; j>=i-1; j--)
L.elem[j+l]=L.elem[j]; //插入位置及之后的元素后移
L.elem[i-l)=e; ///将新元素e放入第l个位置
++L.length; //表长加1
return OK;
}
算法时间复杂度分析
当在顺序表中某个位置上插入一个数据元素时, 其时间主要耗费在移动元素上, 而移动元素的个数取决于插入元素的位置。
在表头插入一个元素需要移动n个元素,在第一个元素后插入一个元素,需要移动n-1个元素,依次类推,直到在表尾插入一个元素,需要移动0个元素。整个过程中需要移动元素个数之和为n(n+1)/2,插入次数为n+1次,故最后得平均需要移动元素个数为二者相除,即n/2次,因此,得插入算法平均时间复杂度为O(n)。
c. 删除
线性表的删除操作是指:
线性表的删除操作是指:将表的第i个元素删去,将长度为n的线性表变成长度为n-1 的线性表,数据元素a-1、 a和 a+1之间的逻辑关系发生了变化,为了在存储结构上反映这个变化,同样需要移动元素。也就是将删除元素的后面元素依次向前移动一个位置。
步骤
- 判断插入位置i是否合法,若不合法(也就是i超过了顺便表的范围)则返回 ERROR。
- 将第i个至第n个的元素依次向前移动一个位置 (i= n时无需移动)。
- 表长减 1。
课本代码范例
Status ListDelete(SqList &L,int i) {
<