Académique Documents
Professionnel Documents
Culture Documents
Ch4 - Les Listes
Ch4 - Les Listes
données
Elaboré par Mme Elkamel Hager
Jamoussi.hager@gmail.com
Plan du cours
Chapitre 1 : La récursivité
Chapitre 2 : Les enregistrements
Chapitre 3 : Les pointeurs
Chapitre 4 : Les Listes chainées
Chapitre 5 : Les Types Abstraits des données
Chapitre 6 : Les piles
Chapitre 7 : Les Files
Chapitre 8 : Les Arbres
Chapitre 9 : Les Arbres binaires de recherche
Chapitre 10 : Analyse et complexité des
algorithmes
H. Jamoussi Elkamel , FSM 2
Alg Avancée
1
Chapitre 4 : Les Listes Chainées
2
Les opérations sur une Liste
• Pour manipuler une Liste il faut définir un
ensemble d’opérations.
• Ces opérations doivent être minimales tout en
étant suffisantes pour permettre de manipuler la
Liste.
• Ces opérations sont de deux types
– les Observateurs
– les Constructeurs.
3
Les conditions sur une opération
• Une opération est considérée comme une fonction totale ou
une fonction partielle dont la restriction s’exprime par des
conditions d’applications qu’on doit spécifier
• Ces conditions sont :
• Pré conditions: conditions supposées êtres vraies quand on fait
appel à une opération.
• Exemple: supprimer un élément d’une liste
pré conditions: la liste n’est pas vide
• les pré conditions d’une opération ne doivent jamais être vérifiées à
l’intérieur de celle-ci, mais par la méthode appelante.
• Post conditions: conditions supposées êtres vraies après appel à
une opération.
• Exemple: insérer un élément dans une liste
post conditions: la liste n’est pas vide
• les observateurs ne font aucune modification des objets, donc n’admettent
pas de post conditions.
4
TAD Liste
observateurs
estVide : Liste Booléen
• Détermine si la liste est vide ou non
premier : Liste Position
• Renvoie la position du premier élément.
• Pré conditions: Liste non vide
Dernier : Liste Position
• Renvoie la position du dernier élément.
• Pré conditions: Liste non vide
elt : Liste Position Elément
• Renvoie l’élément se trouvant dans une position
donnée.
• Pré conditions: Liste non vide, position valide.
H. Jamoussi Elkamel , FSM 9
Alg Avancée
TAD Liste
Suivant : Liste Position Position
• Donne la position suivante.
• Pré conditions: La liste n’est pas vide, la position est
valide et on n’est pas à la fin de la liste
5
Implémentation d’une Liste
Pour implémenter une liste on utilise une structure des données.
6
Implémentation Tableau d’une Liste
Avantages
• L’accès à un élément est direct
• L’accès est rapide
Inconvénients
• La Suppression et l’insertion nécessite généralement un décalage
(pour insérer un élément dans un tableau T à la kème position, il faut
tout d’abord déplacer tous les éléments du tableau de la kème position
jusqu’au dernier élément, ensuite placer l’élément à intercaler à la
kème position).
• Espace de taille fixe:
o Perte d’espace
o Manque d’espace.
• occupation inutile de l’espace mémoire pendant l’exécution
H. Jamoussi Elkamel , FSM 13
Alg Avancée
7
Implémentation dynamique d’une Liste
Avantages
• L’avantage d’une liste chaînée par rapport à un tableau est sa
souplesse : on peut l’agrandir, intercaler des objets et diminuer sa
taille, avec un minimum d’opérations.
• L’insertion et la suppression d’un élément dans une liste chaînée
sont réalisées sans le recours au décalage des éléments
Inconvénients
• L’accès à un élément est un accès séquentiel. Pour accéder à
l’élément à la kème position, il faut parcourir la liste depuis le début
jusqu'à atteindre la kème position.
8
Liste simplement chainée
Une liste simplement chaînée étant une succession de cellules (nœuds) tel
que :
– les cellules sont chainées (liées) entre elles en utilisant les pointeurs
Exemple L=<25, 3, 10, 15 > une liste de 4 entiers
25 3 10 15 /
Tête
– Chaque cellule dans une liste simplement chainée contient deux
champs:
• Un champs qui contient la valeur de l’élément c’est l’information à
traiter
• Un champs qui donne l’adresse de la cellule contenant l’élément
suivant c’est un pointeur vers la cellule suivante.
Valeur de L’adresse de la cellule
l’élément contenant l’élément suivant
25
H. Jamoussi Elkamel , FSM 17
Alg Avancée
25 3 10 15 /
Tête
– La liste est identifiée par sa tête qui est le pointeur sur la première
cellule.
– La perte de la tête de la liste conduit à la perte de la liste
– La dernière cellule n’a pas de suivant elle pointe vers l’adresse
invalide (nil ) représentée par / .
– Le principal problème des listes simplement chaînées est l'absence de
pointeur sur l'élément précédent du maillon, il est donc possible de
parcourir la chaîne uniquement du début vers la fin.
– Une liste vide est réduite au pointeur nil ( tete = nil)
H. Jamoussi Elkamel , FSM 18
Alg Avancée
9
Déclaration
A B C D /
Tête
Type
Cellule = Enregistrement
Val Suiv
val: Elément B
Suiv : ^Cellule
FinCellule p
Position = ^Cellule /* une position dans la liste est l’adresse d’une cellule*/
Liste = ^Cellule /*une liste est identifiée par l’adresse de la première cellule*/
Var
Tete : liste
P : position
H. Jamoussi Elkamel , FSM 19
Alg Avancée
Déclaration
25 10 34 15 /
Tête queue
Type
Cellule = Enregistrement
val: entier
Suiv : ^Cellule
FinCellule
Position = ^Cellule
Liste = ^Cellule
10
Déclaration
Pour définir une liste simplement chaînée d’étudiants il suffit d’écrire
Type NCE nom prenom age suiv
CelluleEtudiant = Enregistrement
NCE : chaine[5]
nom, prénom : chaîne[25]
Age : entier
Suiv : ^CelluleEtudiant
FinCelluleEtudiant
Position = ^CelluleEtudiant
Liste = ^CelluleEtudiant
Tête^.val Tête^.suiv
H. Jamoussi Elkamel , FSM 22
Alg Avancée
11
Début et fin de la liste
25 10 34 15 /
Tête queue
• Deux positions sont très importantes dans une liste chainée : le début
et la fin, souvent désignées par "premier et dernier" ou "tête et queue".
• Sans le tête impossible de savoir où commence la liste chainée et sans
la queue impossible de savoir où elle s'arrête.
• Si la liste est vide la tête et la queue sont nil
• Si la liste n’est pas vide
o La tête est donnée par l'adresse de la première cellule
o La queue est donnée par l’adresse de la dernière cellule dans la liste, elle est
définie par ( queue^.suiv = nil )
H. Jamoussi Elkamel , FSM 23
Alg Avancée
12
Début et fin de la liste
premier : Liste Position
• Renvoie la position du premier élément.
• Pré conditions: Liste non vide
13
Parcours d’une liste chaînée
C'est l'opération de base sur les listes :
• on va du début à la fin de la liste
• à chaque cellule on fait une opération qui utilise sa donnée.
On a seulement un schéma d'algorithme, parce qu'il y a plusieurs
variantes selon le traitement. Quelques exemples de traitement
• Afficher toutes les données à l'écran,
• renvoyer la somme ou la moyenne des données,
• renvoyer la liste des données supérieures à 3.
Pour parcourir une liste chainée il suffit avec un pointeur de prendre
successivement l'adresse de chaque maillon. Au départ le pointeur prend
l'adresse du premier élément qui est la tête de la liste, ensuite il prend
l'adresse du la cellule suivante et ainsi de suite jusqu’à terminer la liste .
14
Schéma d’un algorithme de Parcours
Type
Problème parcours Cellule = Enregistrement
o Entrées : tete : Liste des éléments val : element
o Sortie : le type de valeur de retour Suiv : ^Cellule
dépend du traitement FinCellule
Position = ^Cellule
Procedure parcours ( Tete : Liste) Liste = ^Cellule
Var p : position
Début
ptete
Initialisation traitement
TantQue ( p < > nil) faire
traiter p^.val
p p^.suiv
FinTantQue
terminaison traitement
Fin
H. Jamoussi Elkamel , FSM 29
Alg Avancée
15
Calcul somme des éléments d’une liste
Type Cellule = Enregistrement
Problème Somme-Elements val : entier
Suiv : ^Cellule
o Entrées : tete : Liste des entiers
FinCellule
o Sortie : S: entier somme des éléments Position = ^Cellule
Liste = ^Cellule
Fonction Somme-Elements ( Tete : Liste): entier
Var p : position
S: entier
Début
ptete
S0
TantQue ( p < > nil) faire
SS+ p^.val
p p^.suiv
FinTantQue
Retourner(S)
Fin
Alg Avancée H. Jamoussi Elkamel , FSM 31
16
Recherche d’un éléments
Type
Problème Trouver-Elem
Cellule = Enregistrement
o Entrées : tete : Liste des entiers
val: entier
E: entier Suiv : ^Cellule
o Sortie : p: position de e dans la liste FinCellule
tete s’il existe, nil sinon Position = ^Cellule
Liste = ^Cellule
Type
Recherche d’un éléments
Cellule = Enregistrement
val: entier
Suiv : ^Cellule
FinCellule
Position = ^Cellule
Liste = ^Cellule
Procedure Trouver-Elem ( E: entier, Tete : Liste) : position
Var p : position
Début
ptete
TantQue ( p < > nil) et (p^.val < > E) faire
p p^.suiv
FinTantQue
// si p = nil : E non trouvé dans la liste
// si p ≠ nil : E se trouve dans la position P
retourner(p)
Alg Avancée Fin H. Jamoussi Elkamel , FSM 34
17
Les opérations de modification d’une liste chainée
La liste représentant un ensemble d’éléments organisés en
séquence, nous retrouvons les opérations habituelles
associées :
créerListe : Liste
• Post condition: la liste est crée et elle est vide
La manière la plus simple d’initialiser une liste identifiée par la
variable tête est de mettre celle-ci à nil
18
Ajout d’un élément en tête
Problème Inserer-tete : Permet d’insérer un élément en entête de la liste
Tête
25 10 34 15 /
4
3
1
1 Créer une nouvelle cellule pointé par p
E 2
p 2 Initialiser le champ val avec l’élément E
val suiv
3 Chainer la cellule à la liste
4 Changer la tête
H. Jamoussi Elkamel , FSM 37
Alg Avancée
19
Ajout d’un élément en tête
Tête Insérer-tete : Elément Liste Liste
25 10 34 15 /
4
3
1 Le cas où tete =NIL (liste vide)
E 2 entre dans le cas général :
p p^.suiv prend la valeur NIL
val suiv
Procedure inserer-tete (var tete: Liste; E: element)
var p: position
Début
allouer(p)
p^.val← E
p^.suiv← tete
tete ← p
Alg Avancée
Fin H. Jamoussi Elkamel , FSM 39
20
ajout au milieu après une position q
Insérer-après : Elément position Liste Liste
• Prés condition : la liste n’est pas vide
la position q est une position dans la liste
• Post condition: la liste n’est pas vide
Tête suiv
25 10 34 15 /
4 3
1
q E 2
p val suiv
1 Créer une nouvelle cellule pointé par p allouer(p)
2 Initialiser le champ val avec l’élément E p^.val← E
3 Chainer la cellule à la liste après le q p^.suiv← q^.suiv
4 Détourner le chaînage q^.suiv← p
H. Jamoussi Elkamel , FSM 41
Alg Avancée
ajout en queue
• Le cas où q pointe sur la dernière cellule de la liste entre dans le cas
général : p^.suiv prend la valeur NIL ( q^.suiv = nil)
suiv
Tête
25 10 34 15 /
4
1
q p E 2 /3
val suiv
1 Créer une nouvelle cellule pointé par p allouer(p)
2 Initialiser le champ val avec l’élément E p^.val← E
3 Définir la cellule p comme dernière cellule p^.suiv← nil
// p^.suiv← q^.suiv
4 chaînage de la cellule p à la suite de q q^.suiv← p
H. Jamoussi Elkamel , FSM 42
Alg Avancée
21
Ajout d’un élément après une position q
Insérer-apres : Elément position Liste Liste
Tête suiv
25 10 34 15 /
l'insertion à la fin ou 4 3
au milieu c'est le 1
q
même travail, ce E 2
n'est pas la peine de p val suiv
traiter chaque cas à
part Procedure inserer-apres (var tete: Liste; q: position E: élément)
var p: position
Début
allouer(p)
p^.val← E
p^.suiv← q^.suiv // si insertion en queue q^.suiv = nil
q^.suiv ← p
H. Jamoussi Elkamel , FSM 43
Alg Avancée
Fin
Insérer un élément
problème Inserer : Permet d’insérer un élément E dans une
liste
22
Insérer un élément comme kième élément
Problème Inserer-kième : Permet d’insérer un élément E
dans une liste comme kième élément
23
Insérer un élément comme kième élément( 2ième proposition)
Insérer-kième : Elément entier Liste Liste
Procédure insérer-kième (E: élément; k: entier ; var tete : Liste)
Var qpred, p : position
Début
Si estVide(tete) ou (k=1) Alors //Insertion en tête
Insérer-tete(E, tete)
Sinon // recherche la position du prédécesseur et insertion après
qpred tete
Pour i de 2 à (k -1) faire
qpred qpred^.suiv
FinPour
24
Insérer un élément dans une liste triée
Exemple insérer l’élément 18 dans la séquence <5, 10, 24, 45>
1. Créer une nouvelle cellule P et y ranger 18
Tête
5 10 24 45 /
18 /
p val suiv
H. Jamoussi Elkamel , FSM 49
Alg Avancée
qpred qc
18 /
p val suiv
H. Jamoussi Elkamel , FSM 50
Alg Avancée
25
Insérer un élément dans une liste triée
Pour trouver la cellule précédente à celle de l’élément à insérer, la liste
est parcourue tant que nous n’avons pas atteint la fin de la liste et que la
valeur de l’élément à insérer E est supérieure a la valeur de l’élément
courant.
Nous avons besoin de deux pointeurs :
• un pour l’élément courant : qc
• et un pour l‘élément précedent : qpred
A chaque tour, avant d'avancer l’élément courant d’une cellule, l'adresse
de l’élément précèdent est sauvegardée :
au départ
• qc est initialisé à la tête
• qpred est initialisé à nil
Tête suiv
5 10 24 45 /
qpred qc
18
p val suiv
H. Jamoussi Elkamel , FSM 52
Alg Avancée
26
Insérer un élément dans une liste triée
Exemple insérer l’élément 18 dans la séquence <5, 10, 24, 45>
4. Détourner le chaînage: déterminer la valeur du successeur de qpred
c’est le p
Tête suiv
5 10 24 45 /
qpred qc
18
p val suiv
H. Jamoussi Elkamel , FSM 53
Alg Avancée
Fin
27
Insérer un élément dans une liste triée ( 2ième proposition)
Insérer-triée : Elément Liste Liste
Procédure insérer-triée (E: élément; var tete :Liste)
Var qpred, qc, p : position
Début
Si (tete= nil) ou (E < tete^.val ) Alors //Insertion en tête
inserer-tete(E, tete)
Sinon // recherche la position du prédécesseur et insertion après
qc tete
tant que (qc <> nil ) et ( E > qc^.suiv ) faire
qpred qc
qc qc^.suiv
FinTantque
// qc = NIL ou qc^.val ≥ E : on place E avant qc donc après qpred
inserer-après(E, qpred, tete)
FinSi
Fin
H. Jamoussi Elkamel , FSM 55
Alg Avancée
28
Suppression d’un élément en tête
Supprimer-tete : Liste Liste
• Supprime la cellule qui se trouve en entête de la liste.
• Pres- condition: la liste n’est pas vide
2
Tête
25 10 34 15 /
1 3 Procedure supprimer-tete (var tete : Liste)
var p: position
Début
p p ← tete
Le cas: la liste contient un tete ← tete^.suiv
seul élément (tete^.suiv= nil) liberer(p)
entre dans le cas général: p← nil
après la suppression la liste Fin
dévient vide (tete= nil).
29
Suppression au milieu après une position q
supprimer-après : position Liste Liste
• Prés condition : la liste n’est pas vide
la position q est une position dans la liste
30
Suppression d’un élément après une position q
Supprimer-apres : position Liste Liste
Tête suiv 2 suiv
25 10 34 15 /
3
La suppression à la fin ou au
1
milieu c'est le même travail, q
ce n'est pas la peine de traiter p
chaque cas à part
Procedure Supprimer-apres (var tete: Liste; q : position )
var p: position
Début
p ←q^.suiv
q^.suiv← p^.suiv // si suppression en queue p^.suiv = nil
liberer(p)
p← nil
Alg Avancée Fin H. Jamoussi Elkamel , FSM 61
31
Supprimer kième élément
Problème Supprimer-kième : Permet de supprimer kième
élément de la liste.
32
Supprimer kième élément( 2iere proposition)
33
Supprimer un élément dans une liste triée
Exemple: supprimer 24 de la séquence <5, 10, 24, 45, 56>
Tête suiv
5 10 24 45 56 /
qpred qc
qpred qc
34
Supprimer un élément dans une liste triée
Exemple: supprimer 24 de la séquence <5, 10, 24, 45, 56>
Tête suiv
5 10 45 56 /
qpred qc
35
Supprimer un élément dans une liste triée( 1iere proposition)
36
Les algorithmes récursifs de
manipulation d’une liste simplement
chainée
Tête^.suiv
H. Jamoussi Elkamel , FSM 74
Alg Avancée
37
Algorithmes récursifs de manipulation d’une liste
• Une liste n’a que deux états : vide (nil) ou non vide ( non nil)
• Les algorithmes récursifs de manipulation d’une liste chaînée auront
un cas de base qui contiendra l’état nil
Les algorithmes récursifs
cas de Base : la liste vide : tête = NIL
le processus de Récurrence : tête pointe sur une cellule composée :
o d’un élément (tete^.val) premier élément de la liste
o d’une Adresse (tete^.suiv) représentant la tête du reste de la liste qui suit le
premier élément
• Les algorithmes récursifs comporteront donc toujours un paramètre
de plus (modifié) : la tête de la liste sur laquelle porte l’opération.
Cas de base
1. La liste vide (tete = nil ) => traitement particulier
Processus récursif
si la liste n’est pas vide (tete < > nil )
• Traiter l’élément qui est en entête
• et poursuivre le parcours récursif du reste de la liste .
38
Algorithme récursif de calcul de la longueur de la liste
Cas de base
1. La liste vide (tete = nil ) => longueur est 0
Processus récursif
si la liste n’est pas vide (tete < > nil )
• Longueur = 1 ( l’élément qui est en entête ) + longueur du reste de la
liste .
39
Algorithme récursif de calcul de la somme des éléments d’une liste
Cas de base
1. La liste vide (tete = nil ) => somme est 0
Processus récursif
si la liste n’est pas vide (tete < > nil )
• Somme = valeur de l’élément qui est en entête + longueur du reste de
la liste .
40
Algorithme récursif de recherche dans une liste triée
Problème Recherche-triée-Rec : Permet de rechercher un
élément E dans une liste triée par ordre croissant
Tête suiv
5 10 24 45 /
Tête^.suiv
H. Jamoussi Elkamel , FSM 82
Alg Avancée
41
Algorithme récursif de recherche dans une liste triée
42
Algorithme récursif d’insertion dans une liste triée
Exemple: soit la séquence <5, 10, 24, 45>
Tête suiv
5 10 24 45 /
Tête^.suiv
FinSi
FinSi
Fin
H. Jamoussi Elkamel , FSM 86
Alg Avancée
43
Algorithme récursif d’insertion dans une liste triée
(2iere proposition)
Insérer-triée-Rec : Elément Liste Liste
inserer-tete(tete)
FinSi
FinSi
Fin
H. Jamoussi Elkamel , FSM 87
Alg Avancée
44
Algorithme récursif de suppression dans une liste triée
Tête suiv
5 10 24 45 /
Tête^.suiv 89
Alg Avancée H. Jamoussi Elkamel , FSM
FinSi
FinSi
FinSi
H. Jamoussi Elkamel , FSM 90
Alg AvancéeFin
45
Algorithme récursif de suppression dans une liste triée
(2ième proposition)
Supprimer-triée-Rec : Elément Liste Liste
Procédure supprimer-triée-Rec (E: élément; var tete :Liste)
Var p : position
Début // créer et initialiser une nouvelle cellule
Si (tete < > nil)
Alors Si (e = tete^.val )
alors //supprision en entête
Supprimer-tete(tete)
FinSi
FinSi
FinSi
Alg AvancéeFin H. Jamoussi Elkamel , FSM 91
46
Variantes de représentation des listes chaînées
o Pointeurs de queue
o Listes circulaires
47
Listes avec pointeur de queue
Tête
A B C D /
queue
48
Listes avec pointeur de queue
49
Listes avec pointeur de queue
• Suppression Procrdure supprimer(p: Position; var L: Liste)
• Recherche de l’élément à Var q: position
supprimer Début
• Changement du Chaînage si (p= nil ) // suppression en tête
• Exemple après une alors
position p qtete
• Précondition : la liste n’est L.tête tête^.suiv
pas vide
Sinon // suppression milieu ou à la fin
2 qp^.suiv
p^.suivq^.suiv
A B
Finsi
p 3 Si (q=L.queue) // l’élément à supprimer est le dernier élément
X alors L.queuep
1 Finsi
q Libérer(q)
Fin
H. Jamoussi Elkamel , FSM 99
Alg Avancée
50
Elément fictif placé en tête
Tête
B C D /
Premier élément
de la liste
• On a toujours une liste non vide
• On accède à la liste par l’élément fictif, la tête n’est jamais modifiée
• Permet d’unifier les opérations de modification de la liste
o Ajout en tête = ajout après l’élément fictif
o Suppression en tête = suppression de l’élément après l’élément fictif
Liste circulaire
51
Liste circulaire
Premier élément
de la liste
Tête
A B C D
52
Liste circulaire
Premier élément
de la liste
Tête
A B C D
53
Listes doublement chainée
54
Liste doublement chaînée
Tête queue
/ A B C D /
55
Listes doublement chainée
56
Ajout d’un élément en tête
Insérer-tete : Elément Liste Liste
• Post condition: la liste n’est pas vide et l’élément est en tête de la liste
L.queue
L.Tête pred
/ A B C D /
5 Procedure inserer-tete (var L: Liste; E: élément)
3
4
var p: position
1 2 Début
/ E allouer(p)
p pred val suiv p^.val← E
p^.pred ← nil
p^.suiv←L.tete
Si (L.queue = nil ) // liste inialement vide
alors L.queue ←p
sinon L.tete^.pred ← p
FinSi
L.tete ←p
H. Jamoussi Elkamel , FSM
Alg Avancée 113
Fin
57
ajout au milieu après une position q
Insérer-après : Elément position Liste Liste
Prés condition : la liste n’est pas vide
L.queue
L.Tête suiv pred
/ A B C D /
5 6
4 3
q
E2
p 1 pred val suiv
1 Créer une nouvelle cellule pointé par p allouer(p)
2 Initialiser les champs val p^.val← E
3 Chainer la cellule à la liste p^.suiv←q^.suiv
4 p^.pred ← q
5 Détourner le chaînage q^.suiv←p
6 p^.suiv^.pred ← p
H. Jamoussi Elkamel , FSM 115
Alg Avancée
ajout en queue
Insérer-après : Elément position Liste Liste
Prés condition : la liste n’est pas vide
L.queue
L.Tête suiv
A B
/ C / 6
5
4
q
E2 / 3
p 1 pred val suiv
1 Créer une nouvelle cellule pointé par p allouer(p)
2 Initialiser les champs val p^.val← E
3 Initialiser pred de p à nil p^.suiv←nil // p^.suiv←q^.suiv
4 Chainer la cellule à la liste p^.pred ← q
5 q^.suiv← p
6 Changer la queue de la liste L.queue← p
H. Jamoussi Elkamel , FSM 116
Alg Avancée
58
Ajout d’un élément après une position q
Insérer-après : Elément position Liste Liste
Prés condition : la liste n’est pas vide
L.queue
L.Tête suiv pred
/ A
Le cas où q pointe sur la B C D /
dernière cellule de la liste 5 6
4 3
entre dans le cas général q
sauf l’étape 6 qui change E2
Procedure
p 1 pred val suiv
inserer-apres (var L: Liste; q: position E: élément)
var p: position
Début
allouer(p)
p^.val← E
p^.suiv←q^.suiv
p^.pred ← q
q^.suiv←p
si (q= dernier(L) alors L.queue ← p
sinon p^.suiv^.pred ← p
FinSi 117
Alg Avancée H. Jamoussi Elkamel , FSM
Fin
59
Suppression d’un élément en tête
P= premier(L) // p=L.tete
// p^.pred = nil
2
pred L.queue
L.Tête
/ A
3
B C D /
1
p
1 Si la liste contient un seul élément
alors changer la queue sinon Changer pred du suivant de la tête (c-à-d de p )
si premier(L) = dernier(L) // si (p^.suiv = nil )
alors L.queue←nil // alors L.queue ← p^.pred
Sinon L. tete^.suiv^.pred← nil // sinon p^.suiv^.pred← p^.pred
2 Changer la tête L.tete ← L.tete^.suiv
3 Détruire la cellule libérer(p)
60
Suppression au milieu à une position p
P< > premier(L) // p < > L.tete // p^.pred < > nil
P< > dernier(L) // p < > L.queue // p^.suiv < > nil
2
L.queue
L.Tête suiv pred
/ A B C D /
4
1 3
q p
1 Sauvegarder l’adresse de la cellule précédente q ←p^.pred
2 Changer le chaînage q^.suiv ← p^.suiv
3 p^.suiv^.pred ← q
4 Détruire la cellule liberer(p)
H. Jamoussi Elkamel , FSM 121
Alg Avancée
Suppression en queue
• P= dernier(L) //p^.suiv = nil
• Le cas où p pointe la dernière cellule entre dans le cas suppression milieu : q^.suiv
prend la valeur NIL 3 L.queue
L.Tête suiv 2
/ A B / C /
4
1 p
q
1 Sauvegarder le prédécesseur de p q ←p^.pred
2 Si la liste contient un seul élément
alors changer la tete sinon Changer le suivant de q
si premier(L) = dernier(L) // si (p^.pred = nil )
alors L.tete ←nil // alors L.tete ← p^.suiv
Sinon q^.suiv← nil // sinon q^.suiv← p^.suiv
3 Changer la queue L.queue ← q
4 Détruire la cellule H. Jamoussi Elkamel , FSM
libérer(p) 122
Alg Avancée
61
Suppression d’un élément à une position p
Procedure Supprimer (p: position; var L : Liste )
var q : position
Début
si (p^.pred= nil) alors // suppression en tête
L.tete ← p^.suiv
sinon
q ←p^.pred
q^.suiv← p^.suiv // p^.pred^.suiv ← p^.suiv
FinSi
62