Chapitre 5
LISTES CHAINEES
 
 
Précédent Suivant
 

Listes chaînées
Caractéristiques
* Liste "simplement" chaînée
* Chaînage entre eux des éléments à stocker
* Chaque élément connaît son successeur
* Structure de données flexible
* Pas de limite de capacité (allocation dynamique)
* Ajout / suppression d'un élément très rapide
* Contrairement au tableau
* Accès direct difficile
* Pas d'accès par indice
* Il faut parcourir pour trouver un élément
* Liste "doublement" chaînée
* Chaque élément connaît son prédécesseur et son successeur
Structure (1/2)
* Une liste chaînée est composée de maillons
* Un maillon = élément stocké + pointeurs suivant/précédent
class Maillon {
public:
Element element;
Maillon * suivant;
Maillon * precedent;
};
* La liste référence seulement le premier et le dernier maillon
class Liste {
private:
Maillon * tete;
Maillon * fin;
...
};
Structure (2/2)
Ajouter un élément
* Situation 1: en tête de liste
* Cas liste vide
* Cas liste non vide
* Situation 2: en fin de liste
* Cas liste vide
* Cas liste non vide
* Situation 3: n'importe où dans la liste
* Il faut alors indiquer la position de l'insertion
* C'est-à-dire le maillon avant lequel faire l'insertion
Ajout en tête (1/2)
* Créer un maillon ==> m
* Si liste vide
1) liste.tete = m;
2) liste.fin = m;
Ajout en tête (2/2)
* Si liste non vide
1) m?suivant = liste.tete;
2) liste.tete?precedent = m;
3) liste.tete = m;
Ajout en fin
* Si liste vide ==> idem ajout en tête
* Si liste non vide
1) m?precedent = liste.fin;
2) liste.fin?suivant = m;
3) liste.fin = m;
Ajout n'importe où (1/2)
* Il faut connaître la position d'ajout ==> maillon p
* On choisit d'ajouter juste avant le maillon p
* Si p = 0 ==> ajout en fin
* Si p?precedent = 0 ==> ajout en tête
* Sinon
1) m?precedent = p?precedent;
2) m?suivant = p;
3) p?precedent?suivant = m;
4) p?precedent = m;
Ajout n'importe où (2/2)
Parcourir une liste
* Principe
* Pointer sur le maillon de tête
* Avancer en utilisant le pointeur sur le suivant
* Tant que ce pointeur n'est pas nul
* Algorithme
m = liste.tete;
tant que (m ? 0) faire
TRAITEMENT(m);
m = m?suivant;
fin tant que
Retirer un élément
* Retrait en tête
1) m = liste.tete;
2) liste.tete = m?suivant;
3) liste.tete?precedent = 0;
* Retrait en fin
1) m = liste.fin;
2) liste.fin = m?precedent;
3) liste.fin?suivant = 0;
* Retrait de n'importe quel maillon m
1) m?suivant?precedent = m?precedent;
2) m?precedent?suivant = m?suivant;
* Penser...
* A libérer la mémoire du maillon m
* Aux cas particuliers (liste vide ou avec un seul élément)