Vous êtes sur la page 1sur 10

4 LISTES CHAINEES ASD2

LISTES CHAINEES

I. Introduction
Les tableaux sont des structures de données fréquemment utiliser pour résoudre les
problèmes de stockage d’un ensemble important d’élément de même type en mémoire.
Cependant, l’utilisation des tableaux présente des contraintes concernant la taille et l’espace
mémoire occupée. Les tableaux doivent avoir une taille fixe définie au début du programme
pour pouvoir allouer cette espace dans la mémoire centrale de manière contigüe. Ceci peut
constituer un problème si la taille du tableau est très grande. En outre, il est possible que
l’utilisation de cet espace réservé soit réduite, ce qui engendre une perte de la capacité
mémoire de la machine. Par exemple, c’est une perte d’espace mémoire si nous créons un
tableau de mille éléments puis nous utilisons seulement dix cases. Encore, si le tableau est
saturé il n’est pas possible d’ajouter d’autres éléments.

Pour résoudre les problèmes de mémoire mentionnés, il faut utiliser les structures abstraites
de données, tel que les listes, les files, les piles, les arbres, les graphes. Dans ce chapitre,
nous allons étudier les listes.

II. Définition
Les listes sont des structures de données abstraites qui permettent de créer des éléments
non contigus et non limités. Une liste chainée est simplement une liste d'objet de même
type dans laquelle chaque élément contient :

 Des informations relatives au fonctionnement de l'application. Par exemple des noms


et prénoms de personnes avec adresses et numéros de téléphone pour un carnet
d'adresse.

 L'adresse de l'élément suivant ou une marque de fin s'il n'y a pas de suivant. C'est ce
lien via l'adresse de l'élément suivant contenue dans l'élément précédent qui fait la
« chaine » et permet de retrouver chaque élément de la liste.

1|Page
4 LISTES CHAINEES ASD2

L'adresse de l'objet suivant peut être :

 Une adresse mémoire récupérée avec un pointeur (liste chainée dynamique).

 Un indice de tableau récupéré avec un entier (liste chainée statique).

 Une position dans un fichier : C'est le numéro d'ordre de l'objet dans le fichier.

Que la liste chainée soit bâtie avec des pointeurs ou des entiers, c'est toujours le terme de
pointeur qui est utilisé : chaque élément « pointe » sur l'élément suivant, c'est-à-dire
possède le moyen d'y accéder. Une liste chainée peut se représenter ainsi :

Tête Queue

Les listes chainées dynamique donnent une solution pour remédier aux problèmes de
l’optimisation de l’utilisation de la mémoire, mais elles ont aussi des inconvénients. Le
tableau suivant résume les différences entre les tableaux et les listes.

Tableau Liste chainée


La taille doit être définie lors de la création La liste chainée dynamique n'a pas pour sa
Taille en du tableau. La taille du tableau fait partie de définition de nombre d'éléments. Ils sont ajoutés
mémoire la définition du tableau même pour les ou soustraits à la demande, pendant le
tableaux dynamiques. fonctionnement du programme.
impossible dans un tableau d'enlever une Aucun problème pour supprimer un élément de la
Supprimer
case. Il est éventuellement possible de liste et libérer la mémoire correspondante.
un
masquer un élément mais pas de retirer son
élément
emplacement mémoire.
Le tableau permet d'accéder à chaque Pour accéder à un élément il faut parcourir la liste
Accès à un
élément directement. C'est très rapide. séquentiellement jusqu'à trouver l’élément, ça
élément
peut être long.
Les tris de tableau ne nécessitent pas de Trier une chaine revient à construire une autre
reconstruire les liens entre les chaine en insérant dans l'ordre voulu chaque
emplacements mémoire du tableau. Il y a élément. Le mieux est de construire sa chaine en
Tris
juste à manipuler les valeurs afin de les mettant les éléments dans l'ordre dès le départ
avoir dans l'ordre voulu. plutôt que d'avoir à réorganiser l'ordre des
éléments dans la chaine.

2|Page
4 LISTES CHAINEES ASD2

III. Les types de listes chainées


Les listes chainées sont des objets alloués dynamiquement d’une manière non contigüe dans
la mémoire. Ainsi, il est essentiel de lier les éléments de la liste pour pouvoir la parcourir.
Chaque liste chainée peut être caractérisée par :

 Adresse du premier élément : Tête de la liste.

 Adresse du dernier élément : Queue de la liste.

 Adresse de l’élément courant.

 Le nombre courant des éléments.

Un élément de la liste est une structure contenant :

 Un champ de données : qui peut être une donnée simple (entier, réel, etc.) ou
composée tel qu’une structure.

 Un ou deux champs contenant une adresse : l’élément suivant et précédent.

Il existe deux modes de chainage des éléments d’une liste : le chainage simple et le chainage
double.

