Vous êtes sur la page 1sur 9

V .

Listes
Chaînées

Une liste est une suite de mots, de nombres, de noms de personnes, de choses le
plus souvent inscrits l'un au-dessous de l'autre : faire la liste des absents. C'est
aussi une longue énumération : la liste de ses crimes est impressionnante.

Dans le cadre d'un scrutin plurinominal, c'est l'ensemble des candidats d'un
même parti ou d'une même tendance. La liste est dite bloquée lorsque les
modalités du scrutin obligent l'électeur à voter pour une liste entière sans aucune
modification.

C'est finalement l'ensemble d'enregistrements mémorisés sur un ordinateur et


reliés en chaîne les uns aux autres, chaque enregistrement contenant l'adresse de
l'enregistrement suivant ; plus généralement, tout ensemble structuré d'éléments
d'informations.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
61 62
Les listes déroulantes, des composants utilisé pour les interfaces utilisateur graphiques,
peuvent être mises en œuvre en utilisant les listes chaînées.

VI.2 Représentation d'une liste


VI.1 Introduction
Un liste chaînée peut être définie de manière récursive (fig. 13) : une liste est soit vide, soit un
Une liste chaînée est une structure linéaire dynamique. Une liste chaînée (liste) est un élément suivit d'une liste chaînée. Un élément doit donc pointer sur la sous liste qui le suit
ensemble de données (objets) organisées séquentiellement comme une table à laquelle serait (éventuellement vide). On peut distinguer deux types de listes chaînées : les listes
associé un ordre total. La différence fondamentale entre une liste chaînée et un tableau c’est simplement chaînées et les listes doublement chaînées.
l’organisation en mémoire. Il plus de différences dans la représentation des listes chaînées et
des tableaux que de points communs. Les différences les plus notables sont cependant les NULL
suivantes :

• Il n'est pas nécessaire de connaître le nombre maximal d'éléments à stocker.


• Il est possible de mettre autant d'éléments qu'on le souhaite dans une liste chaînée tant info info info info info NULL
qu'il y a assez d'espace mémoire pour stocker des éléments.
• Contrairement aux tableaux, l'espace mémoire nécessaire pour stocker les éléments ne Fig. 13 - Définition récursive d'une liste chaînée
doit pas nécessairement être contigüe (fig. 12). En effet, dans la représentation d’un
tableau, les éléments sont juxtaposés. L'élément suivant est automatiquement celui qui
VI.2.1 Les Listes simplement chaînées
succède à éléments courant. Dans la représentation d’une liste, l'élément suivant (selon
l’ordre de la liste) peut être situé n’importe ou dans la mémoire. L’élément courant doit Un élément d'une liste simplement chaînée est définit avec un contenu : une information qui
savoir ou est situe l’élément qui lui succède. Le dernier élément mémorise quant a lui dépend du problème à résoudre et un pointeur sur l'élément suivant (début de la sous liste
une adresse nulle pour signaler la fin de la liste. suivante). On utilise une structure pour définir un nœud (un élément) d'une liste simplement
chaînée :

0 TYPEDEF STRUCT node


0 2
2 9 BEGIN
9
4
INT info;
7 POINTER (node) next;
5 4
1 7 END

