Verkettete Liste

Eine einfach verkettete Liste mit C++-Zeigern Schritt für Schritt durchgehen.

Alles wird in diesem Browser simuliert; nichts wird an einen Server gesendet.

Werte

Neuen Knoten erstellen

Neuen Knoten erstellen

n_ = 0
Losgelöster Knoten
42
0x1010Zeiger
cabeza_
nullptr — Leere Liste
  • Aktuell
  • Zeiger

Schritt 1 / 46

Code

#include <iostream>
using namespace std;
class Nodo { // Ein Knoten enthält die Daten und einen Zeiger auf den nächsten
private: // Private Attribute: nur die Methoden greifen darauf zu
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_; // Erster Knoten der Liste
int n_; // Anzahl der Knoten
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) { // Am Anfang einfügen: O(1)
Nodo* nuevo = new Nodo(valor); // Knoten erzeugen
nuevo->setSiguiente(cabeza_); // Der neue Knoten zeigt auf den alten Kopf
cabeza_ = nuevo; // cabeza_ zeigt jetzt auf den neuen Knoten
n_++;
}
void insertarFinal(int valor) { // Am Ende einfügen: O(n)
Nodo* nuevo = new Nodo(valor); // Knoten erzeugen
if (cabeza_ == nullptr) { // Leere Liste?
cabeza_ = nuevo;
} else {
Nodo* actual = cabeza_;
while (actual->getSiguiente() != nullptr) { // Bis zum Ende laufen
actual = actual->getSiguiente();
}
actual->setSiguiente(nuevo); // Neuen Knoten hinter dem Ende anhängen
}
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; // Daten vergleichen
actual = actual->getSiguiente();
indice++;
}
return -1; // Nicht gefunden
}
void eliminarNodo(int indice) {
if (indice < 0 || indice >= n_) return; // Index prüfen
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
for (int i = 0; i < indice; i++) {
anterior = actual;
actual = actual->getSiguiente();
}
if (anterior == nullptr)
cabeza_ = actual->getSiguiente(); // Es war der Kopf
else
anterior->setSiguiente(actual->getSiguiente()); // Knoten überspringen
delete actual; // Speicher freigeben
n_--;
}
void invertirLista() {
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
while (actual != nullptr) {
Nodo* siguiente = actual->getSiguiente(); // Nächsten Knoten merken
actual->setSiguiente(anterior); // Verkettung umdrehen
anterior = actual;
actual = siguiente;
}
cabeza_ = anterior; // Der letzte Knoten wird zum Kopf
}
void imprimirLista() const {
for (Nodo* p = cabeza_; p != nullptr; p = p->getSiguiente()) { // Liste durchlaufen
cout << p->getDato();
if (p->getSiguiente() != nullptr) cout << " -> "; // Trennzeichen zwischen den Werten
}
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;
}

Diese Visualisierung zeigt, wie eine einfach verkettete Liste aus C++-Knoten und Zeigern wirklich funktioniert. Sie erzeugen eine Liste mit bis zu 12 Knoten, reihen Operationen wie Einfügen, Entfernen, Suchen, Umkehren oder Ausgeben in eine Warteschlange und spielen sie Schritt für Schritt ab. Jeder Schritt hebt die passende Zeile des C++-Codes hervor, markiert den aktuellen Knoten und zeichnet die Zeiger, einschließlich nullptr und des abgetrennten Knotens, während die Liste neu verkettet wird. So verstehen Sie das Durchlaufen vom Kopf aus, wie sich Verknüpfungen beim Umkehren ändern und den Unterschied zwischen Einfügen am Kopf oder am Ende. Alles wird in Ihrem Browser simuliert.

So funktioniert es

  1. Wählen Sie die Anzahl der Knoten und drücken Sie Neue Liste, um eine Liste mit zufälligen Werten zu erzeugen.
  2. Wählen Sie eine Operation, geben Sie bei Bedarf einen Wert ein und legen Sie beim Einfügen fest, ob am Kopf oder am Ende eingefügt wird.
  3. Drücken Sie Hinzufügen, um die Operation als Chip in die Warteschlange zu stellen, und wiederholen Sie das beliebig oft.
  4. Drücken Sie Abspielen oder gehen Sie Schritt für Schritt vor und passen Sie die Geschwindigkeit an, während Sie der hervorgehobenen Codezeile folgen.

Häufig gestellte Fragen

Welche Art verketteter Liste wird gezeigt?
Eine einfach verkettete Liste: Jeder Knoten speichert einen Wert und einen Zeiger auf den nächsten Knoten, und die Liste hält ihren Kopf und einen Knotenzähler.
Welche Operationen kann ich simulieren?
Einfügen am Kopf oder am Ende, Entfernen, Suchen nach einem Wert, Umkehren der Liste und Ausgeben. Sie können mehrere verketten und die Wirkung jeder beobachten.
In welcher Sprache wird der Code gezeigt?
Der Codebereich zeigt C++ und hebt bei jedem Schritt der Animation die gerade ausgeführte Zeile hervor.

Verwandte Tools