数据结构
是研讨数据的逻辑结构和存储结构,以及它们之间的相互关系并对与这种结构定义相应的运算,设计出相应的算法,确保经过这些运算后所得到的新结构是原来的结构类型。
线性表的存储结构
定长的顺序存储结构——顺序表
简称顺序表,程序中通过创建数组来建立这种存储结构,其主要特点是为线性表分配一块连续的存储空间,线性表中的数据元素顺序的存储在这些地址连续空间中,以物理地址相邻来表示线性表中数据元素之间的逻辑关系,其不足是限制了线性表的长度变化。
- 顺序表插入算法的时间复杂度是O(n)
- 顺序表删除算法的时间复杂度是O(n)
- 取数据元素算法的时间复杂度是O(1)
- 顺序表查找算法的时间复杂度是O(n)
- 顺序表遍历算法的时间复杂度是O(n)
1,顺序表的优缺点
优点
- 结构简单,便于理解
- 方便随机访问表中的每个元素
- 不需要再为表示节点间的逻辑关系而额外增加存储空间
缺点:
- 顺序表的存储空间不易扩充
- 顺序表易造成存储空间利用率低。由于顺序表需要一组连续的存储单元,对于长度变化的线性表则需要事先估计并申请足够大的存储空间,小了会发生溢出,大了会使存储空间得不到充分利用。
- 顺序表的插入和删除运算不方便。在顺序表中每次插入和删除运算都要移动一一半的数据元素,当顺序表的长度n很大时,则其插入和删除算法的效率都很低。
变长的顺序存储结构——链表
简称链表,链式存储结构利用指针将线性表中前后相邻的两个元素连接起来以表示数据元素之间的线性关系。链式存储结构对线性表的长度不加限制,只要有空闲的存储空间,在需要插入新的数据元素时,即可方便的申请空间并且连接到合适的位置上。
链表是通过一组地址任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的,也可以是不连续的,为了表示数据元素之间的线性关系,衍生出单链表节点结构:data为数据域,存储数据,next为指针域,用来存放本节点的直接后继节点的存储地址
1,单链表的基本运算
单链表的基本运算包括:链表的建立,查找,插入,删除,遍历及置空表等
- 单链表的建立
(1)头插法建立单链表(建立顺序与读取顺序相反p34)复杂度O(n)
(2)尾插法建立单链表 复杂度O(n) - 单链表的遍历 复杂度O(n)
- 求单链表的长度 复杂度O(n)
- 单链表的查找
(1)按序号查找 相当于遍历 复杂度O(n)
(2)按值查找 相当于遍历 复杂度O(n) - 单链表的插入
(1)后插运算 节点p之后插入 复杂度O(1)
(2)前插运算 节点p之前插入 复杂度O(1) - 单链表的删除
(1)删除后继节点 复杂度O(1)
(2)删除指定节点 找到他的后继节点,将后继节点的数据复制到自己本身(两节点现在一样了)然后删除指定节点的后继节点;或者找到这个节点的前驱节点,然后删除其后置节点。复杂度O(n)
(3)删除指定位置的节点 相当于遍历指定位置的前驱节点再删除它的后继节点 复杂度O(n)
静态链表
用数组来存放元素的值和地址。由于数组元素的格式一旦确定就不会改变,因而成这种链表为静态链表
下标0的节点是表的头节点,头结点的下标是2,表示A的下标为2,其节点Link值为5,表示其后继B 的下标为5。最后一个节点F 没有后继,所以其后继位置为-1。在某些情况下,头结点的data域可以存放表的长度。
循环链表
循环链表是一种首尾相连的链表。一般的,链表的最后一个结点的指针域的是空指针,如果将其指向头指针,就构成了循环链表。对于带头结点的单链表将最后一个结点的指针域指向头指针,就构成了单循环链表。
循环链表上的额操作和单链表基本相似,主要差别是。遍历链表的终止条件不同,单链表的终止条件是结点指针为空,但循环链表的终止条件是指针域是否为表头结点,或操作起始结点。
循环链表的优点是:表中任何一点都可以遍历整个列表,而对于单链表只能从头开始才能达到同样效果。
双向链表
双向链表,就是有两个指向的链表,一个指向直接后继,一个指向直接前驱,它可以从链表中的任意一个位置开始向两个方向遍历整个链表。
顺序表和链表的比较: