Vous êtes sur la page 1sur 27

Module: Algorithmique et

programmation 2

Chapitre 2 : Les listes chaînées

Ezzaich Amel

Amel Ezzaich – 04/2020


Besoin
Solution de Tableau Statique.
Limite du Tableau Statique.
Solution du liste chainée
Le type abstrait Liste chainée.
Les opérations.

04/2020 Amel Ezzaich


ISET 2
Besoin

Représentation d’un ensemble fini d’éléments de même


type.
 Un ensemble d’entier

4 20 30 5 500

 Un ensemble des notes

4 20 13 5 15

 Un ensemble d’étudiants

Salem
Brahmia Essid
Jrad Mechmech Mohamed
Iheb Manar
Fatma Wissal Khalil

04/2020 Amel Ezzaich


ISET 3
Solution

La première solution en utilisant nos connaissances


algorithmiques:
 Les tableaux statiques
 Les tableaux d’enregistrement
Mais, on peux trouver des problèmes

04/2020 Amel Ezzaich


ISET 4
Limites
 On doit spécifier le nombre max d’éléments lors de la création
du tableau
 Donc, si le nombre réel d’éléments dépasse ce nombre après
on aura un problème d’ajout des nouveaux éléments
 Dans ce cas on doit créer un nouveau tableau de taille
supérieur
 si ce nombre max est très grands, on risque ne pas trouver un
espace mémoire contiguë libre capable de conserver ce tableau
 Par contre, il y a des fragments mémoires libres dont la
somme est supérieur à max libre
 Perte mémoire
libre
 Exemple
 Si nous avons besoin libre
d’un tableau de 5 cases occupé
et cette mémoire occupé
 On ne peut pas créer ce libre
Tableau car on n’a pas 5
libre
cases mémoire contigue
par contre, on a plus que libre
5 cases libres. libre
04/2020 Amel Ezzaich
ISET 5
Solution 2 : Liste chainée

 Une liste chainée est un ensemble fini d’éléments


 On peut déclarer une Liste sans spécification de sa taille max
 L’allocation d’une case se fait au moment de l’insertion d’un
nouveau élément
 Donc, on alloue case par case
 Ces cases peuvent être non contigües
 Exemple:
 Création de la liste{5,6,7,8,9}
libre 5 5 5 5 5
libre libre 6 6 6 6
libre libre libre 7 7 7
occupé occupé occupé occupé occupé occupé
occupé occupé occupé occupé occupé occupé
libre libre libre libre 8 8
libre libre libre libre libre 9
libre libre libre libre libre libre
libre libre libre libre libre libre

04/2020 Amel Ezzaich


ISET 6
Succession des éléments

On observe à partir de cette exemple que le 4ème élément


n’est pas adjacent au précédent
 Qui dit qu’il appartient à la liste?
Réponse:
 Dans une liste chainée, chaque élément contient une information
sur l’élément suivant.
 Chaque élément connait l’emplacement de l’élément suivant
dans la mémoire. 1 5 2
 Chaque élément connait l’adresse 2 6 3

de l’élément suivant 3 7 6

 Chaque élément contient un pointeur 4 occupé


occupé
dont la valeur est l’adresse de l’élément suivant 5
6 8 7
 Chaque élément contient un pointeur
7 9 NULL
qui pointe sur l’élément suivant
8 libre
9 libre

04/2020 Amel Ezzaich


ISET 7
Cellule d’une liste

Vue l’utilisation des pointeurs, on schématise souvent


une liste chainée comme suit:
L
4 5 6 7 8

Donc, une liste chainée est un ensemble des cellules


Chaque cellule contient deux informations
 La valeur de l’élément
 L’adresse de l’élément suivant
Le denier élément pointe sur NULL car il n’a pas de
successeur
L’adresse du premier élément est contenu dans la
variable L

04/2020 Amel Ezzaich


ISET 8
Le type abstrait de données Liste

Pour créer un type abstrait de donnée on doit spécifier:


 Les données
 Les opérations effectuées sur ces données
Le type abstrait de données Liste est définit par:
TYPE LISTE = ↑ cellule
TYPE CELLULE = ENREGISTREMENT
Info : élément
Suivant : ↑ cellule
FIN ENREGISTREMENT
Une liste est un pointeur sur une cellule qui est la
première cellule de la liste
Chaque cellule contient deux informations
 Info: la valeur de l’élément (ce type peut être un enregistrement)
 Suivant: pointeur vers suivant
04/2020 Amel Ezzaich
ISET 9
Les opérations
Init : liste ―> liste //pour créer une liste vide
Liste_vide : liste ―> booléen // vérifie si la liste est vide
Longueur : liste ―>entier // retourne la longueur d’une
liste
Ajout_tête : liste * élément ―> liste //pour ajouter un
élément en tête
Ajout_queue : liste * élément ―> liste //pour ajouter un
élément en queue
Ajoutk : liste * élément * entier ―>liste //Ajoute un élément
à une position donnée.
Créer : liste ―> liste // Crée une liste à partir du clavier
Accesk : liste * entier ―> liste //retourne la liste qui
commence à partir de la position k

04/2020 Amel Ezzaich


ISET 10
Le type abstrait de données Liste

Accesval : liste * élément ―> liste //retourne la liste qui


commence à partir de la 1 ère occurrence d’un élément.
Suppression_tête : liste ―> liste //Supprime la tête de la
liste
Suppression_queue : liste ―>liste //Supprime de la liste
le dernier élément.
Suppk : liste * entier ―>liste //supprime de la liste
l’élément de la position k
Suppval : liste * élément ―>liste //Supprime de la liste la 1
ère occurrence d’un élément donné.
Occurrence : liste ―> entier //Retourne le nombre
d’éléments d’une liste.

04/2020 Amel Ezzaich


ISET 11
La procédure Init

PROCEDURE Init (VAR L : LISTE)


DEBUT
L<― NIL
FIN
L

04/2020 Amel Ezzaich


ISET 12
La fonction Liste_Vide

FONCTION Liste_vide (L : Liste) : booléen


DEBUT
RETOURNER (L = NIL)
FIN
L

04/2020 Amel Ezzaich


ISET 13
La fonction longueur

FONCTION Longueur (L : Liste) : entier


L
VAR 0
4 5 6
N : entier, P : Liste
L 1
DEBUT 4 5 6
P
1 P <―L N
2 N←0 2 0
TANT QUE P <> NIL FAIRE L 3 P
N <― n+1 N 1 4 5 6
3 L P
P <― p↑.suivant N 2 4 5 6
FIN FAIRE L P
N 3 4 5 6
RETOURNER (N)
FIN

04/2020 Amel Ezzaich


ISET 14
La procédure Ajout_tête
PROCEDURE Ajout_tête (L : Liste, e : élément)
L
VAR 0
4 5 6 7 8
1 P : Liste
P
DEBUT 1
P
2 P <― ALLOUER ()
2P
3 P↑.info <― e
4 P↑.suivant <― L 3P e
5 L <― P L 4 e
6 P <― LIBERER() 4
FIN
L P 5 6 7 8

5 e
4 5 6 7 8
L
P 6
e
4 5 6 7 8

04/2020 Amel Ezzaich


ISET 15
La procédure Ajout_queue

PROCEDURE Ajout_queue (VAR L : Liste, e : élément)


VAR
Pt, p : Liste 1 0 L

DEBUT
SI L = NIL ALORS P
1
2 P <―ALLOUER () P
2P
3 p↑.info <―e
4 p↑.suivant <―NIL 3 e
5 L<― p P
4
6 P <― LIBERER() e
P L
L
P
5 e
e 6

04/2020 Amel Ezzaich


ISET 16
La procédure Ajout_queue suite

L
SINON 0
4 5 6
Pt <― L
TANT QUE pt↑.suivant <>L NIL FAIRE
1
1 Pt <― pt↑.suivant 4 5 6
Pt
FIN FAIRE L 1 Pt
2 P <― ALLOUER () 4 5 6
L 1 Pt
3 p↑.info <―e
4 5 6
4 p↑.suivant <―NIL P P
5 pt↑.suivant <― p 2 3 e
P
4
FIN SI e
FIN
L Pt
5 4 5 6

04/2020 Amel Ezzaich


ISET 17
La procédure Ajoutk

PROCEDURE Ajoutk (VAR L : Liste, e : élément, k : entier)


L
VAR 0 k
4 5 6
P : Liste, Prec : Liste 3

DEBUT
SI k = 1 ALORS
Ajout_tête (L, e)
SINON L 1 Prec
1 Prec <― Accesk (l, k-1) 4 5 6
SI prec <> NIL ALORS P
P
2 P <― ALLOUER () 2 e
3
3 p↑.info <― e

04/2020 Amel Ezzaich


ISET 18
La procédure Ajoutk suite

p↑.suivant <― prec↑.suivant


4
5 prec↑.suivant <― p
FIN SI
FIN SI Prec
L
FIN 4 5 6

5
Voila l’insertion  P 4
e

04/2020 Amel Ezzaich


ISET 19
La procédure Créer

PROCEDURE Créer (VAR L : Liste)


VAR
E : élément, rep : caractère
DEBUT
L <― NIL
REPETETR
ECRIRE (« Donner un élément »)
LIRE (e)
Ajout_tête (L, e) // ou aussi Ajout_queue (L, e)
ECRIRE (« Voulez-vous continuer ? »)
LIRE (rep)
JUSQU'A rep =’n’
FIN
04/2020 Amel Ezzaich
ISET 20
La fonction AccesK (version récursive)

FONCTION Accesk (L : Liste, L


k : entier) : Liste
DEBUT 0
4 5 6
SI (L= NIL) ou (k =1) ALORS
RETOURNER (L)
SINON
RETOURNER (Accesk (L↑.suivant, k-1))
P
FIN SI
FIN
AccesK(L,2)=AccesK(Lsuivant,1)=Lsuivant

04/2020 Amel Ezzaich


ISET 21
La procédure Accesval
FONCTION Accesval (L : Liste, val: élément) : Liste
VAR
P: Liste
Trouve: booleen
DEBUT
P <― L
Trouve = FAUX
TANT QUE (trouve = faux) et (p<> NIL) FAIRE
SI p↑.info = val ALORS
Trouve = VRAI
SINON
P <― p↑.suivant
FIN SI
FIN FAIRE
RETOURNER (p)
FIN
04/2020 Amel Ezzaich
ISET 22
La procédure suppression_tête

PROCEDURE Suppression_Tête (VAR L : Liste)


L
VAR 0
4 5 6
P : liste
DEBUT
Si l <> NIL ALORS L 1
1 P <― L 4 5 6
P
2 L <― L↑.Suivant L
2
3 LIBERER (p) P
4 5 6
FIN SI
FIN P L
3
5 6

04/2020 Amel Ezzaich


ISET 23
La procédure Suppression_queue

PROCEDURE Suppresion_queue (VAR L : Liste)


L
VAR 0
4 5 6
P, prec : Liste
DEBUT
SI L <> NIL ALORS
SI L↑.suivant = NIL
Suppression_tête (L)

04/2020 Amel Ezzaich


ISET 24
La procédure Suppression_queue suite
L
SINON 0
4 5 6
P <―L
TANT QUE P↑.suivant <> NIL FAIRE
Prec <― p
1 P <― p↑.suivant Prec P
L 1
FIN FAIRE 4 5 6
2 Prec↑.suivant <― NIL
3 LIBERER (p) Prec P
L
FIN SI 2
4 5 6
FIN SI
FIN P
3

04/2020 Amel Ezzaich


ISET 25
La procédure SuppressionK

PROCEDURE Suppressionk (VAR L : Liste, k : entier)


L
VAR 0 k
4 5 6
P, prec : Liste 2

DEBUT
Si (L<> NIL) et (k=1) ALORS
Suppression_tête (L)
Prec P
SINON L 1 2
1 Prec <― Accesk (L, k-1) 4 5 6
SI prec <> NIL ALORS
2 P <― prec↑.suivant

04/2020 Amel Ezzaich


ISET 26
La procédure SuppressionK

SI p <> NIL ALORS


3 Prec↑.suivant <― p↑.suivant
4 LIBERER (p)
FIN SI
FIN SI
Prec
FIN SI L 3
FIN 4 P 6
5
L
P 4
4 6

04/2020 Amel Ezzaich


ISET 27