Vous êtes sur la page 1sur 31

I.

Rappel et Introduction

Liste simplement chaînée Cellule = élément


de la liste

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

Si P est un pointeur sur cellule de la liste:


Chaque élément (cellule) de la liste est
P→donnée ou *P.donnée désigne :
représenté par un enregistrement formé
La « donnée » de la cellule pointée par P
au moins de deux champs:
Champ 1 : donnée (entier, réel, …) P→suivant ou *P.suivant désigne :
Champ 2 : suivant (pointeur) L’adresse de la cellule qui suit la cellule pointée par P

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 :

•un qui pointe vers l'élément précédent et


•un qui pointe vers l'élément suivant.

Liste doublement chaînée

3
I. Rappel et Introduction

➢Le déplacement dans la liste se fait dans les deux directions :


•du premier vers le dernier élément et/ou
•du dernier vers le premier élément.

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.

✓A chaque élément de la liste est associé, en mémoire, un emplacement représentant


un enregistrement contenant au moins trois champs :

➢le premier contient les données,


➢le deuxième contient l’adresse en mémoire de l’élément précédent et
➢ le troisième contient l’adresse en mémoire de l’élément suivant.

✓En mémoire, une liste chaînée double a la représentation suivante :

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).

✓Le parcours de la liste peut se faire dans les deux sens :


•En commençant à partir de la tête, le pointeur suivant permet le déplacement vers
l'élément suivant.
•En commençant à partir de la queue, le pointeur précèdent permet le déplacement
vers l'élément précédent.

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

*P.donnée (ou P→donnée)


désigne le champ « donnée » qui contient le(s) donnée(s) de la cellule pointée par P.
*P.suivant (ou P → suivant)
désigne « l’adresse de la cellule » suivante
*P.précédent (ou P → précédent)
désigne « l’adresse de la cellule » précédente,

✓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.

Procédure Initialiser (Var L : LD)


Début
L ←NIL
Fin 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

III.2.1) Etapes d’insertion dans une liste vide


1. Allocation de la mémoire pour le nouvel élément
2. Remplir les champs de donnée du nouvel élément
3. Le pointeur précédent du nouvel élément pointera vers NIL
4. Le pointeur suivant du nouvel élément pointera vers NIL
5. Le pointeur début de la liste pointe vers le nouvel élément

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

Procedure Ajout_liste_vide (Var L :LD, x : Type_élément)


Var p : LS
Début
p = nouveau (Cellule)
*p. donnee ← x // p→donnee  x
*p.precedent ← NIL // p→precedent  NIL
*p.suivant ← NIL // p→suivant  NIL
L←p
Fin

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) .

Procedure Ajout_Etudiant_vide (Var L :LD)


Var p : LD
Début
p = nouveau (Etudiant)
Lire(p→cin) ; Lire(p→nom); Lire(p→prenom) ; lire(p→moy))
p→precedentNIL
p→suivant  NIL
Lp
Fin

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,

3. Le pointeur précédent du nouvel élément pointe vers NIL,


4. Le pointeur suivant du nouvel élément pointe vers le 1er élément,
5. Le pointeur précédent du premier élément pointe vers le nouvel élément,
6. Le pointeur début (L) pointe vers le nouvel élément.

16
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

Procedure Ajout_sommet (Var L : LD, x : type_element)


Var p : LD
Début
p = nouveau (Cellule)
p→donnée ←x
p→précédent ←NIL
p→suivant ← L
L→précédent ← p
L←p
Fin

17
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


Application 3:
Ecrire l’algorithme d'une procédure Ajout_Etudiant_sommet(L:LD) qui permet
d'ajouter un Etudiant au début d’une liste d'étudiants sachant que les données sont
fournies par l'utilisateur

Procedure Ajout_etudiant_sommet(var L:LD)


Var
p:LD;
Début
// allocation de l’espace pour le nouveau etudiant
p=nouveau(Etudiant)
lire(p→cin) ; lire(p→nom) ; lire(p→prenom) ; lire(p→moy)
p→ precedent  Nil
p→ suivant  L
L→ precedent  p
LP
Fin

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

III.2.2) Ajout d'un élément en queue d'une liste chainée


Application 4:
Ecrire l’algorithme d'une procédure Ajout_Etudiant_queue(L:LD) qui permet
d'ajouter un Etudiant à la fin d’une liste d'étudiants sachant que les données sont
fournies par l'utilisateur

Procedure Ajout_etudiant_queue(var L:LD)


Var
p, q:LD;
Début
// allocation de l’espace pour le nouveau etudiant
p=nouveau(Etudiant)
lire(p→cin) ; lire(p→nom) ; lire(p→prenom) ; lire(p→moy)
p→ suivant  Nil
Si (L=Nil) Alors
p→ precedent  Nil
L p
Sinon
qdernier(L)
p→precedent  q
q→ suivant  p
Fin
21
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


1)Allouer de la mémoire et remplir le champ données pour le nouvel élément p.
2)Choisir une position q dans la liste (l'insertion se fera après la position choisie).
3)Le pointeur suivant du nouvel élément (p) pointe vers le suivant de l'élément choisit (q),
4)Le pointeur précédent du suivant de q pointe vers le nouvel élément p.
5)Le pointeur précédent de p pointe vers q.
6)Le pointeur suivant de q pointe vers p.

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

Procedure Suppresion_sommet (Var L : LD)


Var p : LD
Début
p ←L
L ←L→suivant
L→precedent ← NIL
Libérer (p)
Fin

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.

Procedure Suppression_position (L : LD, position : LD)


Var p, q: LD
Début
p ←position→suivant
q ←position→precedent
q→suivant ← p
p→precedent ← q
Libérer (position )
Fin

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 ( ).

➢ L'élément est le dernier de la liste. Il faut dans ce cas faire appel à la


procédure Suppression_dernier ().

➢ L'élément n'est ni le premier ni le dernier de la liste. Il faut dans ce


cas faire appel à la procédure Suppression_position ().

28
III.3 suppression d'un élément d'une liste doublement chainée

III.3.5 recherche basée sur les données


Fonction Recherche (y : données, L : LD) : LD
Var
p : LD
Début
p←L
Tant que (p ! = NIL) Faire
Si (p→donnée = y) Alors
retourner (p)
Fin Si
p ← p→suivant
Fin Tant que
Retourner (NIL)
Fin

29
III.3 Suppression d'un élément d'une liste doublement chainée
III.3.5 Suppression basée sur les données

Procedure supprimer (y : données, L: LD)


Var
trouve : booléen ; p,q : LD
Début
p ←Recherche (y, L)
Si (p ≠Nil) Alors
Si (p = L) Alors
L ← Suppresion_sommet (L )
Sinon Si (p→suivant = Nil) Alors
L ← Suppresion_dernier (L)
Sinon
L ← Suppression_position (L, p)
Fin Si
Fin Si
Sinon
Ecrire(" il n existe aucun element ayant la valeu y")
Fin Si
Fin
30
Merci pour votre
Attention

Vous aimerez peut-être aussi