1、线性表
线性表是n个具有相同特性的数据元素的有限序列,常见的线性表有:顺序表,链表,栈、队列和字符串…
线性表在逻辑上是线性结构,但在物理上并不一定是连续的。
2、顺序表
1、概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储;多分为静态顺序表和动态顺序表
2、静态存储常用:
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N]; // 定长数组
size_t size; // 有效数据的个数
}SeqList;
3、动态存储常用
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组,用的是指针
size_t size ; // 有效数据个数
size_t capicity ; // 容量空间的大小,需要检查其容量,用来扩容
}SeqList;
4、链表
1、概念:链表是一种物理上存储结构上非连续、非顺序的存储结构数据元素间的链接是通过指针链接实现的
2、分类:
a、单向、双向
b、带头、不带头
c、循环、非循环
组合起来有8中,最最好用的链表为带头双向循环链表
注意:在带头双向循环链表中,在pos位置之前插入数据newnode时,记得最后将pos->prev=newnode,否则找不到原本pos之间的结点,无法将数据链接起来
5、顺序表和链表的对比
1、顺序表空间连续,支持随机访问,而链表不能随机访问;
2、在中间或者前面部分的插入和删除时间复杂度为O(N),增容代价比较大,而链表在任意位置的插入和删除时间复杂度为O(1),且不存在增容问题,插入一个开辟一个空间
6、栈
1、概念:栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作,并将插入端设置为栈顶,另一端称为栈低。
2、实现:栈的实现一般采用数组或者链表实现