Une liste contient un élément particulier : la tête de la liste (fig. 14) qui indique le premier
5
élément de cette liste. Il faut toujours mémoriser l'adresse mémoire de cet élément sans quoi,
la liste n'est plus accessible. Il est parfois utile de mémoriser le dernier élément non NULL
1
d'une liste chaînée (la queue).
TABLEAU LISTE CHAINEE
TÊTE
info info info info info NULL
Fig. 12 - Organisation mémoire d'un tableau vs. celle d'une liste chaînée
Fig. 14 - Tête d'une liste chaînée
Les listes chaînées sont utilisées pour implémenter des structures de données importantes
telles que les piles, les files, les graphes, les tables de hachage, etc. Elle sont aussi utilisées Les opérations qu'il est possible de faire sur une liste chaînée sont les suivantes :
comme composant de certaines autres structures de données. Exemples: les arbres B+, etc.
• Création d'une liste.
Le langage LISP, un des langages les plus importants en intelligence artificielle fait un usage • Ajout d'un élément à une liste.
extensif des listes pour faire des traitements et des calculs symboliques. • Suppression d'un élément d'une liste
• Recherche d'un élément dans une liste.
La gestion de la mémoire, un des rôles importants d'un système d'exploitation, est un autre
domaine où on fait usage des listes. Un système d'exploitation doit décider comment répartir VI.2.1.1 Création d'une liste chaînée
et récupérer la mémoire pour les processus en cours d'exécution sur le système. Une liste
chaînée peut être utilisée pour garder une trace de portions de mémoire qui sont disponibles La création d'une nouvelle liste chaînée doit "fabriquer" une liste vide. La fonction suivante
pour affectation. (algo. 34) permet de créer une liste vide :

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
63 64
FUNCTION POINTER(node) creer_liste_vide () b. Insertion en fin de liste.
BEGIN
POINTER(node) elem ← NULL; On suppose cette fois-ci que la liste n'est pas vide. On considère deux cas de figures : on
return elem; dispose d'un pointeur sur le dernier élément non NULL de la liste (tail) ou bien il n'y en a
END pas.
Algo 34. - Création d'une liste vide
Dans le cas où on dispose d'un pointeur tail, il suffit de créer un nouvel élément elem, de
VI.2.1.2 Ajout d'un élément à une liste chaînée faire pointer le suivant de elem sur NULL. Ensuite, il faut faire pointer le suivant de
L'ajout d'un élément à une liste peut se faire de trois manières différentes : une insertion en l'élément tail sur elem et finalement faire ponter tail sur elem. Ce dernier devient ainsi le
tête de liste, une insertion en queue de liste et enfin, une insertion entre deux éléments de la nouvel élément tail de la liste (fig. 16).
liste.
ELEM
a. Insertion en tête. 1 Création d’un nouvel élément elem info NULL

