数据结构学习笔记②·线性表
线性表
2019.3.13
参考资料:数据结构与算法,解学武
个人记录重要的笔记,非全原创,有copy部分。
顺序表
不小心删了 有空再补
链表
-
链表中每个数据的存储都由数据域和指针域组成,即一个节点;
-
链表的节点可以分成头节点、首元节点、其他节点:
· 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;
· 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
· 其他节点:链表中其他的节点; -
建立链表的步骤
- 声明一个头指针(如果有必要,可以声明一个头节点);
- 创建多个存储数据的节点,在创建的过程中,要随时与其前驱节点建立逻辑关系;
链表的基本操作
插入元素
- 与顺序表相同,不论插入的位置在哪,操作思想都相同:
- 将将要插入的元素的 next 指针指向插入位置后的结点;
- 将插入位置对应的原始元素的前结点的 next 指针指向将插入的元素;
- ※重要!!!
链表插入元素的操作必须是先步骤 1,再步骤 2;反之,若先执行步骤 2,会导致插入位置后续的部分链表丢失,无法再实现步骤 1。
删除元素
步骤
- 将结点从链表中移出;(即frontnNode.next=delNode.next);
- 手动释放掉结点(c语言中为free()函数),回收被结点占用的存储空间;
查找元素
步骤
- 从表头依次遍历表中节点,用被查找元素与各节点数据域中存储的数据元素进行比对
- 结束条件:比对成功 或 遍历至链表最末端,即node.next==null;
修改元素
步骤(删除的是我一开始的思路)
遍历找到该元素新节点的下节点指向将被替换的元素的下节点将被替换节点的上节点指向新节点- 更新链表中的元素,只需通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可
顺序表和链表的优缺点
暂缺
静态链表
静态链表介绍
- 静态链表兼顾链表和顺序表的优点,数据全部存储在数组中(和顺序表一样),但存储位置是随机的。
- 各个节点之间"一对一"的逻辑关系通过一个int数据(称为"游标",和指针功能类似)维持(类似链表的指针)。
- http://data.biancheng.net/view/163.html
备用链表
- 静态链表使用数组申请的物理空间中有两个链表,一条连接数据,另一条连接数组中未使用的空间(即备用链表)。
- 备用链表的作用是回收数组中未使用或之前使用过(目前未使用)的存储空间,留待后期使用。
- 通常,备用链表的表头位于数组下标为 0(a[0]) 的位置,而数据链表的表头位于数组下标为 1(a[1])的位置。
- 备用链表的作用:可以清楚地知道数组中是否有空闲位置,以便数据链表添加新数据时使用。若静态链表中数组下标为 0 的位置上存有数据,则证明数组已满。
静态链表的基本操作
!!!在进行以下操作之前都必须要先建立好静态链表!!!
添加元素
假设要被插入的位置为(逻辑上)第x个节点:
- 遍历找到将要被插入的节点的位置
- 摘除备用链表中的一个节点(这步不用实际操作)
- x节点的上一个节点的游标(即x节点的数组下标)赋值给这个被取出来的备用节点(这一步就相当于间接摘除备用链表节点)
- 新取出来的节点在数组中的下标赋值给x节点的上一个节点
删除元素
- 遍历找到将要被删除的节点
- 将存有目标元素的节点从数据链表中摘除:
x元素的游标赋值给上一个节点游标; - 将摘除节点添加到备用链表:
备用链表表头的上一个节点的游标指向刚被摘除的节点;
x节点的游标指向备用链表表头;
查找元素
只能逐个遍历。
修改元素
遍历找到节点,修改数据域即可。
循环链表
- 循环链表中,依然有头指针和首元节点等,只是尾部与头部相接。
- 不要随意改变头指针的指向。
双向链表
略 与单向差距不大。