Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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
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
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
TÊTE
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
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
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
2 ELEM TÊTE
Fig. 20 - Liste 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
NULL info info info info NULL NULL info info info info info NULL
×
TÊTE
2 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
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
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;
×
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 creer ()
BEGIN
tete ← NULL;
queue ← NULL;
END
Algo 50. - Création d'une file vide
Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données Ecole Polytechnique de Tunisie | Cours Algorithmique et Structures de Données
77 78