Связный список

Пошаговый разбор односвязного списка на указателях C++.

Всё моделируется в этом браузере; ничего не отправляется на сервер.

Значения

Создаём новый узел

Создаём новый узел

n_ = 0
Отсоединённый узел
42
0x1010Указатель
nullptr
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 узлов, ставите в очередь операции вроде вставки, удаления, поиска, разворота или вывода и воспроизводите их шаг за шагом. Каждый шаг подсвечивает соответствующую строку кода C++, отмечает текущий узел и рисует указатели, включая nullptr и отсоединённый узел в момент перестройки связей. Он помогает понять обход от головы, изменение связей при развороте и разницу между вставкой в начало и в конец. Всё моделируется в вашем браузере.

Как пользоваться

  1. Выберите количество узлов и нажмите New list, чтобы создать список со случайными значениями.
  2. Выберите операцию, введите значение, если оно нужно, а для вставки укажите, в начало или в конец она идёт.
  3. Нажмите Add, чтобы поставить операцию в очередь в виде карточки, и повторите столько раз, сколько нужно.
  4. Нажмите Play или двигайтесь пошагово, меняя скорость и следя за подсвеченной строкой кода.

Часто задаваемые вопросы

Какой вид связного списка показан?
Односвязный список: каждый узел хранит значение и указатель на следующий, а сам список хранит голову и счётчик узлов.
Какие операции можно моделировать?
Вставку в начало или в конец, удаление, поиск значения, разворот списка и его вывод. Можно выстроить несколько операций подряд и увидеть эффект каждой.
На каком языке показан код?
Панель кода показывает C++ и подсвечивает строку, которая выполняется на каждом шаге анимации.

Похожие инструменты