Liste chaînée

Parcourez pas à pas une liste simplement chaînée avec des pointeurs C++.

Tout est simulé dans ce navigateur ; rien n'est envoyé à un serveur.

Valeurs

Créer le nouveau nœud

Créer le nouveau nœud

n_ = 0
Nœud détaché
42
0x1010Pointeur
cabeza_
nullptr — Liste vide
  • Courant
  • Pointeur

Étape 1 / 46

Code

#include <iostream>
using namespace std;
class Nodo { // Un nœud contient la donnée et un pointeur vers le suivant
private: // Attributs privés : seules les méthodes y touchent
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_; // Premier nœud de la liste
int n_; // Nombre de nœuds
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) { // Insertion en tête : O(1)
Nodo* nuevo = new Nodo(valor); // Créer le nœud
nuevo->setSiguiente(cabeza_); // Le nouveau nœud pointe vers l'ancienne tête
cabeza_ = nuevo; // cabeza_ pointe maintenant vers le nouveau nœud
n_++;
}
void insertarFinal(int valor) { // Insertion en queue : O(n)
Nodo* nuevo = new Nodo(valor); // Créer le nœud
if (cabeza_ == nullptr) { // Liste vide ?
cabeza_ = nuevo;
} else {
Nodo* actual = cabeza_;
while (actual->getSiguiente() != nullptr) { // Parcourir jusqu'à la queue
actual = actual->getSiguiente();
}
actual->setSiguiente(nuevo); // Relier le nouveau nœud après la queue
}
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; // Comparer la donnée
actual = actual->getSiguiente();
indice++;
}
return -1; // Introuvable
}
void eliminarNodo(int indice) {
if (indice < 0 || indice >= n_) return; // Valider l'indice
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
for (int i = 0; i < indice; i++) {
anterior = actual;
actual = actual->getSiguiente();
}
if (anterior == nullptr)
cabeza_ = actual->getSiguiente(); // C'était la tête
else
anterior->setSiguiente(actual->getSiguiente()); // Contourner le nœud
delete actual; // Libérer la mémoire
n_--;
}
void invertirLista() {
Nodo* anterior = nullptr;
Nodo* actual = cabeza_;
while (actual != nullptr) {
Nodo* siguiente = actual->getSiguiente(); // Sauvegarder le nœud suivant
actual->setSiguiente(anterior); // Inverser le lien
anterior = actual;
actual = siguiente;
}
cabeza_ = anterior; // Le dernier nœud devient la tête
}
void imprimirLista() const {
for (Nodo* p = cabeza_; p != nullptr; p = p->getSiguiente()) { // Parcourir la liste
cout << p->getDato();
if (p->getSiguiente() != nullptr) cout << " -> "; // Séparateur entre les valeurs
}
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;
}

Ce visualiseur de liste chaînée montre comment fonctionne réellement une liste simplement chaînée construite avec des nœuds et des pointeurs C++. Vous générez une liste de 12 nœuds au maximum, mettez en file des opérations comme insertion, suppression, recherche, inversion ou affichage, et les rejouez pas à pas. Chaque étape met en évidence la ligne de code C++ correspondante, marque le nœud courant et dessine les pointeurs, y compris nullptr et le nœud détaché pendant le rechaînage de la liste. Vous comprenez ainsi le parcours depuis la tête, l'évolution des liens lors d'une inversion et la différence entre insérer en tête ou en queue. Tout est simulé dans votre navigateur.

Comment l'utiliser

  1. Choisissez le nombre de nœuds et appuyez sur Nouvelle liste pour générer une liste de valeurs aléatoires.
  2. Choisissez une opération, saisissez une valeur si nécessaire et, pour l'insertion, indiquez si elle va en tête ou en queue.
  3. Appuyez sur Ajouter pour mettre l'opération en file sous forme de pastille, puis répétez autant de fois que vous voulez.
  4. Appuyez sur Lecture ou avancez pas à pas, en réglant la vitesse tout en suivant la ligne de code surlignée.

Questions fréquentes

Quel type de liste chaînée montre-t-il ?
Une liste simplement chaînée : chaque nœud stocke une valeur et un pointeur vers le nœud suivant, et la liste conserve sa tête et un compteur de nœuds.
Quelles opérations peut-on simuler ?
Insertion en tête ou en queue, suppression, recherche d'une valeur, inversion de la liste et affichage. Vous pouvez en enchaîner plusieurs et observer l'effet de chacune.
Dans quel langage le code est-il affiché ?
Le panneau de code affiche du C++ et surligne la ligne exécutée à chaque étape de l'animation.

Outils associés