連結リスト

C++ポインタによる単方向連結リストをステップごとに確認します。

すべてこのブラウザ内でシミュレートされ、サーバーには一切送信されません。

値

新しいノードを作成する

新しいノードを作成する

n_ = 0
切り離されたノード
42
0x1010ポインタ
cabeza_
nullptr — 空のリスト
  • 現在
  • ポインタ

ステップ 1 / 46

コード

#include <iostream>
using namespace std;
class Nodo { // ノードはデータと次のノードへのポインタを保持します
private: // プライベート属性:メソッドだけが触れます
int dato;
Nodo* siguiente;
public:
Nodo(int d) : dato(d), siguiente(nullptr) {}
int getDato() const { return dato; }
Nodo* getSiguiente() const { return siguiente; }
void setDato(int d) { dato = d; }
void setSiguiente(Nodo* s) { siguiente = s; }
};
class Lista {
Nodo* cabeza_; // リストの先頭ノード
int n_; // ノード数
public:
Lista() : cabeza_(nullptr), n_(0) {}
// Constructor de copia (no se anima)
Lista(const Lista& otra) : cabeza_(nullptr), n_(0) {
for (Nodo* p = otra.cabeza_; p != nullptr; p = p->getSiguiente())
insertarFinal(p->getDato());
}
// Destructor (no se anima)
~Lista() {
while (cabeza_ != nullptr) {
Nodo* temp = cabeza_;
cabeza_ = cabeza_->getSiguiente();
delete temp;
}
}
void insertarElemento(int valor) { // 先頭に挿入: O(1)
Nodo* nuevo = new Nodo(valor); // ノードを作成
nuevo->setSiguiente(cabeza_); // 新しいノードが古い先頭を指します
cabeza_ = nuevo; // cabeza_ が新しいノードを指すようになります
n_++;
}
void insertarFinal(int valor) { // 末尾に挿入: O(n)
Nodo* nuevo = new Nodo(valor); // ノードを作成
if (cabeza_ == nullptr) { // リストは空?
cabeza_ = nuevo;
} else {
Nodo* actual = cabeza_;
while (actual->getSiguiente() != nullptr) { // 末尾まで進みます
actual = actual->getSiguiente();
}
actual->setSiguiente(nuevo); // 末尾の後ろに新しいノードをつなぎます
}
n_++;
}
// Devuelve la posición (0-based) o -1 si no existe
int buscar(int valor) const {
Nodo* actual = cabeza_;
int indice = 0;
while (actual != nullptr) {
if (actual->getDato() == valor) return indice; // データを比較
actual = actual->getSiguiente();
indice++;
}
return -1; // 見つかりません
}
void eliminarNodo(int indice) {
if (indice < 0 || indice >= n_) return; // インデックスを検証
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
for (int i = 0; i < indice; i++) {
anterior = actual;
actual = actual->getSiguiente();
}
if (anterior == nullptr)
cabeza_ = actual->getSiguiente(); // 先頭でした
else
anterior->setSiguiente(actual->getSiguiente()); // ノードをスキップ
delete actual; // メモリを解放
n_--;
}
void invertirLista() {
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
while (actual != nullptr) {
Nodo* siguiente = actual->getSiguiente(); // 次のノードを保存
actual->setSiguiente(anterior); // リンクを反転
anterior = actual;
actual = siguiente;
}
cabeza_ = anterior; // 最後のノードが先頭になります
}
void imprimirLista() const {
for (Nodo* p = cabeza_; p != nullptr; p = p->getSiguiente()) { // リストを走査
cout << p->getDato();
if (p->getSiguiente() != nullptr) cout << " -> "; // 値の区切り文字
}
cout << endl;
}
};
int main() {
Lista lista;
lista.insertarElemento(3);
lista.insertarElemento(6);
lista.insertarElemento(9);
lista.imprimirLista(); // 9 -> 6 -> 3
lista.insertarFinal(1);
lista.eliminarNodo(lista.buscar(6));
lista.imprimirLista(); // 9 -> 3 -> 1
lista.invertirLista();
lista.imprimirLista(); // 1 -> 3 -> 9
return 0;
}

この連結リスト可視化ツールは、C++のノードとポインターで作る単方向連結リストが実際にどう動くかを見せてくれます。最大12ノードのリストを生成し、挿入、削除、検索、反転、表示といった操作をキューに追加して、1ステップずつ再生できます。各ステップでは、対応するC++コードの行が強調され、現在のノードとポインターの動きが示されます。データ構造の授業や、ポインター操作の理解に役立ちます。処理はブラウザー内で行われます。

使い方

  1. ノード数を選び、「新しいリスト」を押して、ランダムな値のリストを生成します。
  2. 操作を選び、必要なら値を入力します。挿入では先頭か末尾かも選びます。
  3. 「追加」を押して操作をチップとしてキューに入れ、必要なだけ繰り返します。
  4. 「再生」を押すか1ステップずつ進め、速度を調整しながら強調されるコード行を追います。

よくある質問

どんな連結リストを表示しますか?
単方向連結リストです。各ノードは値と次のノードへのポインターを持ち、リストは先頭ポインターとノード数のカウンターを保持します。
どんな操作をシミュレーションできますか?
先頭または末尾への挿入、削除、値の検索、リストの反転、表示です。複数をつなげて、それぞれの効果を確認できます。
コードは何の言語で表示されますか?
コードパネルにはC++が表示され、アニメーションの各ステップで実行中の行が強調されます。

関連ツール