禁止转载,来源:totuma.cn
0.1 如何使用图码
图码旨在创建一个可以直观地学习编程、数据结构和算法的平台。
通过易于理解的交互式动画使复杂的算法变得简单易懂。
无论你的算法功底如何,都会使你受益颇多。
🌇 本站的特色
1.可视化电子书
- 全书每个数据结构和算法都拥有交互式动画,系统化的讲解相关知识点,内容清晰易懂、学习曲线平滑。
- 交互式面板不是一个简单的视频或者 GIF,而是一个交互式页面,所有算法都可自定义输入数据。
- 提供的代码均为C、C++,包含main函数,拒绝伪代码。符合国内高校考试要求,以及上机实操。
2.精编算法可视化
我们目前已经编写了将近60+的算法可视化,所有代码都是按照考研408中的数据结构规范编写
3.自定义代码可视化
除了上述精编的可视化外,你还可以使用我们的可视化算法编辑器,它可以将任意代码进行可视化,帮助你更好地理解代码的执行流程和变量的变化。
目前已经支持: C C++ Java JavaScript Python Ruby 6种不同的编程语言
👩🏻💻 如何使用算法可视化
第1步:认识可视化面板
可视化面板分为三个部分动画窗口代码窗口操作栏
点击下方可视化面板操作栏的头插法创建->创建
您可以看到对于单链表头插的执行流程动画,以及右边当前动画步骤对应的代码行
💡 提示
建议动画开始后点击暂停,通过下一步按钮一步步的查看代码运行过程。
这样可以更好的观察当前动画对应的代码以及变量情况。
正在载入交互式动画窗口请稍等
0.1 如何使用图码 可视化交互式动画版
在这篇文章中,我们将看到链表的介绍。
链表是一种线性数据结构,包含一系列相连的节点。 链表可以定义为随机存储在内存中的节点。 链表中的节点包含两部分,第一部分是数据部分,第二部分是地址部分。 列表的最后一个节点包含一个指向空值的指针。 链表是继数组之后第二常用的数据结构。 在链表中,每个链接都包含到另一个链接的连接。
链表的表示
链表可以表示为节点的连接,其中每个节点都指向链表的下一个节点。 链表的表示如下所示 -
到目前为止,我们一直使用数组数据结构来组织要单独存储在内存中的元素组。 然而,数组有几个优点和缺点,必须了解这些优点和缺点才能决定在整个程序中使用的数据结构。
现在,问题来了,为什么我们应该使用链表而不是数组?
为什么使用链表而不是数组?
链表是一种克服数组局限性的数据结构。 让我们首先看看数组的一些限制 -
- 在程序中使用数组之前必须事先知道数组的大小。
- 增加数组的大小是一个耗时的过程。 在运行时扩展数组的大小几乎是不可能的。
- 数组中的所有元素都需要连续存储在内存中。 在数组中插入一个元素需要移动其所有前驱元素。
链接列表很有用,因为 -
- 它动态分配内存。 链表的所有节点在内存中都是不连续存储的,并通过指针链接在一起。
- 在链表中,大小不再是问题,因为我们不需要在声明时定义其大小。 列表根据程序的需求而增长,并受到可用内存空间的限制。
如何声明一个链表?
数组的声明很简单,因为它是单一类型,而链表的声明比数组更典型一些。 链表包含两部分,两部分的类型不同,一是简单变量,二是指针变量。 我们可以使用用户定义的数据类型结构来声明链表 。
链表的声明如下 -
- 结构节点
- {
- 整数数据;
- 结构节点*下一个;
- }
在上面的声明中,我们定义了一个名为 node的 结构体,它包含两个变量,一个是整数类型的 数据 ,另一个是 next ,它是一个指针,包含下一个节点的地址。
现在,让我们转向链表的类型。
链表的类型
链表分为以下几种类型 -
- 单链表 - 单链表可以定义为有序元素集的集合。 单链表中的节点由两部分组成:数据部分和链接部分。 节点的数据部分存储该节点要表示的实际信息,而节点的链接部分存储其直接后继的地址。
- 双向链表 - 双向链表是一种复杂类型的链表,其中节点包含指向序列中前一个节点和下一个节点的指针。 因此,在双向链表中,一个节点由三部分组成:节点数据、指向序列中下一个节点的指针(next指针)、指向前一个节点的指针(previous指针)。
- 循环单链表 - 在循环单链表中,列表的最后一个节点包含指向列表的第一个节点的指针。 我们可以有循环单链表,也可以有循环双链表。
- 循环双向链表 - 循环双向链表是一种更复杂的数据结构类型,其中节点包含指向其前一个节点以及下一个节点的指针。 循环双向链表的任何节点中都不包含 NULL。 列表的最后一个节点包含列表的第一个节点的地址。 列表的第一个节点还包含其前一个指针中最后一个节点的地址。
现在,让我们看看使用链接列表的好处和局限性。
链表的优点
使用链表的优点如下:
- 动态数据结构—— 链表的大小可能根据需求而变化。 链表没有固定的大小。
- 插入和删除 - 与数组不同,链表中的插入和删除更容易。 数组元素存储在连续位置,而链表中的元素存储在随机位置。 要在数组中插入或删除元素,我们必须移动元素以创建空间。 而在链表中,我们不需要移位,只需更新节点指针的地址即可。
- 内存高效 - 链表的大小可以根据需要增长或缩小,因此链表中的内存消耗是高效的。
- 实现 - 我们可以使用链表来实现堆栈和队列。
链表的缺点
使用链表的限制如下:
- 内存使用 - 在链表中,节点比数组占用更多内存。 链表的每个节点占用两种类型的变量,一种是简单变量,另一种是指针变量。
- 遍历 - 在链表中遍历并不容易。 如果我们必须访问链表中的一个元素,我们不能随机访问它,而如果是数组,我们可以通过索引随机访问它。 例如,如果我们要访问第3个节点,那么我们需要遍历它之前的所有节点。 因此,访问特定节点所需的时间很大。
- 反向遍历 - 在链表中回溯或反向遍历是很困难的。 在双向链表中,它更容易,但需要更多内存来存储后向指针。
链表的应用
链表的应用如下:
- 借助链表,可以表示多项式,也可以对多项式进行运算。
- 可以使用链表来表示稀疏矩阵。
- 诸如学生详细信息、员工详细信息或产品详细信息之类的各种操作都可以使用链表来实现,因为链表使用可以容纳不同数据类型的结构数据类型。
- 使用链表,我们可以实现栈、队列、树等各种数据结构。
- 图是边和顶点的集合,图可以表示为邻接矩阵和邻接表。 如果我们想将图表示为邻接矩阵,那么可以将其实现为数组。 如果我们想将图表示为邻接表,那么可以将其实现为链表。
- 链表可以用来实现动态内存分配。 动态内存分配是在运行时完成的内存分配。
对链表执行的操作
列表支持的基本操作如下:
- 插入 - 执行此操作以将元素添加到列表中。
- 删除 - 执行从列表中删除操作。
- 显示 - 执行以显示列表的元素。
- 搜索 - 使用给定的键从列表中搜索元素。
链表的复杂性
现在,让我们看看链表的搜索、插入和删除操作的时间和空间复杂度。
1. 时间复杂度
运营 | 平均案例时间复杂度 | 最坏情况时间复杂度 |
---|---|---|
插入 | 复杂度(1) | 复杂度(1) |
删除 | 复杂度(1) | 复杂度(1) |
搜索 | 在) | 在) |
其中“n”是给定树中的节点数。
2. 空间复杂度
运营 | 空间复杂度 |
---|---|
插入 | 在) |
删除 | 在) |
搜索 | 在) |
链表的空间复杂度是 O(n)。
那么,链表的介绍就到此为止了。 希望这篇文章能给您带来帮助和信息。
🗺️ 查看更多
点击可查看图码支持的所有算法可视化。已更新将近 60个。
第2步:递归的可视化
理解递归需要包含一些抽象思维和对递归树、递归堆栈的理解,所以学习递归相关的算法一直以来都是令人比较头疼的。
通过交互式面板的递归栈窗口,可以直观的观察递归栈的存储情况。
❗️ 注意
如果出现遮挡情况,可以通过拖动递归栈窗口避开遮挡。
或者点击全屏按钮。建议使用全屏,更加沉浸体验可视化过程。
🔮 代码
运行代码
我们提供的所有代码都是完整可运行的,拒绝伪代码。
您可以点击代码框右上角的复制按钮复制完整代码,可在任意支持C++的编辑器中运行。
推荐使用VS Code,可以在运行环境章节中学习到如何安装C及C++运行环境。
我们关于数据结构和算法的代码均存储在Github 仓库,您可以无限制的访问及使用它。
AI 解析助手
AI 解析功能,指定代码进行逐行解析。通过对大模型精准投喂互联网上的编程教程、文档、考研资料和高校期末考试试题,来提高解析的准确性。
💡 提示
通过鼠标滑选您不理解的代码,进行 AI 解析。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
// 简单选择排序
void SelectSort(ElemType A[], int n) {
int i, j, min, temp;
// 外循环:从数组的第一个元素到倒数第二个元素进行遍历
for (i = 0; i < n - 1; i++) {
min = i; // 假设当前位置的元素是最小的
// 内循环:从外循环的下一个位置到数组末尾进行遍历
for (j = i + 1; j < n; j++) {
// 检查是否有比当前最小值更小的元素
if (A[j] < A[min]) min = j;
}
// 如果最小值的索引不等于当前位置索引,说明找到了比当前位置更小的元素
if (min != i) {
temp = A[i]; // 临时变量用于交换元素
A[i] = A[min]; // 将当前位置元素与最小值元素交换位置
A[min] = temp; // 更新最小值位置的元素为当前位置元素
}
}
}
int main () {
// 注意,0号位置是哨兵,不是要排序的值
ElemType arr[9] = {20, 60, 30, 10, 40, 90, 80, 70, 50};
SelectSort(arr, 9);
printf("简单选择排序排序结果:");
for (int i = 0; i < 9; i++) {
printf("%d ", arr[i]);
}
return 0;
}
// 完整代码:totuma.cn
🌌 插画交互面板
在编者看来数据结构和算法的学习应该是清晰、生动、有趣的。但是很遗憾,市面上大多的教程都是对着板书讲解相关知识点,这样就导致了数据结构的学习过程变得枯燥乏味。我们尝试着用一种新的交互方式来让数据结构和算法的学习变得更加有趣。
通过下方的插画交互面板,您可以很直观的了解到链表的组成结构。
💡 提示
使用鼠标滑入底部的链表 A,您可以分别看到其对应的结构指示。
本书将大量使用这种交互式的提示面板,帮助读者更好的理解内部结构。
链表结构
🔥 价格说明
只要购买VIP,即可解锁全站所有内容,包括后续更新内容(无二次收费)。
目前价格可以说对于网站运营成本都覆盖不了,因此后续肯定会涨价。
如果您觉得图码对您学习数据结构和算法有所帮助,千万不要观望。
我们会在每次更新新文章的时候进行涨价。
已购买的用户不受涨价影响,后续更新内容都可无限制访问。
目前算法可视化工具已更新将近60个,点击此处访问:算法可视化
联系我们
QQ群:124297522