Vous êtes sur la page 1sur 20

Module : Structures de données et programmation

C++
Élément 1: Structures de données

Filière : Génie Informatique, Semestre 2


Année Universitaire 2020-2021

Pr. Rachid AIT DAOUD


Listes doublement chainées

2
Listes doublement chainées
1. Définition :

▪ Une liste doublement chainée est une structure de données dynamique


contenant une séquence finie des cellules.

▪ La cellule (noeud) est la composante principale d'une liste doublement chainée.

▪ Une liste doublement chaînée est une liste chaînée, dans laquelle on peut
accéder à l’élément prédécesseur :

NULL Cellule 1 Cellule 2 Cellule 3 NULL


100 101 102

Client 1 Client 2 Client 3


3
Listes doublement chainées
1. Définition :

Une cellule est une structure qui comporte trois champs :


▪ Le champ data : il contient des informations sur l‘élément représenté par la cellule.
▪ Le champ suivant : il représente un pointeur qui contient l'adresse de la cellule suivante.
▪ Le champ précédent : il représente un pointeur qui contient l'adresse de la cellule précédente.

Exemple: élément d’une liste doublement chainée


data
199 Ali 200

Cellule 1 next struct cellule {


@ cellule suivante char nom[20];
int phone;
prev struct cellule *next;
struct cellule *prev;
@ cellule précédente }
4
Listes doublement chainées
2. Représentation graphique:

Nom du client Ali Omar Ahmed Othman


@ client suivant @101 @102 @103 NULL
@ client précédent NULL @100 @101 @102
@ propre de chaque @100 @101 @102 @103
client

5
Listes doublement chainées
3. Points communs : Liste doublement chainée & Liste simplement chainée

Les listes doublement chaînées sont des structures


semblables aux listes simplement chaînées .
✓ Structures permettant de stocker une collection de données de même type.
✓ L'espace mémoire utilisé n'est pas contigüe.
✓ La taille est inconnue à priori.
✓ Une liste doublement chainée est constituée de cellules qui sont liées entre elles par
des pointeurs.
✓ Pour accéder à un élément quelconque d'une liste, il faut parcourir la liste jusqu' à cet
élément.
6
Listes doublement chainées
4. Différences:

Pour une liste doublement chainée :


▪ On peut accéder directement au premier et dernier élément
▪ On peut parcourir la liste dans les 2 sens (on peut donc revenir en arrière).

prev data next

7
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:

1. A l’aide d’un seul pointeur

2. A l’aide de deux pointeurs


Pour parcourir la liste en deux sens
▪ A partir de début jusqu’à la fin
▪ A partir de la fin jusqu’au début

8
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:

5.1. A l’aide d’un seul pointeur

❑ Liste des opérations:


▪ Insertion
▪ Affichage
▪ Suppression

9
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:

5.1. A l’aide d’un seul pointeur @700


5.1.1 Insertion au début
@700

→ Objectif: Ajouter le client Youssef au début de la liste

Youssef
1. Créer la nouvelle cellule client avec malloc(). @100
2. Remplir les champs nom, prev et next.
3. Faire lier l’ancienne première cellule avec la nouvelle cellule. NULL
4. Modifier la tête par l’adresse de la nouvelle cellule. @700

10
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.1 Insertion au début @700

→ Objectif: Ajouter le client Youssef au début de la liste


1. Créer la nouvelle cellule client avec malloc().
2. Remplir les champs data, prev et next.
3. Modifier la tête par l’adresse de la nouvelle cellule. Youssef
@100
NULL
@700

Exemple de Passage par adresse


11
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.2 Insertion à la fin
@800
→ Objectif: Ajouter le client Maurad à la fin de la liste

1. Créer la nouvelle cellule client avec malloc(). Maurad


2. Remplir les champs nom et next. NULL
3. Récupérer l’adresse de la dernière cellule (ptr->next == NULL)
@103
4. Faire lier l’ancienne dernière cellule avec la nouvelle cellule.
✓ En remplissant le champ prev de la nouvelle cellule par l’adresse de l’ancienne dernière cellule. @800
✓ En modifiant le champ next de l’ancienne dernière cellule par l’adresse de la nouvelle cellule.

12
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.2 Insertion à la fin
@800

Exercice: Maurad
Ecrire deux fonctions: NULL
▪ RecupDerniereAdresse(): Permet de récupérer l’adresse de la dernière cellule.
▪ AjouFinListD(): Utilise la fonction RecupDerniereAdresse() pour ajouter un nouveau @103
client à la fin de la liste. @800

13
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.2 Insertion à la fin
@800

Maurad
NULL
@103
@800

14
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.3 Insertion au milieu

→ Objectif: Ajouter le client Zakaria au milieu de la liste


(après le client Omar).
Zakaria
1. Vérifier que la liste n’est pas vide (tete != NULL).
2. Parcourir la liste jusqu’à l’arrivé à la cellule ou le client concerné clientX(=Omar).
3. Si le client existe, on va créer une nouvelle cellule avec malloc().
4. Remplir le champ nom. @900
5. Faire lier le nouveau client (Zakaria) avec le client qui suive le client recherché (Ahmed).
✓ En remplissant le champ next du nouveau client par l’adresse du client qui suive le client recherché (Ahmed)
✓ En modifiant le champ prev du client qui suive le client recherché (Ahmed) par l’adresse du nouveau client.
6. Faire lier le client recherché clientX(=Ali) avec le nouveau client.
✓ En remplissant le champ prev du nouveau client par l’adresse du client recherché.
✓ En modifiant le champ next du client recherché par celle du nouveau client.
15
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.3 Insertion au milieu

→ Objectif: Ajouter le client Zakaria au milieu de la liste


(après le client Omar).

Exercice: Zakaria
Ecrire une procédure qui permet d’ajouter un nouveau client juste après le client Omar.

@900

16
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.3 Insertion au milieu

17
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.3 Insertion au milieu

→ Objectif: Ajouter le client Zakaria au milieu de la liste


(avant le client Omar).
Zakaria
1. Vérifier que la liste n’est pas vide (tete != NULL).
2. Parcourir la liste jusqu’à l’arrivé à la cellule ou le client concerné clientX(=Omar).
3. Si le client existe, on va créer une nouvelle cellule avec malloc().
4. Remplir le champ nom. @900
5. Faire lier le nouveau client (Zakaria) avec le client recherché et le celui qui précède ce dernier (Omar).
✓ En remplissant le champ next du nouveau client par l’adresse du client recherché (Omar).
✓ En remplissant le champ prev du nouveau client par l’adresse du client qui précède le client recherché.
✓ En modifiant le champ next du client qui précède le client recherché par celle du nouveau client.
✓ En modifiant le champ prev du client recherché par celle du nouveau client.

18
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:
5.1 A l’aide d’un seul pointeur
5.1.3 Insertion au milieu
→ Objectif: Ajouter le client Zakaria au milieu de la liste (avant le client Omar).

19
Listes doublement chainées
5. Implémentation d’une liste doublement chainée:

A Suivre…

20

Vous aimerez peut-être aussi