Vous êtes sur la page 1sur 12

DVD-MIAGE

Listes chaines

Algorithmique

Chapitre 10
Listes chanes

1. Structures de donnes linaires


Parmi les structures de donnes linaires il y a :
 les tableaux,
 les listes chanes,
 les piles,
 les files.
Les structures de donnes linaires induisent une notion de squence entre les lments les
composant (1er, 2me, 3me, suivant, dernier).

1.1. Les tableaux


Vous connaissez dj la structure linaire de type tableau pour lequel les lments de mme type le
composant sont placs de faon contige en mmoire.
Pour crer un tableau, 1 ou 2 dimensions, il faut connatre sa taille qui ne pourra tre modifie au
cours du programme, et lui associer un indice pour parcourir ses lments. Pour les tableaux la
squence correspond aux numros des cases du tableau. On accde un lment du tableau
directement grce son indice.
Soit le tableau 1 dimension suivant nomm Tablo :

12

14

10

24

Pour atteindre la troisime case du tableau il suffit d'crire Tablo[3] qui contient 10, si les valeurs
de lindice commencent 1.
La structure de type tableau pose des problmes pour insrer ou supprimer un lment car ces
actions ncessitent des dcalages du contenu des cases du tableau qui prennent du temps dans
l'excution d'un programme.
Ce type de stockage de valeurs peut donc tre coteux en temps d'excution. Il existe une autre
structure, appele liste chane, pour stocker des valeurs, cette structure permet plus aisment
d'insrer et de supprimer des valeurs dans une liste linaire d'lments.

1.2. Les listes chanes


Une liste chane est une structure linaire qui n'a pas de dimension fixe sa cration. Ses
lments de mme type sont parpills dans la mmoire et relis entre eux par des pointeurs. Sa
dimension peut tre modifie selon la place disponible en mmoire. La liste est accessible
uniquement par sa tte de liste cest--dire son premier lment.
Pour les listes chanes la squence est mise en oeuvre par le pointeur port par chaque lment qui
indique l'emplacement de l'lment suivant. Le dernier lment de la liste ne pointe sur rien (Nil).
On accde un lment de la liste en parcourant les lments grce leurs pointeurs.
Chapitre 10

1 / 12

DVD-MIAGE

Listes chaines

Algorithmique

Soit la liste chane suivante (@ indique que le nombre qui le suit reprsente une adresse) :
Adresses
Donnes
Pointeurs

@:3
Voici
24

@ : 24
une
8

@:8
liste
56

@ : 56
chane
Nil

Pour accder au troisime lment de la liste il faut toujours dbuter la lecture de la liste par son
premier lment dans le pointeur duquel est indiqu la position du deuxime lment. Dans le
pointeur du deuxime lment de la liste on trouve la position du troisime lment
Pour ajouter, supprimer ou dplacer un lment il suffit d'allouer une place en mmoire et de mettre
jour les pointeurs des lments.
Il existe diffrents types de listes chanes :
 Liste chane simple constitue d'lments relis entre eux par des pointeurs.
 Liste chane ordonne o l'lment suivant est plus grand que le prcdent. L'insertion et la
suppression d'lment se font de faon ce que la liste reste trie.
 Liste doublement chane o chaque lment dispose non plus d'un mais de deux pointeurs
pointant respectivement sur l'lment prcdent et l'lment suivant. Ceci permet de lire la
liste dans les deux sens, du premier vers le dernier lment ou inversement.
 Liste circulaire o le dernier lment pointe sur le premier lment de la liste. S'il s'agit d'une
liste doublement chane alors de premier lment pointe galement sur le dernier.
Ces diffrents types peuvent tre mixs selon les besoins.
On utilise une liste chane plutt qu'un tableau lorsque l'on doit traiter des objets reprsents par
des suites sur lesquelles on doit effectuer de nombreuses suppressions et de nombreux ajouts. Les
manipulations sont alors plus rapides qu'avec des tableaux.
Rsum
Structure
Tableau
Liste chane

Dimension
Fixe

Position d'une information


Par son indice

Evolue selon Par son adresse


les actions

Accs une information


Directement par l'indice
Squentiellement par le pointeur
de chaque lment

