0.1 如何使用图码
图码旨在创建一个可以直观地学习编程、数据结构和算法的平台。
通过易于理解的交互式动画使复杂的算法变得简单易懂。
无论你的算法功底如何,都会使你受益颇多。
🌇 本站的特色
1.可视化电子书
- 全书每个数据结构和算法都拥有交互式动画,系统化的讲解相关知识点,内容清晰易懂、学习曲线平滑。
- 交互式面板不是一个简单的视频或者 GIF,而是一个交互式页面,所有算法都可自定义输入数据。
- 提供的代码均为C、C++,包含main函数,拒绝伪代码。符合国内高校考试要求,以及上机实操。
2.精编算法可视化
我们目前已经编写了将近60+的算法可视化,所有代码都是按照考研408中的数据结构规范编写。
3.自定义代码可视化
除了上述精编的可视化外,你还可以使用我们的可视化算法编辑器,它可以将任意代码进行可视化,帮助你更好地理解代码的执行流程和变量的变化。
目前已经支持: CC++JavaJavaScriptPythonRuby 6种不同的编程语言
👩🏻💻 如何使用算法可视化
第1步:认识可视化面板
可视化面板分为三个部分动画窗口代码窗口操作栏
点击下方可视化面板操作栏的头插法创建->创建 您可以看到对于单链表头插的执行流程动画,以及右边当前动画步骤对应的代码行
💡 提示
建议动画开始后点击暂停,通过下一步按钮一步步的查看代码运行过程。
这样可以更好的观察当前动画对应的代码以及变量情况。
单链表-带头结点 | 可视化完整可视化
0.1 図碼の使い方 - データ構造とアルゴリズムチュートリアル アニメーションでコードを可視化しよう
データ構造とアルゴリズム可視化学習プラットフォームへようこそ
プログラミングを学ぶ上で、データ構造とアルゴリズムの理解は避けて通れない重要なテーマです。特に「線形リスト(リンクリスト)」は、配列と並んで最も基本的なデータ構造の一つであり、多くの応用問題や実務で使用されています。本記事では、リンクリストの原理、特徴、応用シーンを詳しく解説するとともに、当プラットフォームの可視化機能を活用した効果的な学習方法をご紹介します。
線形リスト(リンクリスト)とは何か
リンクリストは、複数の要素(ノード)を一列に連結したデータ構造です。各ノードは「データ」と「次のノードへのポインタ(参照)」を持ち、ポインタを辿ることで順次アクセスします。配列のようにメモリ上に連続した領域を確保する必要がなく、動的なメモリ管理が可能な点が最大の特徴です。
例えば、電車の連結をイメージしてください。各車両(ノード)が連結器(ポインタ)で繋がれており、先頭車両から順に連結器を辿れば全ての車両にアクセスできます。新しい車両を追加する際も、連結器を付け替えるだけで簡単に挿入できます。
リンクリストの種類
リンクリストには主に以下の3種類があります。それぞれに特徴があり、用途に応じて使い分けます。
単方向リンクリスト:各ノードが次のノードへのポインタのみを持ちます。最後のノードのポインタはNULLを指します。実装が最もシンプルで、メモリ効率が良い反面、前のノードに戻ることができません。
双方向リンクリスト:各ノードが「前のノードへのポインタ」と「次のノードへのポインタ」の両方を持ちます。前後の移動が自由で、削除操作が効率的ですが、その分メモリ消費が増えます。
循環リンクリスト:最後のノードが先頭ノードへのポインタを持つ構造です。リング状になっており、ループ処理やキュー(待ち行列)の実装に適しています。
リンクリストの基本操作と時間計算量
リンクリストの操作には、挿入、削除、検索、走査がありますそれぞれの時間計算量(Big O記法)を理解することが重要です。
先頭への挿入:O(1)で実行できます。先頭ノードのポインタを新しいノードに付け替えるだけです。配列では先頭挿入にO(n)かかることを考えると、大きな利点です。
末尾への挿入:末尾ノードへのポインタ(tail)を持っていればO(1)ですが、持っていない場合は先頭から末尾まで辿る必要があるためO(n)になります。
任意の位置への挿入:挿入位置を特定するためにO(n)の走査が必要です。ただし、位置が特定できれば挿入自体はO(1)です。
削除操作:挿入と同様に、削除するノードの位置が分かればO(1)ですが、位置を探すのにO(n)かかります。双方向リンクリストでは、削除するノードさえ特定できれば前後のポインタを繋ぎ直すだけで完了します。
検索操作:先頭から順に辿るしかないため、平均O(n)、最悪O(n)です。配列のようにインデックスによるランダムアクセはできません。
走査(全要素へのアクセス):必ずO(n)です。各ノードのポインタを順に辿る必要があります。
配列との比較:リンクリストの利点と欠点
リンクリストと配列は、どちらも線形データ構造ですが、特性が大きく異なります。学習者は両者の違いを明確に理解する必要があります。
メモリ管理:配列は宣言時に固定サイズのメモリを確保しますが、リンクリストは要素の追加・削除に応じて動的にメモリを確保・解放します。これにより、メモリの無駄が少なくなります。
挿入・削除の効率:配列では途中への挿入・削除に伴い、後続の要素を全てシフトする必要があるためO(n)かかります。リンクリストではポインタの付け替えのみで済むため、位置が特定できればO(1)です。
ランダムアクセス:配列はインデックスを使えばO(1)で任意の要素にアクセスできますが、リンクリストはO(n)かかります。この違いは非常に重要で、検索が頻繁に行われる処理では配列が有利です。
メモリオーバーヘッド:リンクリストは各ノードにポインタ用のメモリが必要です。単方向で1つ、双方向で2つのポインタ分の余分なメモリ消費があります。配列にはこのオーバーヘッドがありません。
キャッシュ効率:配列はメモリ上に連続して配置されるため、CPUキャッシュの効果を受けやすく、走査が高速です。リンクリストはノードがメモリ上に分散しているため、キャッシュミスが発生しやすくなります。
リンクリストの応用シーン
リンクリストは、その特性を活かして様々な場面で使用されています。実務での応用例を知ることで、学習のモチベーションが高まります。
オペレーティングシステムのプロセス管理:プロセス制御ブロック(PCB)をリンクリストで管理し、プロセスの生成・終了・状態遷移を効率的に処理します。動的な追加・削除が頻繁に発生するため、リンクリストが適しています。
ファイルシステム:FAT(File Allocation Table)などのファイルシステムでは、ファイルのクラスタ(データブロック)をリンクリストで連結しています。断片化したデータを効率的に管理できます。
音楽プレイヤーのプレイリスト:曲の追加・削除・並び替えが頻繁に行われるプレイリストは、双方向リンクリストで実装されることが多いです。前の曲・次の曲への移動も簡単です。
ブラウザの履歴管理:戻る・進む機能は、双方向リンクリストで実装できます。各ページがノードとなり、前後のページへのポインタを持ちます。
グラフの隣接リスト表現:グラフアルゴリズムにおいて、各頂点に隣接する頂点のリストをリンクリストで保持します。頂点の追加・削除が動的に行えるため、大規模グラフの処理に適しています。
メモリ管理(フリーリスト):動的メモリ割り当てにおいて、解放されたメモリブロックをリンクリストで管理するフリーリストが使用されます。メモリの確保・解放を効率的に行えます。
リンクリストの実装で注意すべきポイント
実際にリンクリストを実装する際には、いくつかの注意点があります。特に初心者が陥りやすいミを前に理解しておきましょう。
ヌルポインタ参照:ポインタがNULLを指している状態でアクセスしようとすると、プログラムがクラッシュします。特に、末尾ノードの削除や空のリストに対する操作では注意が必要です。
メモリリーク:ノードを削除する際、そのノードが占有していたメモリを適切に解放しないと、メモリリークが発生します。特にC言語など手動でメモリ管理を行う言語では重要です。
循環参照:循環リンクリストで正しく終了条件を設定しないと、無限ループに陥ります。走査時には、開始ノードに戻ったことを検出するロジックが必要です。
先頭ノードの特別扱い:先頭ノードの挿入・削除は、他の位置と処理が異なります。ダミーノード(番兵)を導入することで、先頭の特別扱いを回避するテクニックもあります。
双方向リンクリストのポインタ更新:双方向リンクリストでは、前後のポインタの両方を更新する必要があります。片方だけ更新してしまうと、リストが破損します。
可視化プラットフォームでリンクリストを学ぶメリット
当プラットフォームは、データ構造とアルゴリズムの可視化に特化した学習環境です。リンクリストの学習において、以下のような強力な機能を提供します。
アニメーションによる動作可視化:ノードの挿入・削除・検索の各操作が、アニメーションで表示されます。ポインタの繋ぎ変わる様子を目で確認できるため、抽象的な概念が直感的に理解できます。例えば、ノードを挿入する際に、ポインタがどのように変化するかが一瞬で分かります。
ステップ実行機能:操作を1ステップずつ実行できます。各ステップでメモリ状態やポインタの変化を確認しながら進められるため、複雑な操作も確実に追跡できます。初心者がつまずきやすい「ポインタの付け替え順序」を、自分のペースで理解できます。
コードと連動した表示:実際のコード(C、Java、Pythonなど)と連動して、コードのどの行が実行されているかがハイライト表示されます。抽象的なデータ構造と具体的なコードの対応関係を学べます。
インタラクティブな操作:自分でノードを追加・削除したり、値を変更したりできます。受動的に見るだけでなく、能動的に操作することで理解が深まります。
メモリ状態の可視化:各ノードがメモリ上のどこに配置されているか、ポインタがどのアドレスを指しているかが視覚的に表示されます。メモリ管理の概念が自然と身につきます。
エラー検出とフィードバック:不正な操作(例えば、NULLポインタへのアクセス)を検出し、エラーメッセージと共に可視化して表示します。実際にプログラムを書く前に、典型的なミスを体験できます。
プラットフォームの具体的な使い方
当プラットフォームの利用方法は非常にシンプルです。以下の手順で、すぐに学習を開始できます。
ステップ1:データ構造の選択:トップページから「線形リスト(リンクリスト)」を選択します。単方向、双方向、循環の3種類から選べます。
ステップ2:操作の選択:画面上部のメニューから、実行した操(挿入、削除、検索、走査)を選択します。各操作には、さらに詳細なオプション(先頭挿入、末尾挿入、指定位置挿入など)があります。
ステップ3:パラメータの設定:操作に必要なパラメータ(挿入する値、削除する位置など)を入力します。数値はスライダーで直感的に設定できます。
ステップ4:実行と観察:「実行」ボタンを押すと、アニメーションが開始されます。各ノードが色分けされ、ポインタの動きが矢印で表示されます。速度調整も可能で、ゆっくり確認したい場合はスローモードに設定できます。
ステップ5:コードの確認:画面下部のコードペインで、現在の操作に対応するコードが表示されます。実行中の行がハイライトされ、可視化とコードの対応を確認できます。
ステップ6:練習問題:各単元の終わりには、理解度を確認するための練習問題が用意されています。可視化ツールを使って実際に操作しながら問題を解くことで、知識が定着します。
学習のロードマップ:リンクリスト習得への道
当プラットフォームでは、段階的な学習ロードマップを提供しています。初心者から上級者まで、自分のレベルに合わせて学習を進められます。
フェーズ1:基本概念の理解:まずは単方向リンクリストの基本操作(先頭挿入、末尾挿入、先頭削除、末尾削除)を可視化ツールで体験します。ノードとポインタの概念に慣れることが目標です。
フェーズ2:操作の習得:任意位置への挿入・削除、検索操作を学びます。特に、ポインタの付け替え順序の重要性を、ステップ実行で確認します。
フェーズ3:応用操作:リンクリストの反転、マージ、ソートなどの応用操作に挑戦します。これらの操作は、就職試験のコーディング問題でも頻出です。
フェーズ4:双方向・循環リンクリスト:より複雑なリンクリストの種類を学びます。単方向との違い、それぞれの利点・欠点を可視化ツールで比較します。
フェーズ5:実践問題:実際のアルゴリズム問題(例:LRUキャッシュの実装、多項式の表現など)に取り組みます。可視化ツールを活用して、問題の構造を理解しながら解くことができます。
よくある質問(FAQ)
リンクリストの学習において、学習者からよく寄せられる質問とその回答をまとめました。
Q:リンクリストと配列、どちらを先に学ぶべきですか?
A:一般的には配列を先に学ぶことをお勧めします。配列はよりシンプルで、インデックスの概念が分かりやすいためです。リンクリストは配列の理解を前提として、その違いを学ぶと効果的です。
Q:リンクリストは実務で本当に使われているのですか?
A:はい、非常に多く使われています。特に、要素の追加・削除が頻繁に行われるシステム(OSのプロセス管理、メモリ管理、グラフ処理など)では、リンクリストが標準的に使用されています。
Q:可視化ツールを使うと、実際のプログラミングができるようになりますか?
A:可視化ツールは概念の理解を助けるものであり、実際のプログラミングスキルを向上させるには、自分でコードを書く練習も必要です。当プラットフームでは、可視化と連動したコーディング演習も提供しています。
Q:どのプログラング言語でリンクリストを実装するのがお勧めですか?
A:ポインタの概念を直接扱えるC言語が、最も学習効果が高いと言われています。ただし、PythonやJavaでも十分に学習できます。当プラットフォームは主要な言語すべてに対応しています。
Q:リンクリストの学習にどれくらい時間がかかりますか?
A:個人差がありますが、基本操作の理解までに約3〜5時間、応用操作を含めると約10〜15時間が目安です。当プラットフォームの可視化ツールを使うことで、学習時間を大幅に短縮できます。
まとめ:可視化でリンクリストをマスターしよう
リンクリストは、データ構造の学習において避けて通れない重要なテーマです。その原理を理解することは、より複雑なデータ構造(ツリー、グラフなど)を学ぶ基礎となります。しかし、ポインタの概念や動的なメモリ管理は、初心者にとっては抽象的で理解が難しい部分でもあります。
当プラットフォームの可視化機能は、この難しい概念を「見える化」することで、学習のハードルを大幅に下げます。アニメーション、ステップ実行、コード連動、インタラクティブ操作といった機能を活用することで、効率的かつ確実にリンクリストを習得できます。
さらに、学習ロードマップに沿って段階的に進めることで、基礎から応用まで無理なく学習できます。就職試験やコーディング面接の対策としても、当プラットフォームは強力なツールとなるでしょう。
今すぐ無料で始められるトライアル版をご用意しています。実際に操作して、可視化学習の効果を実感してください。データ構造とアルゴリズムの理解が、あなたのプログラミングスキルを次のレベルに引き上げます。
🗺️ 查看更多
点击可查看图码支持的所有算法可视化。已更新将近 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
// 単純選択ソート
void SelectSort(ElemType A[], int n) {
int i, j, min, temp;
// 外側ループ:配列の最初の要素から最後から2番目の要素までを走査
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;
// 完整代码:https://totuma.cn🌌 插画交互面板
在编者看来数据结构和算法的学习应该是清晰、生动、有趣的。但是很遗憾,市面上大多的教程都是对着板书讲解相关知识点,这样就导致了数据结构的学习过程变得枯燥乏味。我们尝试着用一种新的交互方式来让数据结构和算法的学习变得更加有趣。
通过下方的插画交互面板,您可以很直观的了解到链表的组成结构。
💡 提示
使用鼠标滑入底部的链表 A,您可以分别看到其对应的结构指示。
本书将大量使用这种交互式的提示面板,帮助读者更好的理解内部结构。

链表结构
🔥 价格说明
只要购买VIP,即可解锁全站所有内容,包括后续更新内容(无二次收费)。
目前价格可以说对于网站运营成本都覆盖不了,因此后续肯定会涨价。
如果您觉得图码对您学习数据结构和算法有所帮助,千万不要观望。
我们会在每次更新新文章的时候进行涨价。
已购买的用户不受涨价影响,后续更新内容都可无限制访问。
目前算法可视化工具已更新将近60个,点击此处访问:算法可视化