| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【数据结构】第二章线性表:双链表、静态链表、循环链表、静态链表、顺序表与链表比较 -> 正文阅读 |
|
[数据结构与算法]【数据结构】第二章线性表:双链表、静态链表、循环链表、静态链表、顺序表与链表比较 |
2.3.3 双链表第二章单链表中学到: 单链表:无法逆向检索,有时候不太方便; 双链表:双向链表,可进可退,存储密度更低; 存储密度 = (结点数据本身所占的存储量)/(结点结构所占的存储总量) 计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。 一、双链表的定义
二、双链表的初始化(带头结点)
初始化双向链表传参时使用的是 DLinklist &L 想强调的是,这里引用了一个双向链表;分配头结点时使用 DNode * 想强调的是 malloc 出了一个结点; DLinklist 与 DNode * 是等价的。 三、双链表的插入
如果p恰好是最后一个结点,就不用再做第二步 p->next->prior = s;? // 为p后的旧结点的前驱赋指针值 了,所以为了更加严谨,单独做一个判断,判断p结点是否为最后一个结点。
在p结点之后插入s结点新结点称为后插操作;想要完成按位序插入前插操作,则需找到p的前驱结点,做p前驱结点的后插操作。 四、双链表的删除与销毁
五、双向链表的后向、前向遍历
双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方法实现。时间复杂度为O(n)。 2.3.4 循环链表一、循环单链表的定义、初始化、判空、判表尾结点循环单链表:最后一个结点的指针域指向头结点; 单链表从一个结点出发只能找到后续的各个结点;循环单链表从一个结点出发,可以找到其它任何一个结点。
二、循环双链表定义、初始化、判空
三、循环双链表的插入
四、循环双链表删除
2.3.5 静态链表一、什么是静态链表单链表:各个结点在内存中分散; 静态链表:用数组的方式实现的链表,分配一整片连续的内存空间,各个结点集中安置;0 号结点充当头结点,游标(数组下标)充当指针,游标 -1 表示已经到达表尾。 设每个数据元素4B,每个游标4B,则每个结点共8B;设起始地址(头结点之前的地址)为addr,结点e1的存放地址则为 addr+8*2。 优点:增、删操作不需要大量移动元素; 缺点:不能随机存取,只能从头结点开始依次向后查找;容量固定不可变; 适用场景: ① 不支持指针的低级语言; ② 数据元素数量固定不变的场景(如操作系统的文件分配表FAT); 二、静态链表的定义
上述代码加上一句定义语句:
就等价于书中的代码:
第一种方法struct Node a[MaxSize]; 的定义方法从代码角度看起来像一个Node型数组,而书上写的SLinkList a; 这种写法更像是一个静态链表; 这两种方法生成的结构体数组的大小是一样的。 三、静态链表的基本操作初始化静态链表:把a[0]的next设为-1; 查找:从头结点出发挨个往后遍历结点;时间复杂度O(n) 插入位序为i的结点: ① 扫描链表,找到一个空的结点,存入数据元素; ② 从头结点出发找到位序为i-1的结点; ③ 将位序为i-1的结点的游标值赋给新结点; ④ 修改i-1号结点的next; 那么在第一步中如何判断结点为空呢? 解决方法是可让next为某个特殊值,如-2,这一步可以在初始化的时候设置。 2.3.6 顺序表和链表比较一、逻辑结构方面的比较都属于线性表,都是线性结构。 二、存储结构方面的比较顺序表: 优点:支持随机存取,存储密度高; 缺点:大片连续空间分配不方便,改变容量不方便; 链表: 优点:离散的小空间分配方便,改变容量方便; 缺点:不可随机存取,存储密度低; 三、基本操作复习回忆思路:创销、增删改查; 创建: 顺序表:需要预分配大片连续空间。若分配空间过小,则之后不方便扩展容量;若分配空间过大,则浪费内存资源; 顺序表的实现方式有两种: 静态分配:静态数组;(容量不可改变) 动态分配:动态数组(malloc、free);容量可改变,但需要移动大量元素,时间代价高; 链表:只需分配一个头结点(也可以不要头结点,只声明一个头指针),之后方便拓展; 销毁: 顺序表:修改lenth=0; 静态分配:静态数组,系统自动回收空间; 动态分配:动态数组(malloc、free),需要手动free; 链表:依次删除各个结点(free); 插入、删除: 顺序表:插入、删除元素要将后续元素都后移、前移,时间复杂度O(n),时间开销主要来自移动元素; 链表:插入、删除元素只需修改指针即可,时间复杂度O(n),时间开销主要来自查找目标元素; 虽然他们的时间复杂度一样,但是他们的操作并不一样,若数据元素很大,则顺序表中移动的时间代价很高,而链表中查找元素的时间代价更低。 查找: 顺序表:随机存储,按位查找时间复杂度O(1);按值查找时间复杂度O(n),若表内元素有序,可在O(log2n)时间内找到(比如折半查找算法); 链表:按位查找时间复杂度O(n);按值查找时间复杂度O(n); 四、什么时候用顺序表或者链表?表长难以预估,经常要增加、删除元素——链表; 表长可预估,查询(搜索)操作较多——顺序表; 开放式问题的答题思路: ? |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:44:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |