Académique Documents
Professionnel Documents
Culture Documents
Rappel et Introduction
Une liste simplement chainée est caractérisée par l’adresse Le pointeur du dernier
(L) du premier élément qui s’appelle pointeur début élément doit pointer sur NIL
2
I. Rappel et Introduction
✓Les listes doublement chaînées sont des structures de données semblables aux
listes simplement chaînées.
✓L'allocation de la mémoire est réalisée au moment de l'exécution.
✓En comparaison aux listes simplement chaînées :
➢La liaison entre les éléments se fait grâce à deux pointeurs :
3
I. Rappel et Introduction
4
II. Liste doublement chaînée
II.1 Définition
➢C'est une structure de données où à partir d’un élément on peut accéder aussi bien
à son suivant qu’à son précédent. C’est une liste à chaînage double.
5
II. Liste doublement chaînée
Remarques :
✓ Le pointeur précèdent du premier élément doit pointer vers NIL.
✓ Le pointeur suivant du dernier élément doit pointer vers NIL (la fin de la liste).
6
II. Liste doublement chaînée
II.2 Déclaration
Pour déclarer une liste double, nous avons besoin de :
✓Déclarer la structure principale correspondante à une cellule de la liste
✓Déclarer un pointeur sur la première cellule (tête) de la liste
Type
Cellule = Enregistrement
donnée : Type_élément
precedent : pointeur sur Cellule
suivant : pointeur sur Cellule
Fin
LD = pointeur sur Cellule
Var Liste : LD
➢Un nouveau type LD est définit. C’est un pointeur sur une cellule.
➢ L’adresse de la première cellule de la liste est sauvegardée dans une
variable Liste. Cette variable est donc de type pointeur sur Cellule.
7
II. Liste doublement chaînée
II.2 Déclaration suite
Si P est un pointeur qui pointe sur une cellule de type liste chaînée double
alors il est déclaré par : Var P : LD ou bien Var P:Pointeur sur Cellule
✓La création d’une cellule de la liste se fait par la fonction prédéfinie nouveau().
8
II. Liste doublement chaînée Application 1:
1) On désire déclarer une liste doublement chainée permettant de manipuler une
liste d'étudiants. Chaque étudiant est repéré par un Cin, un Nom, un Prénom et une
moyenne. Définir la structure cellule (etudiant) correspondante.
Type
Etudiant = Enregistrement
Cin: entier ; Nom, Prenom : chaine ; moy : réel
précedent : pointeur sur Etudiant
suivant : pointeur sur Etudiant
Fin
2) Déclarer un nouveau type LD qui est un pointeur sur une cellule étudiant.
Type
LD = pointeur sur Etudiant
3) Déclarer une liste L de type LD et l’initialiser à Nil
Var L : LD
L Nil
4) Déclarer une variable p (pointeur) de type LD et faite lui allouer un espace mémoire
Var p : LD
p = nouveau (Etudiant)
9
III. Les opérations sur les listes doublement chaînées
III.1 Initialisation
Cette opération doit être faite avant toute autre opération sur la liste.
Elle initialise le pointeur début à NIL. La liste est pointée par L.
10
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d'un élément à une liste doublement chaînée
Il y a plusieurs cas d'insertion d'un élément dans une liste:
➢Insertion dans une liste vide
➢Insertion au début de la liste
➢Insertion à la fin de la liste
➢Insertion en une position dans la liste
11
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d’un élément à une liste doublement chaînée
12
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d’un élément à une liste doublement chaînée
III.2.1) Insertion dans une liste vide
13
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d’un élément à une liste doublement chaînée
III.2.1) Insertion dans une liste vide
Application 2:
Ecrire une procédure Ajout_Etudiant_Vide(L:LD) qui permet d'ajouter
un Etudiant à une liste d'étudiants vide (Application 1) .
14
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d’un élément à une liste doublement chaînée
III.2.1) Insertion dans une liste vide
Application 2:
Ecrire une procédure Ajout_Etudiant_Vide (L:LD) qui permet d'ajouter
un Etudiant à une liste d'étudiants vide (Application 1) .
15
III. Les opérations sur les listes doublement chaînées
III.2 Ajout d’un élément à une liste doublement chaînée
III.2.2) Ajout d'un élément en tête d'une liste chainée
Étapes :
1. Allocation de la mémoire pour le nouvel élément,
2. Remplir le champ de données du nouvel élément,
16
III.2 Ajout d'un élément à une liste doublement chaînée
17
III.2 Ajout d'un élément à une liste doublement chaînée
18
III.2 Ajout d'un élément à une liste doublement chaînée
III.2.3) Ajout d'un élément à la fin d'une liste chainée :
Étapes :
1. Allouer de la mémoire pour le nouvel élément
2. Remplir le champ de données du nouvel élément,
3. Le pointeur suivant du nouvel élément pointe vers NIL,
4. Le pointeur précédent du nouvel élément pointe vers le dernier élément,
5. Le pointeur suivant du dernier élément pointe vers le nouvel élément.
19
III.2 Ajout d'un élément à une liste doublement chaînée
III.2.3) Ajout d'un élément à la fin d'une liste chainée
Procedure Ajout_en_queue (Var L : LD, x : type_element)
Var p, q : LD
Début
p = nouveau (cellule)
p→donnee ← x
p→suivant ← NIL
Si (L = NIL) Alors
p→precedent ← NIL
L←p
Si non
q ← Dernier(L)
p→precedent ← q
q→suivant ← p
Fin Si
Fin
20
III.2 Ajout d'un élément à une liste doublement chaînée
22
III.2 Ajout d'un élément à une liste doublement chaînée
III.2.4) Insertion après une position dans une liste chainée
Procedure Inserer_apres(Var L :LD, q: LD , x : type_element )
Var p : LD
Début
p = nouveau (cellule)
p→donnée ← x
Si (L = NIL) Alors
p→suivant ← NIL
p→precedent ← NIL
L ←p
Si non
p→suivant ← q→suivant
q→suivant→precedent ← p
p→precedent ← q
q→suivant ← p
Fin Si
Fin
23
III. Les opérations sur les listes doublement chaînées
III.3 Suppression d'un élément d'une liste doublement chainée
Par rapport aux listes simplement chaînées où la suppression ne peut ne pas
être faite qu'après un élément désigné, les listes doublement chaînées sont
plus maniables grâce aux 2 pointeurs qui permettent de garder une trace en
arrière comme en avant.
Il y a plusieurs cas de suppression d'un élément d'une liste doublement
chainée :
✓Suppression de l'élément de début de la liste,
✓Suppression de l'élément à une position dans la liste,
✓Suppression du dernier élément de la liste.
✓Suppression avant une position.
✓Suppression après une positon
✓Suppression basée sur les données.
✓. ……
24
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.1 Suppression d'un élément du début d'une liste chainée
➢La liste est supposée être non vide (L ≠ NIL).
Étapes:
•Affecter l'adresse de début de la liste à une variable pointeur p
•Le pointeur sur début de la liste L pointe vers la deuxième cellule
•Le champ précédent de la première cellule L pointe vers NIL
•Libérer l'espace mémoire pointé par la variable p
25
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.2 Suppression d'un élément à une position dans une liste doublement chainée
✓ L'élément pointé par position est supposé avoir un suivant.
26
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.3 Suppression du dernier élément d'une liste doublement chainée
Etapes
1) Affecter l'adresse du dernier élément de la liste à une variable pointeur p
2) Affecter l'adresse du précédent de p à une variable pointeur q
3) Le champ suivant du la cellule pointée par q pointe vers NIL
4) Libérer l'espace mémoire pointé par la variable p
Procedure Suppression_dernier (L : LD)
Var p, q : LD
Début
p ← Dernier(L)
q ← p→precedent
q.suivant ←NIL
p→precedent←NIL
Libérer (p)
Fin
27
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.5 Suppression basée sur les données
✓ Il s'agit de supprimer un élément en se basant sur la valeur de son champ
donnée.
✓ Il faut tout d'abord définir une fonction qui cherche la position de l'élément
dans la liste. Elle renvoie un pointeur sur l'adresse de l'élément à supprimer s'il
a été trouvé.
✓ Trois cas sont possibles pour tout élément trouvé :
➢ L'élément est le premier de la liste. Il faut dans ce cas faire appel à la
procédure Suppresion_sommet ( ).
28
III.3 suppression d'un élément d'une liste doublement chainée
29
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.5 Suppression basée sur les données