2. 1.Introduction
• Le type tableau : structure linéaire pour lequel les éléments de même type le
composant sont placés de façon contigüe en mémoire.
• Pour créer un tableau, il faut connaître sa taille qui ne pourra être modifiée au
cours du programme, et lui associer un indice pour parcourir ses éléments.
• On accède à un élément du tableau directement grâce à son indice.
• La structure de type tableau pose des problèmes pour insérer ou supprimer un
élément car ces actions nécessitent des décalages du contenu des cases du
tableau qui prennent du temps dans l'exécution d'un programme.
• Ce type de stockage de valeurs peut donc être coûteux en temps d'exécution.
• Il existe une autre structure, appelée liste chaînée: cette structure permet plus
aisément d'insérer et de supprimer des valeurs dans une liste linéaire d'éléments.
3. 2. Définition
• Une liste chaînée est une structure linéaire qui n'a pas de dimension
fixée à sa création.
• Ses éléments de même type sont éparpillés dans la mémoire et reliés
entre eux par des pointeurs.
• Sa dimension peut être modifiée selon la place disponible en
mémoire.
• La liste est accessible uniquement par sa tête de liste c’est-à-dire son
premier élément.
3
4. 2. Définition
• Pour les listes chaînées la séquence est mise en oeuvre par le
pointeur porté par chaque élément qui indique l'emplacement de
l'élément suivant.
• Le dernier élément de la liste ne pointe sur rien (Nil).
• On accède à un élément de la liste en parcourant les éléments grâce à
leurs pointeurs
5. Exemple
• Soit la liste chaînée suivante (@ indique que le nombre qui le suit
représente une adresse) :
• Pour accéder au troisième élément de la liste il faut toujours débuter la
lecture de la liste par son premier élément dans le pointeur duquel est
indiqué la position du deuxième élément.
• Dans le pointeur du deuxième élément de la liste on trouve la position du
troisième élément…
• Pour ajouter, supprimer ou déplacer un élément il suffit d'allouer une place
en mémoire et de mettre à jour les pointeurs des éléments.
6. 3. Types de listes chainées
Il existe différents types de listes chaînées :
• Liste chaînée simple constituée d'éléments reliés entre eux par des
pointeurs.
• Liste chaînée ordonnée où l'élément suivant est plus grand que le précédent.
L'insertion et la suppression d'élément se font de façon à ce que la liste reste
triée.
• Liste doublement chaînée où chaque élément dispose non plus d'un mais de
deux pointeurs pointant respectivement sur l'élément précédent et l'élément
suivant. Ceci permet de lire la liste dans les deux sens, du premier vers le
dernier élément ou inversement.
• Liste circulaire où le dernier élément pointe sur le premier élément de la
liste. S'il s'agit d'une liste doublement chaînée alors de premier élément
pointe également sur le dernier.
8. 4. Représentation des données
• Une liste chaînée simple est composée :
➢d'un ensemble d'éléments tel que chacun :
▪ est rangé en mémoire à une certaine adresse,
▪ contient une donnée (Info),
▪ contient un pointeur, souvent nommé Suivant, qui contient l'adresse de
l'élément suivant dans la liste,
➢d'une variable, appelée Tête, contenant l'adresse du premier élément de la
liste chaînée.
• Le pointeur du dernier élément contient la valeur Nil.
• Dans le cas d'une liste vide le pointeur de la tête contient la valeur Nil.
• Une liste est définie par l'adresse de son premier élément.
9. 4. Représentation des données
• Soit la liste chainée suivante:
• Le 1er élément de la liste vaut 12 à l'adresse 3 (début de la liste chaînée)
• Le 2e élément de la liste vaut 14 à l'adresse 4 (car le pointeur de la cellule d’adresse 3 est égal à 4)
• Le 3e élément de la liste vaut 10 à l'adresse 2 (car le pointeur de la cellule d’adresse 4 est égal à 2)
• Le 4e élément de la liste vaut 24 à l'adresse 1 (car le pointeur de la cellule d’adresse 2 est égal à 1)
• Si P a pour valeur 3 : P^.Info a pour valeur 12 et P^.Suivant a pour valeur 4
• Si P a pour valeur 2 : P^.Info a pour valeur 10 et P^.Suivant a pour valeur 1
10. 4. Représentation des données
• La structure de donnée qui permet de représenter une liste chaînée dans le
cas général est déclarée comme suit :
• Ainsi le type Liste est un pointeur vers le type Element qui est un
enregistrement formé de deux champs : un qui contient la valeur de
l’élément et le 2ème champ contient un pointeur vers la cellule suivante.
• La dernière cellule ne pointe vers rien donc elle doit contenir la valeur Nil.
• Le type Liste contient un pointeur vers le type Element qui contient
l’adresse du 1er élément de la liste.
Type
Element = enreg
valeur : type
suivant : ^Element
FinEnreg
Liste : ^ Element
11. 5. Opérations sur les listes
• Le test si la liste est vide.
• Calculer la longueur d'une liste (nombre d'éléments)
• Ajouter un élément:
• au début de la liste
• à la fin de la liste
• à un rang donné
• Rechercher un élément:
• résultat booléen
• résultat = rang de la première occurrence
• résultat = nombre d'occurrences
• Supprimer un élément:
• caractérisé par sa valeur
• caractérisé par son rang
13. 5. Opérations sur les listes
• Implémentation des primitives
•
Type
Element = Enreg
val : entier
suiv : ^Element
FinEnreg
Liste = ^ Element
var
L : Liste
14. Activité 1:
• Ecrire une procédure Init(L) qui permet d’initialiser une liste L
• Ecrire une fonction Vide(L) qui permet de tester si une liste L est vide
ou non
14
15. • Procédure Init
• Fonction Vide
Procédure Init (Var L : Liste)
Début
L ← Nil
Fin
Fonction Vide (L : Liste): Booléen
Début
Vide ← (L = Nil)
Fin
16. Activité 2:
• Ecrire une fonction Taille(L) qui revoie la taille d’une liste L
• Ecrire une fonction premier(L) qui revoie la valeur du premier
élément d’une liste L
• Ecrire une fonction Dernier(L) qui revoie la valeur du dernier élément
d’une liste L
16
17. Fonction Taille (L : Liste) : entier
var
T : entier
P : Liste
Début
T ← 0
P ← L
Tant que (P ≠ Nil) faire
P ← P^.suiv
T ← T + 1
Fin tant que
Taille ← T
Fin
Fonction Dernier (L : Liste) : entier
Var
P : Liste
Début
P ← L
Tant que (P^.suiv ≠ Nil) faire
P ← P^.suiv
Fin Tant que
Dernier ← P^.val
Fin
19. Activité 3:
• Ecrire une procédure InsererDebut(var L:Liste, x:entier) qui permet
d’ajouter un élément au début de la liste
• Ecrire une fonction InsererFin(Var L:Liste,x: entier) qui permet
d’ajouter un élément à la fin de la liste
• Ecrire une fonction SupprimerDebut(Var L: Liste) qui permet de
supprimer le premier élément de la liste
• Ecrire une fonction Face (L: liste):Liste qui permet de supprimer le
dernier élément de la liste
19
20. Procédure InsererDebut Procédure InsererFin
Procédure InsererDebut (Var L : Liste, x : entier)
var p: Liste
Début
Allouer (p)
p^.val ← x
p^.suiv ← L
L ← p
Fin
Procédure InsererFin (Var L : Liste, x : entier)
var p,q : Liste
Début
p ← L
Tant que ((p^.suiv) ≠ Nil) Faire
p ← p^.suiv
Fin Tant que
Allouer (q)
q^.val ← x
q^.suiv ← Nil
p^.suiv ← q
Fin
21. 5. Opérations sur les listes
Fonction Face
Fonction Face (L : Liste) : Liste
Var P, K : Liste
Début
Si (Taille (L)=1) alors
Face ← Nil
Sinon
P ← L
Init(K)
Tant que ((P^.suiv) ^.suiv ≠ Nil) faire
InsererFin (K, P^.val)
P ← P^.suiv
Fin Tant que
InsererFin (K, P^.val)
P^.suiv ← Nil
Face ← K
Fin si
Fin
22. 5. Opérations sur les listes
Procédure SupprimerDebut
Procédure SupprimerDebut (Var L : Liste)
Var P : Liste
Début
Si (L <> Nil) alors
P ← L
L ← L^.suiv
Libérer (P) -- permet de libérer l’espace mémoire relatif à P
Finsi
Fin
23. 6. Liste doublement chainée
• Ce type de structure de données est quasiment identique à la précédente
sauf que chaque maillon possède un pointeur vers l’élément précédent.
• C’est une liste dans laquelle on pourra se déplacer en avant ou en arrière.
• chaque élément contient, en plus du champ suivant, un champ prédécesseur
qui est un pointeur sur l’élément précédant dans la liste.
• Si le champ prédécesseur d’un élément vaut Nil, cet élément n’a pas de
prédécesseur et est donc le premier élément ou la tête de la liste.
24. 6. Liste doublement chainée
Type
Element = Enreg
val : entier
suiv : ^Element
pred: ^Element
FinEnreg
Liste = ^Element
var
L : Liste
25. 7. Liste circulaire
• ce type de liste n’est pas linéaire mais cyclique, c’est à dire que le dernier
élément pointe vers le premier.
• Des traitements particuliers doivent être faits puisqu’il faut tenir compte du
fait que le Nil n’existe plus pour représenter le dernier élément.
• La taille de la liste doit être toujours mise à jour.