1.1线性表定义:
线性表是一种线性结构,它是由零个或n个****数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。
L=(a1,a2,a3,a4…an)
表头元素:a1
表尾元素:an
特点
- 个数有限
- 有逻辑顺序,元素有先后顺序
- 都是数据元素,单个元素
- 每个数据类型相同,所占空间大小相同
1.2线性表的顺序定义
顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构。
特点
- 逻辑上相邻的数据元素,在物理存储上也是相邻的
- 存储密度高
- 随机存储
- 不便于插入和删除操作
—————————————————————————————————————————— - 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
- 线性表的最大存储容量:数组长度MaxSize.
- 线性表的当前长度:length
- 数组长度:数组的长度是存放线性表的存储空间的长度存储分配后这个量是一般是不变的。
- 线性表长度:线性表长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
下标0到n-1,A[0]称为第1个元素,A[1]称为第2个元素,……,A[n-1]称为第n个元素
插入操作
//插入 以下标为准则插入
void Insert (SqList &L,int i,ElemType e)
{
if(i<1||i>L.len+1){ return;}//超过线性表里元素个数的+1个,因为要连续,不能空着
if(L.len>=SIZE){ return;}//线性表里的元素大于或者等于数组长度
for(int j=L.len;j>=i;j--){//j为下标的最后一位值,i-1为插入位置--》插入第四个就是下标a3的位置
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.len++;
}
线性表插入算法时间复杂度为O(n)
删除操作
void Del(SqList &L,int i,ElemType &e){
if(i<1 || i>L.len){
return;
}
if(IsEmpty(L)){//判空
return;
}
e=L.data[i-1]
for(int j=i;j<=L.len-1;j++){
L.data[j-1]=L.data[j];
}
--L.len;
}
线性表删除算法时间复杂度为O(n)
按值查找
查找第一个值为e的,然后返回
int LocateElem(SqList L,ElemType e)
{
for(int i=1;i<L.len;i++)
{
if(L.data[i]==e)
{
return i+1;
}
return 0;
}
线性表查找 算法时间复杂度为O(n)
1.3线性表的链式表示
物理存储结构上不一定连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
非随机存取(不能直接查找某节点,需要从头遍历)
增加删除元素只需要移动指针
data为数据域,存放数据
next为指针域,存放后继节点的地址
typedef struct LNode{//定义单链表结点类型
SDataType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;
空表:
头指针始终指向链表的第一个节点,而头节点是带头结点的链表的第一个节点
头节点通常不储存东西