1. Liste à chainage simple

Elle consiste à ajouter à chaque élément un champ qui contient l’adresse mémoire de
l’élément suivant dans la liste. Le schéma suivant donne exemple de chainage simple :
Tête Queue
Suivant

Suivant

Suivant

NULL

Donnée Donnée Donnée Donnée

Ainsi, il est possible de parcourir la liste d’un élément à un autre dans un seul sens en
commençant par la tête de la liste puis prendre l’adresse de l’élément suivant jusqu’à arriver
à l’adresse vide (NULL).

3|Page
4 LISTES CHAINEES ASD2

2. Liste à chainage double

Elle consiste à ajouter à chaque élément deux champs, le premier contient l’adresse
mémoire de l’élément suivant, le deuxième champ contient l’adresse de l’élément
précédent. Le schéma suivant donne exemple de chainage double :

Tête Queue

Précédent
Précédent

Suivant
Suivant

NULL
NULL

Donnée Donnée Donnée

Une liste à chainage double permet de parcourir la liste dans les deux sens de la tête vers la
queue et inversement ce qui rend le parcours de la liste plus flexible et plus rapide.

IV. Les actions sur une liste chainée


Les actions sur liste chainée que ce soit à chainage simple ou double sont les mêmes. Il s’agit
des fonctions ou procédures qui permettent la gestion de la liste :

Initialisation d’une liste : initialiser les pointeurs tête et queue à NULL et le nombre
d’élément à zéro.

 Ajout d’un élément : au début, au milieu et à la fin.


 Suppression d’un élément : au début, au milieu et à la fin.
 Modification d’un élément.
 La rechercher d’un élément : en utilisant une liste triée et non triée.
 Vider toute la liste.
 Vérifier une liste si elle est vide ou non.
 Donner le nombre des éléments d’une liste.
 Copier une liste.

La différence entre les mises à jour pour les deux chainages c’est que pour le chainage
double il faut mettre à jour les deux champs « Suivant » et « Précédent », tandis que pour le
chainage simple il faut mettre à jour le champ « Suivant » seulement. Egalement, les champs
« Tête », « Queue », et « Nombre » doivent être mis à jour selon le cas lors de l’ajout ou de
la suppression.

4|Page
4 LISTES CHAINEES ASD2

1. Ajout d’un élément

Pour ajouter un élément à la liste il faut le créer, c’est-à-dire lui allouer de l’espace mémoire
puis l’ajouter à la position désirée soit au début, soit au milieu, soit à la fin de la liste.
L’insertion de l’élément implique la mise à jour des champs adresses suivants et précédents
qui sont concernés par l’ajout. Egalement, il faut mettre à jour le champ qui indique le
nombre d’élément de la liste et mettre à jour selon le cas le pointeur de la tête ou le
pointeur de la queue.

a. Ajout au début
Tête
Queue
Suivant

Suivant

Suivant

NULL
Donnée Donnée Donnée Donnée

b. Ajout au milieu
Suivant

Donnée

Tête Queue
Suivant

Suivant

Suivant

NULL
Donnée Donnée Donnée Donnée

c. Ajout à la fin

Queue
Tête
Suivant

Suivant

Suivant

NULL

Donnée Donnée Donnée Donnée

2. Suppression d’un élément

La suppression d’un élément de la liste implique des modifications comme l’ajout d’élément.
La suppression du premier élément implique le changement du pointeur de la tête vers
l’élément suivant. La suppression du dernier élément implique le changement du pointeur
de la queue vers l’élément précédent. Si l’élément à supprimer est au milieu alors il faut
changer le chainage avec l’élément précédent et l’élément suivant.

5|Page
4 LISTES CHAINEES ASD2

a. Supprimer la tête
Tête
Queue

Suivant

Suivant

Suivant

NULL
Donnée Donnée Donnée Donnée

b. Supprimer la queue
Queue
Tête
Suivant

Suivant

NULL

NULL
Donnée Donnée Donnée Donnée

c. Supprimer au milieu

Tête Queue
Suivant

Suivant

Suivant

NULL
Donnée Donnée Donnée Donnée

V. Quelques algorithmes
1. Chainage simple avec adresse de Tête seulement

Dans ce qui suit nous allons présenter quelques algorithmes pour la gestion d’une liste à
simple chainage. Chaque élément de la liste contient un entier et un pointeur qui pointe sur
l’élément suivant. On suppose que les éléments de la liste ne sont pas triés. Les structures
qui définissent la liste sont comme suit :

Structure Element
Donnée : entier
Suivant : pointeur sur Element
Fin structure

Structure Liste
Tête : pointeur sur Element
Taille : entier
Fin structure

6|Page
4 LISTES CHAINEES ASD2

 Initialisation

