Lista encadeada

Acompanhe passo a passo uma lista simplesmente encadeada com ponteiros em C++.

Tudo é simulado neste navegador; nada é enviado a nenhum servidor.

Valores

Criar o novo nó

Criar o novo nó

n_ = 0
Nó solto
42
0x1010Ponteiro
nullptr
cabeza_
nullptr — Lista vazia
  • Atual
  • Ponteiro

Passo 1 / 46

Código

#include <iostream>
using namespace std;
class Nodo { // Um nó guarda o dado e um ponteiro para o próximo
private: // Atributos privados: só os métodos acessam
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_; // Primeiro nó da lista
int n_; // Número de nós
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) { // Inserir no início: O(1)
Nodo* nuevo = new Nodo(valor); // Criar o nó
nuevo->setSiguiente(cabeza_); // O novo nó aponta para a antiga cabeça
cabeza_ = nuevo; // cabeza_ agora aponta para o novo nó
n_++;
}
void insertarFinal(int valor) { // Inserir no fim: O(n)
Nodo* nuevo = new Nodo(valor); // Criar o nó
if (cabeza_ == nullptr) { // Lista vazia?
cabeza_ = nuevo;
} else {
Nodo* actual = cabeza_;
while (actual->getSiguiente() != nullptr) { // Percorrer até o fim
actual = actual->getSiguiente();
}
actual->setSiguiente(nuevo); // Ligar o novo nó após o último
}
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; // Comparar o dado
actual = actual->getSiguiente();
indice++;
}
return -1; // Não encontrado
}
void eliminarNodo(int indice) {
if (indice < 0 || indice >= n_) return; // Validar o índice
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
for (int i = 0; i < indice; i++) {
anterior = actual;
actual = actual->getSiguiente();
}
if (anterior == nullptr)
cabeza_ = actual->getSiguiente(); // Era a cabeça
else
anterior->setSiguiente(actual->getSiguiente()); // Pular o nó
delete actual; // Liberar a memória
n_--;
}
void invertirLista() {
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
while (actual != nullptr) {
Nodo* siguiente = actual->getSiguiente(); // Guardar o próximo nó
actual->setSiguiente(anterior); // Inverter a ligação
anterior = actual;
actual = siguiente;
}
cabeza_ = anterior; // O último nó passa a ser a cabeça
}
void imprimirLista() const {
for (Nodo* p = cabeza_; p != nullptr; p = p->getSiguiente()) { // Percorrer a lista
cout << p->getDato();
if (p->getSiguiente() != nullptr) cout << " -> "; // Separador entre os valores
}
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;
}

Este visualizador de lista encadeada mostra como funciona de verdade uma lista simplesmente encadeada feita de nós e ponteiros em C++. Você gera uma lista de até 12 nós, enfileira operações como inserir, remover, buscar, inverter ou imprimir e as reproduz um passo por vez. Cada passo destaca a linha correspondente do código C++, marca o nó atual e desenha os ponteiros, incluindo nullptr e o nó solto enquanto a lista é religada. Ajuda a entender a travessia a partir da cabeça, como os vínculos mudam ao inverter e a diferença entre inserir no início ou no fim. Tudo é simulado no seu navegador.

Como usar

  1. Escolha o número de nós e pressione Nova lista para gerar uma lista com valores aleatórios.
  2. Escolha uma operação, informe um valor se necessário e, para inserir, selecione se vai no início ou no fim.
  3. Pressione Adicionar para enfileirar a operação como um chip e repita quantas vezes quiser.
  4. Pressione Reproduzir ou avance passo a passo, ajustando a velocidade enquanto acompanha a linha de código destacada.

Perguntas frequentes

Que tipo de lista encadeada ele mostra?
Uma lista simplesmente encadeada: cada nó guarda um valor e um ponteiro para o próximo nó, e a lista mantém sua cabeça e um contador de nós.
Quais operações posso simular?
Inserir no início ou no fim, remover, buscar um valor, inverter a lista e imprimi-la. Você pode encadear várias e ver o efeito de cada uma.
Em que linguagem o código é exibido?
O painel de código mostra C++ e destaca a linha executada em cada passo da animação.

Ferramentas relacionadas