1.3. Les piles et les files


Les files et les piles sont des listes chanes particulires qui permettent l'ajout et la suppression
d'lments uniquement une des deux extrmits de la liste.
Structures

Ajout

Suppression

Type de Liste

PILE

Tte

Tte

LIFO (Last In First Out)

FILE

Queue

Tte

FIFO (First In First Out)

La pile est une structure de liste similaire une pile d'assiettes o l'on pose et l'on prend au sommet
de la pile.
La file est une structure de liste similaire une file d'attente une caisse, le premier client entr
dans la file est le premier sorti de celle-ci (aucun resquillage n'est admis).
Chapitre 10

2 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2. Listes chanes
2.1. Dfinitions
Un lment d'une liste est l'ensemble (ou structure) form :
 d'une donne ou information,
 d'un pointeur nomm Suivant indiquant la position de l'lment le suivant dans la liste.
A chaque lment est associe une adresse mmoire.
Les listes chanes font appel la notion de variable dynamique.
Une variable dynamique:
 est dclare au dbut de l'excution d'un programme,
 elle y est cre, c'est--dire qu'on lui alloue un espace occuper une adresse de la mmoire,
 elle peut y tre dtruite, c'est--dire que l'espace mmoire qu'elle occupait est libr,
 l'accs la valeur se fait l'aide d'un pointeur.
Un pointeur est une variable dont la valeur est une adresse mmoire (voir chapitre 9). Un pointeur,
not P, pointe sur une variable dynamique note P^.
Le type de base est le type de la variable pointe.
Le type du pointeur est l'ensemble des adresses des variables pointes du type de base. Il est
reprsent par le symbole ^ suivi de l'identificateur du type de base.
Info

Exemple:
3

Suivant

Essai

Nil

P^

La variable pointeur P pointe sur l'espace mmoire P^ d'adresse 3. Cette cellule mmoire contient la
valeur "Essai" dans le champ Info et la valeur spciale Nil dans le champ Suivant. Ce champ servira
indiquer quel est llment suivant lorsque la cellule fera partie dune liste. La valeur Nil indique
quil ny a pas d'lment suivant. P^ est l'objet dont l'adresse est range dans P.
Les listes chanes entranent l'utilisation de procdures d'allocation et de libration dynamiques de
la mmoire. Ces procdures sont les suivantes:
 Allouer(P) : rserve un espace mmoire P^ et donne pour valeur P l'adresse de cet espace
mmoire. On alloue un espace mmoire pour un lment sur lequel pointe P.
 Dsallouer(P) : libre l'espace mmoire qui tait occup par l'lment supprimer P^ sur
lequel pointe P.
Pour dfinir les variables utilises dans l'exemple ci-dessus, il faut :
 dfinir le type des lments de liste :
Type Cellule= Structure
Info : Chane
Suivant : Liste
fin Structure
 dfinir le type du pointeur :
Type Liste = ^Cellule
 dclarer une variable pointeur :
Var P : Liste
 allouer une cellule mmoire qui rserve un espace en mmoire et donne P la valeur de
l'adresse de l'espace mmoire P^ : Allouer(P)
 affecter des valeur l'espace mmoire P^:
P^.Info  "Essai" ; P^.Suivant Nil
Quand P = Nil alors P ne pointe sur rien.
Chapitre 10

3 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2.2. Listes chanes simples


Une liste chane simple est compose :
 d'un ensemble d'lments tel que chacun :
o est rang en mmoire une certaine adresse,
o contient une donne (Info),
o contient un pointeur, souvent nomm Suivant, qui contient l'adresse de l'lment
suivant dans la liste,
 d'une variable, appele Tte, contenant l'adresse du premier lment de la liste chane.
Le pointeur du dernier lment contient la valeur Nil. Dans le cas d'une liste vide le pointeur de la
tte contient la valeur Nil. Une liste est dfinie par l'adresse de son premier lment.
Avant d'crire des algorithmes manipulant une liste chane, il est utile de montrer un schma
reprsentant graphiquement l'organisation des lments de la liste chane.
Exemple:
Reprenons l'exemple du tableau paragraphe 1.1. page 1. La liste chane correspondante pourrait
tre :
@:2
10
1

3
Tte
@ :3
12
4

@:4
14
2

@:1
24
Nil

Le 1er lment de la liste vaut 12 l'adresse 3 (dbut de la liste chane)


Le 2e lment de la liste vaut 14 l'adresse 4 (car le pointeur de la cellule dadresse 3 est gal 4)
Le 3e lment de la liste vaut 10 l'adresse 2 (car le pointeur de la cellule dadresse 4 est gal 2)
Le 4e lment de la liste vaut 24 l'adresse 1 (car le pointeur de la cellule dadresse 2 est gal 1)
Si P a pour valeur 3
P^.Info
a pour valeur 12
P^.Suivant a pour valeur 4

Si P a pour valeur 2
P^.Info
a pour valeur 10
P^.Suivant a pour valeur 1

2.3. Traitements de base d'utilisation d'une liste chane simple


Il faut commencer par dfinir un type de variable pour chaque lment de la chane. En langage
algorithmique ceci se fait comme suit :
Type Liste = ^Element
Type Element = Structure
Info : variant
Suivant :
Liste
Fin structure
Variables Tete, P : Liste
Le type de Info dpend des valeurs contenues dans la liste : entier, chane de caractres, variant pour
un type quelconque
Chapitre 10

4 / 12

DVD-MIAGE

Listes chaines

Algorithmique

Les traitements des listes sont les suivants :


 Crer une liste.
 Ajouter un lment.
 Supprimer un lment.
 Modifier un lment.
 Parcourir une liste.
 Rechercher une valeur dans une liste.
2.3.1 Crer une liste chane compose de 2 lments de type chane de caractres
Dclarations des types pour la liste :
Type Liste = ^Element
Type Element = Structure
Info : chane de caractres
Suivant :
Liste
Fin structure
Algorithme CrationListe2Elements
Tete, P : Liste
NombreElt : entier
DEBUT
1
Tete  Nil
/* pour l'instant la liste est vide*/
2
Allouer(P)
/* rserve un espace mmoire pour le premier lment */
3
Lire(P^.Info)
/* stocke dans l'Info de l'lment point par P la valeur saisie */
4
P^.Suivant  Nil
/* il n'y a pas d'lment suivant */
5
Tete  P
/* le pointeur Tete pointe maintenant sur P */
e
/* Il faut maintenant ajouter le 2 lment, ce qui revient insrer un lment en tte de liste */
6
Allouer(P)
/* rserve un espace mmoire pour le second lment */
7
Lire(P^.Info)
/* stocke dans l'Info de l'lment point par P la valeur saisie */
8
P^.Suivant  Tete
/* lment insr en tte de liste */
9
Tete  P
FIN

Tete  Nil

1
Tte
Nil

Allouer(P)

2
Tte

Nil
@:3

Lire(P^.Info)

3
Tte
Nil

@:3
Premire

Chapitre 10

5 / 12

DVD-MIAGE

Listes chaines

Algorithmique

P^.Suivant  Nil

4
Tte
Nil

@:3
Premire
Nil
Tete  P

5
Tte

3
@:3
Premire
Nil
Allouer(P)

6
Tte
3

@:3

@ : 24

Premire
Nil
Lire(P^.Info)

7
Tte
3

@:3

@ : 24

Premire
Nil

chane

P^.Suivant  Tete

8
Tte
3

@ :3

@ : 24

Premire
Nil

chane
3
Tete  P

9
Tte
24

Chapitre 10

@ :3

@ : 24

Premire
Nil

chane
3

6 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2.3.2 Crer une liste chane compose de plusieurs lments de type chane de caractres
Dclarations des types pour la liste :
Type Liste = ^Element
Type Element = Structure
Info : chane de caractres
Suivant :
Liste
fin Structure
Pour crer une liste chane contenant un nombre d'lments prciser par l'utilisateur il suffit
d'introduire deux variables de type Entier NombreElt et Compteur
 de faire saisir la valeur de NombreElt par l'utilisateur ds le dbut du programme,
 d'crire une boucle Pour Compteur allant de 1 NombreElt comprenant les instructions 6, 7,
8 et 9.
Algorithme CrationListeNombreConnu
Tete, P : Liste
NombreElt : entier
Compteur : entier
DEBUT
Lire(NombreElt)
Tete  Nil
POUR Compteur DE 1 A NombreElt FAIRE
Allouer(P)
/* rserve un espace mmoire pour llment ajouter */
Lire(P^.Info)
/* stocke dans l'Info de l'lment point par P la valeur saisie */
P^.Suivant  Tete
/* lment insr en tte de liste */
Tete  P
/* le pointeur Tete pointe maintenant sur P */
FIN POUR
FIN

Pour crer une liste chane contenant un nombre indtermin d'lments il faut :
 dclarer une variable de lecture de mme type que celui de linformation porte par la liste,
 dterminer et indiquer l'utilisateur la valeur qu'il doit saisir pour annoncer qu'il n'y a plus
d'autre lment ajouter dans la chane (ici "XXX"),
 crire une boucle Tant Que permettant d'excuter les instructions 6, 7, 8 et 9 tant que la valeur
saisie par l'utilisateur est diffrente de la valeur indiquant la fin de l'ajout d'lment dans la
chane.
Algorithme CrationListeNombreInconnu
Tete, P : Liste
Valeur : chane de caractres
DEBUT
Tete  Nil
Lire (Valeur)
TANT QUE que Valeur "XXX" FAIRE
Allouer(P)
/* rserve un espace mmoire pour llment ajouter */
P^.Info  Valeur
/* stocke dans l'Info de l'lment point par P la valeur saisie */
P^.Suivant  Tete
/* lment insr en tte de liste */
Tete  P
/* le pointeur Tete pointe maintenant sur P */
Lire (Valeur)
FIN TANT QUE
FIN

Chapitre 10

7 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2.3.3. Afficher les lments d'une liste chane


Une liste chane simple ne peut tre parcourue que du premier vers le dernier lment de la liste.
Tte
3
@:3
Ma
24

@ : 24
premire
8

@:8
liste
56

@ : 56
chaine
Nil

L'algorithme est donn sous forme d'une procdure qui reoit la tte de liste en paramtre.
Procedure AfficherListe (Entre
P : Liste)
/* Afficher les lments dune liste chane passe en paramtre */
DEBUT
1
P  Tete
/* P pointe sur le premier lment de la liste*/
/* On parcourt la liste tant que l'adresse de l'lment suivant n'est pas Nil */
/* si la liste est vide Tete est Nil */
TANT QUE P <> NIL FAIRE
2
Ecrire(P^.Info)
/* afficher la valeur contenue l'adresse pointe par P */
3
P  P^.Suivant
/* On passe l'lment suivant */
FIN TANT QUE
FIN

1
2
3
2
3
2
3
2
3

P a pour valeur 3
"Ma" saffiche
P prend pour valeur 24
"premire" saffiche
P prend pour valeur 8
"liste" saffiche
P prend pour valeur 56
"chane" saffiche
P prend pour valeur Nil

On sarrte puisque P a pour valeur Nil et que cest la condition darrt de la boucle Tant Que.
2.3.4. Rechercher une valeur donne dans une liste chane ordonne
Dans cet exemple nous reprenons le cas de la liste chane contenant des lments de type chaine de
caractres, mais ce pourrait tre tout autre type, selon celui dtermin la cration de la liste
(rappelons que tous les lments d'une liste chane doivent avoir le mme type). La liste va tre
parcourue partir de son premier lment (celui point par le pointeur de tte). Il a deux cas
darrt :
 avoir trouv la valeur de l'lment,
 avoir atteint la fin de la liste.
L'algorithme est donn sous forme d'une procdure qui reoit la tte de liste en paramtre. La valeur
chercher est lue dans la procdure.

Chapitre 10

8 / 12

DVD-MIAGE

Listes chaines

Algorithmique

Procedure RechercherValeurListe
(Entre Tete : Liste, Val : variant)
/* Rechercher si une valeur donne en paramtre est prsente dans la liste passe en paramtre */
Variables locales
P
: Liste
/* pointeur de parcours de la liste */
Trouve
: boolen
/* indicateur de succs de la recherche */
DEBUT
SI Tete <> Nil ALORS
/* la liste n'est pas vide on peut donc y chercher une valeur */
P  Tete
Trouve  Faux
TANTQUE P <> Nil ET Non Trouve
SI P^.Info = Val ALORS
/* L'lment recherch est l'lment courant */
Trouve  Vrai
SINON
/* L'lment courant n'est pas l'lment recherch */
P  P^.Suivant
/* on passe l'lment suivant dans la liste */
FINSI
FIN TANT QUE
SI Trouve ALORS
Ecrire (" La valeur ", Val, " est dans la liste")
SINON
Ecrire (" La valeur ", Val, " n'est pas dans la liste")
FINSI
SINON
Ecrire("La liste est vide")
FINSI
FIN

2.3.5. Supprimer le premier lment d'une liste chane


Il y a deux actions, dans cet ordre, raliser :
 faire pointer la tte de liste sur le deuxime lment de la liste,
 librer l'espace mmoire occup par l'lment supprim.
Il est ncessaire de dclarer un pointeur local qui va pointer sur l'lment supprimer, et permettre
de librer l'espace qu'il occupait.
Tete
24 3

@ :3
Ma
24

@ :24
premire
8

@:8
liste
56

@ : 56
chaine
Nil

Procedure SupprimerPremierElement
(Entre/Sortie Tete : Liste)
/* Supprime le premier lment de la liste dont le pointeur de tte est pass en paramtre */
Variables locales
P : Liste
/* pointeur sur l'lment supprimer */
DEBUT
SI Tete <> Nil ALORS
/* la liste n'est pas vide on peut donc supprimer le premier lment */
er
P  Tete
/* P pointe sur le 1 lment de la liste */
Tete  P^.Suivant
/* la tte de liste doit pointer sur le deuxime 'lment */
Desallouer(P)
/* libration de l'espace mmoire qu'occupait le premier lment */
SINON
Ecrire("La liste est vide")
FINSI
FIN

Chapitre 10

9 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2.3.6. Supprimer d'une liste chane un lment portant une valeur donne
Il faut:
 traiter part la suppression du premier lment car il faut modifier le pointeur de tte,
 trouver l'adresse P de l'lment supprimer,
 sauvegarder l'adresse Prec de l'lment prcdant l'lment point par P pour connatre
l'adresse de l'lment prcdant l'lment supprimer, puis faire pointer l'lment prcdent
sur l'lment suivant l'lment supprimer,
 Librer l'espace mmoire occup par l'lment supprim.
L'exemple considre que l'on souhaite supprimer l'lment contenant la valeur "liste" de la liste cidessus.
Tete
3

Prec
24

@ :3
Ma
24

@ : 24
premire
56 8
Elment prcdant
celui supprimer

P
8
@ :8
liste
56

@ : 56
chane
Nil

Elment supprimer

Procedure SupprimerElement (Entre/Sortie Tete : Liste, Val : variant)


/* Supprime l'lment dont la valeur est passe en paramtre */
Variables locales
P
: Liste
/* pointeur sur l'lment supprimer */
Prec : Liste
/* pointeur sur l'lment prcdant l'lment supprimer */
Trouv : Liste
/* indique si l'lment supprimer a t trouv */
DEBUT
SI Tete <> Nil ALORS /* la liste n'est pas vide on peut donc y chercher une valeur supprimer */
SI Tete^.info = Val ALORS
/* l'lment supprimer est le premier */
P  Tete
Tete  Tete^Suivant
Desallouer(P)
SINON
/* l'lment supprimer n'est pas le premier */
Trouve  Faux
Prec  Tete
/* pointeur prcdent */
P  Tete^.Suivant
/* pointeur courant */
TANTQUE P <> Nil ET Non Trouve
SI P^.Info = Val ALORS
/* L'lment recherch est l'lment courant */
Trouve  Vrai
SINON
/* L'lment courant n'est pas l'lment cherch */
Prec  P
/* on garde la position du prcdent */
P^  P^.Suivant
/* on passe l'lment suivant dans la liste */
FINSI
FIN TANT QUE
SI Trouve ALORS
Prec^.Suivant  P^.Suivant
/* on "saute" l'lment supprimer "/
Desallouer(P)
SINON
Ecrire ("La valeur ", Val, " n'est pas dans la liste")
FINSI
FINSI
SINON
Ecrire("La liste est vide")
FINSI
FIN

Chapitre 10

10 / 12

DVD-MIAGE

Listes chaines

Algorithmique

2.4. Listes doublement chanes


Il existe aussi des liste chanes, dites bidirectionnelles, qui peuvent tre parcourues dans les deux
sens, du 1er lment au dernier et inversement.
Une liste chane bidirectionnelle est compose :
 d'un ensemble de donnes,
 de l'ensemble des adresses des lments de la liste,
 d'un ensemble de pointeurs Suivant associs chacun un lment et qui contient l'adresse de
l'lment suivant dans la liste,
 d'un ensemble de pointeurs Precedent associs chacun un lment et qui contient l'adresse
de l'lment prcdent dans la liste,
 du pointeur sur le premier lment Tete, et du pointeur sur le dernier lment, Queue,
Type ListeDC = ^Element
Type Element = Structure
Precedent : ListeDC
Info :
variant
Suivant : ListeDC
Fin Structure
Le pointeur Precedent du premier lment ainsi que le pointeur Suivant du dernier lment
contiennent la valeur Nil.
Tte
3
@:3
Nil
12
4

Queue
5
@:4
3
14
2

@:2
4
10
5

@:5
2
24
Nil

A l'initialisation d'une liste doublement chane les pointeurs Tete et Queue contiennent la valeur
Nil.
Afficher les lments d'une liste doublement chane
Il est possible de parcourir la liste doublement chane du premier lment vers le dernier. Le
pointeur de parcours, P, est initialis avec l'adresse contenue dans Tete. Il prend les valeurs
successives des pointeurs Suivant de chaque lment de la liste. Le parcours s'arrte lorsque le
pointeur de parcours a la valeur Nil. Cet algorithme est analogue celui du parcours d'une liste
simplement chane.
Procedure AfficherListeAvant (Entre
Variables locales
P : ListeDC
DEBUT
P  Tete /
TANT QUE P <> NIL FAIRE
Ecrire(P^.Info)
P  P^.Suivant
FIN TANT QUE
FIN
Chapitre 10

Tete : ListeDC)

11 / 12

DVD-MIAGE

Listes chaines

Algorithmique

Il est possible de parcourir la liste doublement chane du dernier lment vers le premier. Le
pointeur de parcours, P, est initialis avec l'adresse contenue dans Queue. Il prend les valeurs
successives des pointeurs Precedent de chaque lment de la liste. Le parcours s'arrte lorsque
le pointeur de parcours a la valeur Nil.
Procedure AfficherListeArriere (Entre
Variables locales
P : ListeDC
DEBUT
P  Queue
TANT QUE P <> NIL FAIRE
Ecrire(P^.Info)
P  P^.Precedent
FIN TANT QUE
FIN

Queue : ListeDC)

2.5. Listes chanes circulaires


Une liste chane peut tre circulaire, c'est dire que le pointeur du dernier lment contient
l'adresse du premier.
Ci-dessous l'exemple d'une liste simplement chane circulaire : le dernier lment pointe sur le
premier.
Tte
3
@ :3
12
25

@ :25
4
8

@ :8
10
56

@ :56
24
3

Puis l'exemple d'une liste doublement chane circulaire. : Le dernier lment pointe sur le premier,
et le premier lment pointe sur le dernier.
Tte
3
@ :3
56
12
25

Queue
56
@ : 25
3
14
8

@:8
25
10
56

@ :56
8
24
3

WEBOGRAPHIE
http://www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html
http://liris.cnrs.fr/pierre-antoine.champin/enseignement/algo/listes_chainees/
http://deptinfo.cnam.fr/Enseignement/CycleA/SD/cours/structuress%E9quentielleschain%E9es.pdf
http://pauillac.inria.fr/~maranget/X/421/poly/listes.html#toc2
http://wwwens.uqac.ca/~rebaine/8INF805/courslistespilesetfiles.pdf
Chapitre 10

12 / 12

Vous aimerez peut-être aussi