线性表
定义
具有相同数据类型的n个数据元素的有限序列 linear list 特点:有序、每个元素所占空间一样大
位序(也就是a1、ai的1、i)是从1开始 数组下标从0开始
顺序表
用顺序存储的方式实现线性表顺序存储--逻辑上相邻的元素物理位置上相邻
静态分配(存放到栈区,自动释放) 类似于int temp[10]这样的方式,不可原地扩容,只能动态拷贝复制
动态分配(存放到堆区,手动释放) c使用malloc realloc等函数进行分配和扩容--其实也是拷贝 c++使用new delete函数分配空间
特点 随机访问:查找时间为常数级 存储密度高:相对于链表不需要存放指针 拓展容量不方便:只能动态分配,O(n)的时间复杂度 插入、删除也不方便
插入
先检查是否溢出和插入位置的合法性;将插入位置以后的原本位于i的元素移到i+1处(注意边界和从大到小)
删除
注意删除位置的合法性;i的元素移到i-1处(从小到大);注意引用&
查找
按位/按值:注意说的是位序(1..n)还是数组下标(0..n-1)
链表
单链表
带头结点和不带头节点,注意判断为空条件 不要求大片连续空间,改变容量方便;存取麻烦,要耗费一定空间存放指针
头指针L指向单链表第一个结点
`typedef struct Node{` ... `}Node,*LNode`
Node 强调结点,LNode强调这是一个单链表(的开头)
插入
注意不带头节点时插入到第一个的情况
前插、后插、尾插、头插
按位序/指定位置的删除
查找
注意封装,比如将指定位置插入转化为插入+查找
健壮性:比如为NULL的情况
建立
struct->初始化头节点->插入(可以放一个表尾指针降低查找消耗)
双链表
相比于链表加一个前驱指针,注意删除-增加的时候有无后继节点即可
循环链表
建立时候注意head -> next = head,其他操作都差不多
方便了判断是否为空,以及存储表尾指针时候可以很快插入
此外还有循环双链表
静态链表
有点特殊的写法(?)
容量不变,所以主要注意增加:如何找到一个为空的结点——设置next为-2
支持不需要指针的低级语言;和数据元素量基本不变的场景(操作系统)
最后注意一下顺序表和链表的区别