TAIL
Si la liste est vide (c'est à dire que la tête vaut NULL), il suffit de créer un nouvel élément et
de faire pointer le pointeur de tête dessus. Si la liste n'est pas vide, il faut créer un nouvel TÊTE

élément elem, pointer le suivant de elem sur la tête de la liste, ensuite faire pointer la tête de info info info info NULL

la liste sur elem (fig. 15).


ELEM

1
ELEM 2 Faire pointer le suivant de tail sur elem info NULL
info Création d’un nouvel élément elem
TAIL
TÊTE

info info info info NULL TÊTE

info info info info

ELEM
2 info L’élémet tete de la liste devient suivant de l’élément elem TAIL
3 Faire pointer tail sur elem info NULL
TÊTE

info info info info NULL

TÊTE

info info info info


TÊTE
3 info L’élément elem devient la tête de la liste

Fig. 16 - Insertion d'un élément en queue d'une liste chaînée


info info info info NULL

Fig. 15 - Insertion d'un élément en tête d'une liste chaînée La procédure suivante (algo. 36) permet d'ajouter un élément en queue d'une liste chaînée
pointée par le pointeur tail.
La procédure suivante (algo. 35) permet d'ajouter un élément en tête d'une liste chaînée.
PROCEDURE ajouter_en_queue (INPUT INT val, OUTPUT POINTER(node) tail)
BEGIN
POINTER(node) elem ← POINTER(node)malloc (sizeof (node));
PROCEDURE ajouter_en_tete (INPUT INT val, OUTPUT POINTER(node) tete)
BEGIN IF elem ≠ NULL THEN
POINTER(node) elem ← POINTER(node)malloc (sizeof (node)); elem→info ← val;
elem→next ← NULL;
IF elem ≠ NULL THEN tail→next ← elem;
elem→info ← val; tail ← elem;
END IF
elem→next ← NULL; END
tete ← elem; Algo 36. - Ajout d'un élément en fin d'une liste chaînée
END IF
END
Dans la cas où il n'y a pas de pointeur tail, il faut parcourir la liste jusqu'au dernier élément
Algo 35. - Insertion en tête d'une liste chaînée
non NULL et de le passer en paramètre à la place de tail. L'algorithme reste exactement le
même hormis la dernière instruction (tail ← elem) qui ne doit pas exister.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
65 66
c. Insertion entre deux éléments d'une liste. FUNCTION POINTER(node) add (INPUT INT val, OUTPUT POINTER(node) n)
BEGIN
On suppose cette fois-ci que la liste n'est pas vide. On doit insérer un nouvel élément à liste PONTEUR(node) tmp ;
après un élément référencée par un pointeur cour (fig. 17). Après avoir créé un nouvel PONTEUR(node) cour;
PONTEUR(node) prec;
élément elem, il faut faire ponter le suivant de elem sur le suivant de cour. Il faut ensuite
faire pointer le suivant de cour sur le nouvel élément elem. IF n = NULL THEN
n ← PONTEUR(node) malloc (sizeof (node));
1. Création d’un nouvel élément elem n→val ← val;
COUR ELEM n→next ← NULL;
1 info ELSE
tmp ← POINTER(node) malloc (sizeof (node));
TÊTE
IF tmp ≠ NULL THEN
info info info info NULL
tmp→val ← val;
IF val < n→val THEN
2. Faire pointer le suivant de elem sur le suivant de cour tmp→next ← n;
COUR ELEM n ← tmp;
2 info ELSE
cour ← n;
TÊTE
WHILE cour ≠ NULL AND val > cour→val DO
info info info info NULL
prec ← cour ;
cour ← cour→next;
END WHILE
3. Faire pointer le suivant de cour sur le suivant de elem
COUR ELEM IF cour = NULL THEN
3 info prec→next ← tmp;
tmp→next ← NULL;
TÊTE ELSE
info info info info NULL
tmp→next ← cour;
rec→next ← tmp;
Fig. 17 - Insertion d'un élément après un élément connu référencé par le pointeur cour END IF
END IF
END IF
La procédure suivante (algo. 37) permet d'ajouter un élément après un autre élément END IF
référencé par un pointeur cour. return n;
END
PROCEDURE ajouter_elem (INPUT INT val, INPUT POINTER(node) cour)
BEGIN Algo 38. - Ajout d'un élément après un élément cour d'une liste chaînée
POINTER(node) elem ← POINTER(node)malloc (sizeof (node));
VI.2.1.3 Suppression d'un élément d'une liste chaînée
IF elem ≠ NULL THEN
elem→info ← val;
La suppression d'un élément peut être faite en tête de liste ou ailleurs. Lorsqu'on ne
elem→next ← cour→next;
supprime pas l'élément en tête de la liste, on indique l'élément qui précède l'élément à
cour→next ← elem;
END IF supprimer.
END
a. Suppression de la tête de la liste.
Algo 37. - Ajout d'un élément après un élément cour d'une liste chaînée
Les étapes de la suppression d'un élément en tête d'une liste chaînée sont schématisées dans
la fig. 18. On commence par pointer un élément temporaire (tmp) sur la tête de la liste, ceci
REMARQUE : L'algorithme 37 permet d'insérer même en queue de liste.
permettra de libérer l'espace mémoire occupé par cet élément. Ensuite, il faut pointer le
EXEMPLE pointeur tête sur l'élément qui le suit. Finalement libérer l'espace mémoire de l'élément
pointé par tmp.
Ecrire un algorithme permettant de construire une liste chaînée triée par ordre croissant à
partir d'un tableau contenant N éléments différents.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
67 68
ELEM
1 1
TÊTE
info info info info NULL TÊTE
info info info info NULL

TMP ELEM TMP


2 2
TÊTE
TÊTE
info info info info NULL
info info info info NULL

ELEM TMP
3 TMP TETE 3
TÊTE
info info info info NULL info info info info NULL

×
ELEM TMP
TMP TETE 4
4
TÊTE

info info info info NULL info info info info NULL

Fig. 18 - Suppression de la tête de liste Fig. 19 - Suppression d'un élément qui n'est pas la tête de liste

PROCEDURE delete_elem (INPUT POINTER(node) elem)


La fonction suivante (algo. 39) permet de supprimer un élément situé en tête d'une liste BEGIN
chaînée tel que décrit dans la fig. 18.. PONTEUR(node) tmp ;
IF elem ≠ NULL THEN
FUNCTION POINTER(node) delete_head (INPUT POINTER(node) head)
BEGIN tmp ← elem→next;
PONTEUR(node) tmp ; elem→next ← tmp→next;
free (tmp);
IF head ≠ NULL THEN END IF
tmp ← head; END
head ← head→next; Algo 40. - suppression d'un élément qui n'est pas situé en tête d'une liste chaînée
free (tmp);
END IF
VI.2.2 Les Listes doublement chaînées
return head;
END Un élément d'une liste doublement chaînée est définit avec un contenu : une information qui
dépend du problème à résoudre, un pointeur sur l'élément suivant et un pointeur sur
Algo 39. - suppression de la tête d'une liste chaînée
l'élément précédent. On utilise une structure pour définir un nœud (un élément) d'une liste
simplement chaînée :
TYPEDEF STRUCT node
b. Suppression d'un élément situé après un élément elem. BEGIN
INT info;
Les étapes de la suppression d'un élément en tête d'une liste chaînée sont schématisées dans POINTER (node) next;
la fig. 19. On commence par pointer un élément temporaire (tmp) sur le suivant de elem. POINTER (node) prec;
L'élément tmp est celui qu'il faut donc supprimer. Ceci permettra de libérer l'espace END
mémoire occupé par cet élément. Ensuite, il faut pointer le pointeur le suivant de elem sur le
suivant de tmp. Finalement il faut libérer l'espace mémoire de l'élément pointé par tmp. De même que pour les listes simplement chaînée, un élément particulier : la tête de la liste
doit être maintenu (fig. 20), cependant, si on perd sa trace, on peut le retrouver.
La procédure suivante (algo. 40) permet de supprimer un élément situé après un élément
elem transmis en paramètre d'entrée.

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
69 70
TÊTE
1 ELEM TÊTE
info

NULL NULL info info info info NULL


NULL info info info info info NULL

2 ELEM TÊTE
Fig. 20 - Liste doublement chaînée info

NULL info info info info NULL


VI.2.2.1 Création d'une liste doublement chaînée
La création d'une nouvelle liste chaînée doit "fabriquer" une liste vide. La fonction suivante
(algo. 41) permet de créer une liste vide : 3
info
TÊTE

FUNCTION POINTER(node) creer_liste_vide () NULL info info info info NULL


BEGIN
POINTER(node) elem ← NULL;
return elem;
END Fig. 21 - Insertion d'un élément en tête d'une liste doublement chaînée

Algo 41. - Création d'une liste vide


b. Insertion dans une liste doublement chaînée après un élément connu.
VI.2.2.2 Ajout d'un élément à une liste chaînée
L'ajout d'un élément à une liste peut se faire de trois manières différentes : une insertion en L'insertion, si elle n'est pas en tête d'une liste se fait toujours après un élément dont on
tête de liste, une insertion en queue de liste et enfin, une insertion entre deux éléments de la connait l'adresse (cour). Si l'élément cour est le dernier de la liste, alors le nouvel élément à
liste. Contrairement aux listes simplement chaînées, il y a bel et bien une différence entre insérer deviendra la nouvelle queue de la liste. La fig. 22 schématise les étapes de l'insertion
l'insertion d'un élément en queue de liste (le dernier) et l'insertion entre deux éléments. en queue de liste, à savoir :

a. Insertion en tête. • Création du nouvel élément à insérer (elem).


• Faire pointer le suivant de elem sur NULL.
Si la liste est vide (c'est à dire que la tête vaut NULL), il suffit de créer un nouvel élément et • Faire pointer le précédent de elem sur cour.
de faire pointer le pointeur de tête dessus. Si la liste n'est pas vide, il faut créer un nouvel • Faire pointer le suivant de cour sur elem.
élément elem, pointer le suivant de elem sur la tête de la liste, ensuite faire pointer la tête de
la liste sur elem (fig. 21). L'algo 42 permet d'insérer un élément en tête d'une liste 1 TÊTE ELEM

doublement chaînée. info

PROCEDURE ajouter_en_tete (INPUT INT val, OUTPUT POINTER(node) tete) NULL info info info info NULL NULL

BEGIN
POINTER(node) elem ← POINTER(node)malloc (sizeof (node));
2 TÊTE COUR ELEM
info
IF elem ≠ NULL THEN
elem→info ← val; NULL info info info info NULL

IF tete = NULL THEN


elem→next ← NULL;
elem→prec ← NULL; Fig. 22 - Insertion d'un élément en queue d'une liste doublement chaînée
tete ← elem;
ELSE
Si l'élément derrière lequel on doit insérer n'est pas le dernier élément de la liste les étapes
elem→next ← tete;
d'insertion sont les suivantes (fig. 23) :
tete→prec ← elem;
tete ← elem;
END IF • Création du nouvel élément à insérer (elem).
END IF • Faire pointer le suivant de elem sur le suivant de cour.
END
• Faire pointer le précédent de elem sur cour.
Algo 42. - Insertion en tête d'une liste doublement chaînée • Faire pointer le précédent du suivant de elem sur elem.
• Faire pointer le suivant de cour sur elem.
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
71 72
COUR ELEM
1 TÊTE
info 1 TÊTE

NULL info info info info NULL NULL info info info info info NULL

COUR ELEM TMP


2/3 TÊTE
info

×
TÊTE
2 NULL

NULL info info info info NULL

info info info info info NULL

COUR ELEM
4/5 TÊTE
info
TMP

Fig. 24 - Suppression de l'élément en tête d'une liste doublement chaînée après un élément connu
NULL info info info info NULL

b. Suppression de l'élément en queue de liste.


Fig. 23 - Insertion d'un élément dans une liste doublement chaînée après un élément connu
La fig. 25 schématise les étapes de la suppression de l'élément en queue d'une liste
L'algo 43 permet d'insérer un élément après un élément dont l'adresse est connue (cour) doublement chaînée :
d'une liste doublement chaînée.
• Faire pointer un élément temporaire sur l'élément en queue, cela servira pour libérer
PROCEDURE ajouter (INPUT INT val, INPUT POINTER(node) cour) l'espace mémoire occupé par cet élément.
BEGIN • Faire pointer la suivant de l'élément qui précède l'élément temporaire au suivant de ce
POINTER(node) elem ← POINTER(node)malloc (sizeof (node)); dernier (NULL).
• Libérer l'espace mémoire occupé pat l'élément temporaire.
IF elem ≠ NULL THEN
elem→info ← val; 1 TÊTE TMP

elem→next ← cour→next;
elem→prec ← cour;
NULL info info info info info NULL
IF elem→next ≠ NULL THEN
elem→next→prec ← elem;
END IF
cour→next ← elem;

×
END IF 2 TÊTE TMP

END
Algo 43. - Insertion dans une liste doublement chaînée NULL info info info info info NULL

VI.2.2.3 Suppression d'un élément d'une liste doublement chaînée

La suppression d'un élément peut être faite en tête de liste ou ailleurs. Contrairement aux
Fig. 25 - Suppression de l'élément en queue d'une liste doublement chaînée après un élément connu
listes simplement chaînées, il suffit d'indiquer l'élément à supprimer sans mémoriser un
autre élément. c. Suppression de l'élément entre deux éléments non NULL.

Il y a toujours les trois cas dont il faut tenir compte, l'élément à supprimer est la tête de la La fig. 26 schématise les étapes de la suppression de l'élément situé entre deux éléments non
liste, la queue de liste ou un élément situé ailleurs. NULL dans une liste doublement chaînée :
a. Suppression de l'élément en tête. • Faire pointer un élément temporaire sur l'élément à supprimer, cela servira pour libérer
l'espace mémoire occupé par cet élément.
La fig. 24 schématise les étapes de la suppression de l'élément en tête : • Faire pointer la suivant de l'élément qui précède l'élément temporaire au suivant de ce
• Pointer un élément temporaire sur la tête de la liste. dernier.
• Pointer la nouvelle tête de la liste sur l'élément qui suit l'ancien élément de tête. • Faire pointer la précédent de l'élément qui suit l'élément temporaire au précédent de ce
dernier.
• Faire pointer le précédent de la nouvelle tête sur NULL.
• Libérer l'espace mémoire occupé pat l'élément temporaire.
• Libérer l'espace mémoire occupé pat l'élément temporaire.
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
73 74
PROCEDURE supprimer_liste (INPUT POINTER(node) tete)
TÊTE TMP BEGIN
1
POINTER(node) tmp;

NULL info info info info info NULL


WHILE tete ≠ NULL DO
tmp ← tete;
tete ← tete→next;
free (tmp);
END WHILE

×
TÊTE TMP
2 END
Algo 44. - Suppression totale d'une liste chaînée (version itérative)
NULL info info info info info NULL

PROCEDURE supprimer_liste (INPUT POINTER(node) tete)


BEGIN
IF tete ≠ NULL THEN
Fig. 26 - Suppression de l'élément d'une liste doublement chaînée situé entre deux éléments non NULL supprimer_liste (tete→next);
free (tete);
L'algorithme suivant (algo. 44) permet de supprimer un élément situé n'importe où dans une END IF
END
liste doublement chaînée. L'élément à supprimer est passé en paramètre de la procédure. On
suppose que le pointeur sur la tête de la liste est mémorisé par exemple dans une variable Algo 45. - Suppression totale d'une liste chaînée (version récursive)
globale ou bien passée en paramètre à la procédure. VI.3 Applications
Les listes chaînées ont des usages multiples et variés. Nous allons présenter deux exemples :
Si l'élément à supprimer est NULL, il n'y a rien à supprimer et la procédure ne fait rien. Si l'implémentation des piles et l'implémentation des files.
l'élément qui précède l'élément à supprimer est NULL, cela veut dire que l'élément est en tête
VI.3.1 Implémentation de piles
de la liste, il faut donc appliquer les étapes de la suppression en tête. Si l'élément n'est pas en
tête, on applique les étapes de la suppression d'un élément qui est soit entre deux éléments Une piles est une structure de données dans laquelle les éléments sont gérés selon la
non NULL soit en queue de liste. politique LIFO (Last In First Out), c'est à dire que le dernier élément empilé est le premier à
être dépilé. L'implémentation se fait donc à l'aide d'une liste chaînée où il faut toujours
PROCEDURE supprimer (INPUT POINTER(node) elem) insérer en tête et toujours supprimer l'élément de tête
BEGIN FUNCTION POINTER(node) creer ()
POINTER(node) tmp ← elem; BEGIN
return NULL;
IF elem ≠ NULL THEN END
IF elem→prec = NULL THEN /* Elément de tête */ Algo 46. - Création d'une pile vide
elem ← elem→next;
tete ← elem; FUNCTION INT sommet ()
ELSE BEGIN
elem→prec→next ← elem→next; IF tete ≠ NULL THEN
IF elem→next ≠ NULL THEN return tete->info;
elem→next→prec ← elem→prec; END IF
END IF END
END IF Algo 47. - Accès au sommet de la pile
free (tmp);
END IF
END FUNCTION POINTER(node) empiler (INPUT INT val)
BEGIN
Algo 43. - suppression d'un élément dans une liste doublement chaînée
POINTER(node) e ← POINTER(node)malloc (sizeof (node));
IF e ≠ NULL THEN
VI.2.3 Suppression d'une liste chaînée e→info ← val;
e→next ← tete;
Pour supprimer une liste chaînée, il suffit de parcourir la liste à partir de la tête et supprimer tete ← e;
l'élément en tête jusqu'à ce que tous les éléments soient libérés. L'algorithme (algo. 44 & 45) END IF
suivant permet de supprimer une liste chaînée (simple ou double chaînage) : END
Algo 48. - Empiler un élément
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
75 76
FUNCTION POINTER(node) depiler () FUNCTION POINTER(node) defiler ()
BEGIN BEGIN
POINTER(node) e ← tete; POINTER(node) e ← tete;
IF tete ≠ NULL THEN IF tete ≠ NULL THEN
tete ← tete→next; tete ← tete→next;
free (e); free (e);
END IF END IF
END END
Algo 49. - Dépiler un élément Algo 53. - Défiler un élément

VI.3.2 Implémentation de files


Tout autant que les piles, les files sont intensivement utilisées en informatique. Une file est
une structure de données dans laquelle les éléments sont gérés selon la politique FIFO (First
In First Out), c'est à dire que le premier élément enfilé est le premier à être défilé.
L'implémentation se fait donc à l'aide d'une liste chaînée où il faut toujours insérer en fin de
liste et toujours supprimer l'élément de tête. Pour simplifier la gestion d'une file, on
maintient deux pointeurs un sur le tête de la liste et un sur la queue de la liste.

PROCEDURE creer ()
BEGIN
tete ← NULL;
queue ← NULL;
END
Algo 50. - Création d'une file vide

FUNCTION INT sommet ()


BEGIN
IF tete ≠ NULL THEN
return tete->info;
END IF
END
Algo 51. - Accès au sommet de la pile

FUNCTION POINTER(node) enfiler (INPUT INT val)


BEGIN
POINTER(node) e ← POINTER(node)malloc (sizeof (node));
IF e ≠ NULL THEN
e→info ← val;
e→next ← NULL;
IF tete = NULL THEN
tete ← e;
ELSE
queue→next ← e;
END IF
queue ← e;
END IF
END
Algo 52. - Enfiler un élément

Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
77 78

Vous aimerez peut-être aussi