Procédure Init_Liste(L : pointeur sur Liste)


Début
L->Tête  NULL
L->Taille  0
Fin

 Ajout d’un élément à la fin

Procédure Ajout_Liste_Fin(L : pointeur sur Liste, D : entier)


Ptr, Dernier : pointeur sur Element
Début
PtrAllouer(Element)
Ptr->DonnéeD
Ptr->SuivantNUll

Si L->Tete=NULL alors // si la liste est vide


L->TetePtr
Sinon
DernierL->Tete
Tant que Dernier->Suivant <> NULL
Dernier Dernier->Suivant
Fin tant que
Dernier->Suivant Ptr // chainage avec le nouvel élément
Fin si

L->Taille L->Taille+1

Fin procédure

 Recherche d’un élément

Fonction Recherche_Liste(L : Liste, D : entier) retourne entier


Ptr : pointeur sur Element
Pos : entier
Début
PtrL.Tête
Pos0
Tant que Ptr<>NULL et Ptr->Donnée<>D
PtrPtr->Suivant
PosPos+1
Fin Tant que

Si Ptr<>Null alors
Retourne Pos
Sinon
Retourne -1
Fin si
Fin fonction

7|Page
4 LISTES CHAINEES ASD2

 Affichage de toute la liste

Procédure Affichage_Liste(L : Liste)


Ptr : pointeur sur Element
Début
Ptr  L.Tête
Tant que Ptr <> NULL
Ecrire(Ptr->Donnée)
Ptr  Ptr->Suivant
Fin Tant que

Fin

 Détruire toute la liste

Procédure Détruire_Liste(L : Pointeur sur Liste)


Ptr, Suiv : pointeur sur Element
Début
PtrL->Tête
Tant que Ptr<>Null
SuivPtr->Suivant
Libérer(Ptr)
PtrSuiv
Fin Tant que
L->TêteNULL
L->Taille0
Fin Procédure

 Supprimer un élément

Fonction Supprimer_Liste(L :Pointeur sur Liste, D : entier) retourne


entier
Ptr, Pred : pointeur sur Elem
Début
PtrL->Tete
PredNULL
Tant que Ptr<>NULL et Ptr->Donnée<>D //Chercher la donnée
PredPtr
PtrPtr->Suivant
Fin Tant que

Si Ptr<>Null alors
Si Ptr=L->Tête alors //Si l’élément est la tête
L->Tête  Ptr->Suivant
Sinon
Pred->SuivantPtr->Suivant
Fin si

Libérer(Ptr)
L->TailleL->Taille-1
Retourne 1
Sinon

8|Page
4 LISTES CHAINEES ASD2

Retourne 0
Fin si
Fin fonction

2. Chainage simple avec adresse de Tête et Queue

Les algorithmes suivant permettent la gestion d’une liste à simple chainage contenant
l’adresse de la tête et la queue à la fois. Chaque élément de la liste contient un entier et un
pointeur qui pointe sur l’élément suivant. On suppose que les éléments de la liste ne sont
pas triés. Les structures qui définissent la liste sont comme suit :

Structure Element
Donnée : entier
Suivant : pointeur sur Element
Fin structure

Structure Liste
Tête : pointeur sur Element
Queue : pointeur sur Element
Taille : entier
Fin structure

 Initialisation

Procédure Init_Liste(L : pointeur sur Liste)


Début
L->Tête  NULL
L->Queue  NULL
L->Taille  0
Fin

 Ajout d’un élément à la fin

Procédure Ajout_Liste_Fin(L : pointeur sur Liste, D : entier)


Ptr : pointeur sur Element
Début
PtrAllouer(Element)
Ptr->DonnéeD
Ptr->SuivantNUll

Si L->Tete=NULL alors // si la liste est vide


L->TetePtr
Sinon
L->Queue->SuivantPtr // chainage avec le nouvel élément
Fin si

L->QueuePtr // changer la queue


L->Taille L->Taille+1

Fin procédure

9|Page
4 LISTES CHAINEES ASD2

 Supprimer un élément

Fonction Supprimer_Liste(L :Pointeur sur Liste, D : entier) retourne


entier
Ptr, Pred : pointeur sur Elem
Début
PtrL->Tete
PredNULL
Tant que Ptr<>NULL et Ptr->Donnée<>D
PredPtr
PtrPtr->Suivant
Fin Tant que

Si Ptr<>Null alors
Si Ptr=L->Tête alors
L->Tête  Ptr->Suivant
Sinon
Pred->SuivantPtr->Suivant
Fin si

Si Ptr=L->Queue alors
L->QueuePred
Fin si

Libérer(Ptr)
L->TailleL->Taille-1
Retourne 1
Sinon
Retourne 0
Fin si
Fin fonction

10 | P a g e

Vous aimerez peut-être aussi