1.线性表
2.顺序表
概念
结构
问题:
1.中间/头部的插入删除,时间复杂度为O(N)
2.增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3.增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。
思考:
如何解决以上的问题?下面我们给出了链表的结构看看。
线性表的顺序存储
顺序存储的线性表的特点:
- 线性表的逻辑顺序与物理顺序一致;
- 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
顺序表的线性存储示意图:
C语言定义线性表的顺序存储结构:
typedef int DataType;
#define MAX_SIZE 100
struct SeqList{
DataType _array[MAX_SIZE];//用来存储顺序表中的元素(最多的个数)
int _size; //顺序表中有效元素的个数
};
//动态顺序表:元素个数不受限【主要的*****】
typedef int DataType;
typedef struct SeqList{
DataType* _array;
int _capacity;//顺序表总大小
int _size;//顺序表中有效元素的个数
}SeqList, *PSeq;
DataType是数据元素类型,可以根据需要定义,可以使用SeqList定义数据表类型变量,使用*PSeq定义数据表指针变量;
顺序表的基本操作
(1)顺序表的初始化
顺序表的初始化就是把顺序表初始化为空的顺序表;只需把顺序表的长度size置为0即可;
void SeqListInit(PSeq ps, int capacity){
ps->_array = (DataType*)malloc(sizeof(DataType)*capacity);
if (NULL == ps->_array){ //必须判空
assert(0);
return;
}
ps->_capacity = capacity;
ps->_size = 0;
}
(2)插入和删除操作(尾插、尾删、头插、头删)
void SeqListPushBack(PSeq ps, DataType data){
//先把元素放进去
assert(ps);
//顺序