1.定义:
- 线性表是具有 相同特性 数据元素的一个有限序列,该序列中所包含的元素的个数叫做线性表的长度,用n表示(n>=0),当n等于0时线性表是一个空表。
- 可以是有序的也可以是无序的,
2.线性表的逻辑特性
- 这个有限序列的第一个没有前驱(前面没有数据元素),最后一个无后继(后面没有数据元素),其他的数据元素只有一个直接前驱,和一个直接后驱。
3.线性表的存储结构
1.顺序表
- 顺序表中的所有元素按照其逻辑顺序,一次存储到存储器中从指定存储位置开始的一块连续的存储空间中。
- 特点
- 随机访问特性
- 即顺序表要求占用连续的存储空间
- 存储分配只能预先进行,即 静态分配,一旦分配好了,在对其操作过程中不变。
- 在顺序表中插入时,需要移动元素
2.链表
在链表存储中,每个结点不仅包含所存元素本身的信息,还包含前驱结点包含后继结点的地址信息,这样就可以方便的找到前驱和后继的位置。
-特点- 必须从头访问,不支持随机访问。
- 因为有一部分要存储指针信息,所以链表中 结点的存储空间利用率较之顺序表稍低一些。
- 链表中的节点散落的分布在存储器中,所以链表支持存储空间的动态分配,需要时再划分。
- 链表插入时,不需要移动元素。
链表有五种形式
- 单链表可分为带头结点,和不带头结点两种,前者第一个节点不存储信息,只作为标记,后者所有结点都存储信息,两种情况下,头指针都指向头结点
- 双链表,即节点存储了指向前驱的指针。
- 循环单链表,最后一个结点的指针指向链表中的第一个结点。
- 带头结点的循环单链表当head等于head->next;时链表为空;不带头结点的循环单链表当 head 等于 NULL 时链表为空
- 循环双链表
- 带头结点的循环双链表当head->next和head->prior两个指针都等于head时链表为空,不带头结点的循环双链表当head等于NULL的时候为空。
- 静态链表。
区别总结
(1 )基于空间的比较:
存储分配的方式:
顺序表的存储空间是静态分配的。
链表的存储空间是动态分配的。
存储密度( 存储密度= 结点数据域所占的存储量/ 结点结构所占的存储总量) :
顺序表的存储密度 =1。
链表的存储密度<1 (因为结点中有指针域)。
(2 )基于时间的比较:
存取方式:
顺序表可以随机存取,也可以顺序存取
链表是顺序存取的。
插入/ 删除时移动元素个数:
顺序表平均移动近一半元素。
链表不需要移动,只需要改变指针。