Algorithmique et structures de données II
Université de Manouba
Ecole supérieure d’économie numérique ESEN
1 (Cours 4)
La liste simplement chainée
Réalisé par: Dhouha Maatar
1. Introduction
1.1. Limite des tableaux:
2
Taille connue et fixe des éléments
Insertion et suppression dynamiques non pratiques
Allocation d’un seul bloque en mémoire
D’où les listes :
Taille, inconnue au départ, elle varie au cours du temps
Insertion et suppression dynamiques pratiques
Les éléments sont habituellement éparpillés en mémoire
1. Introduction
Une liste chaînée est un ensemble d’éléments contenus chacun dans une cellule (ou nœud ou maillon).
Chaque cellule contient, en plus de l’élément, l’adresse de l’élément suivant appelée pointeur.
Figure 1: Structure d’une liste chaînée
Elem Elem Elem
Tête de liste
Fin de liste (Nil)
cellule
1.2. Définition:
3
1. Introduction
Il existe trois types de listes:
•Les listes simplement chaînées: Dans ce type de listes, les éléments sont chaînés à l’aide d’un seul pointeur afin de parcourir la liste du premier au dernier élément.
•Les listes doublement chaînées: Dans ces listes, les éléments sont chaînées à l’aide de deux pointeurs, et non un seul, ce qui permet de parcourir la liste dans les deux sens.
•Les listes circulaires: dans ces listes, le dernier élément pointe sur le premier.
1. Introduction
1.3. Déclaration d’une liste chaînée :
Types
cellule =enregistrement
Elem: entier //valeur à stocker
Suiv: ^ cellule // adresse de l’élément suivant Fin enregistrement
Liste= ^ cellule Variables
L: Liste
5
6
1. Introduction
Lorsqu’on déclare une liste, on l’initialise à NIL pour pouvoir ensuite allouer le premier élément.
//déclaration de 2 listes chaînées différentes mais équivalentes ma_liste1: ^ cellule
ma_liste2: Liste Début
ma_liste1 ←Nil ma_liste2 ←Nil fin
2. Création et affichage d’une liste
2.1. Création d’une liste chaînée:
Procédure CreationElement( Tête:Liste) Début
Allouer (Tête)
Ecrire(" entrer un entier") lire(Tête^. Elem)
Tête^. Suiv←Nil Fin
Figure 2: Création d’une liste Elem
Tête de liste
Fin de liste (Nil)
7
2. Création et affichage d’une liste
2.1. Création d’une liste chaînée:
Procédure CreationListe(n: entier, L:Liste) Variables: Tête, P: Liste
i: entier Début
CreationElement(Tête) L ←Tête
Pour i de 2 à n faire CreationElement(P) L^. Suiv ←P L ←P
FinPour
Elem Nil
Elem P L
Nil
Figure 3: Processus de création
2. Création et affichage d’une liste
2.1. Création d’une liste chaînée:
Procédure CreationListe(n: entier, L:Liste) Variables: Tête, P: Liste
i: entier Début
CreationElement(Tête) L ←Tête
Pour i de 2 à n faire CreationElement(P) L^. Suiv ←P L ←P
FinPour L ←Tête Fin
Elem
Elem P L
Nil
Figure 4: Garder la tête de liste
9
2. Création et affichage d’une liste
2.2. Affichage d’une liste chaînée:
Procédure AffichageListe(L:Liste) Variables:
P: Liste Début
P ←L
Tantque (P<>Nil) faire Ecrire(P^. Elem) P ← P^. Suiv FinTQ
Fin
10
11
2. Création et affichage d’une liste
Dans certains cas, il faut tester si la liste est vide Procédure affichage(L:Liste)
Début
si L = NIL alors
écrire (« liste vide ») sinon
AffichageListe(L) finsi
Fin
On peut utiliser une fonction qui renvoie 1 si la liste est vide et 0 sinon.
fonction estvide(L:Liste): entier Début
si L = NIL alors ou
retourner 1 sinon
retourner 0 finsi
Fin
2. Création et affichage d’une liste
Procédure affichage(L:Liste) Début
si estvide(L) alors
écrire (« liste vide ») sinon
AffichageListe(L) finsi
Fin
fonction estvide(L:Liste): entier Début
retourner (L = NIL) Fin
3. Recherche d’un élément dans un liste
Procédure Recherche(x: entier, L:Liste, tmp: Liste) Variables:
P: Liste Début
P ←L tmp ←NIL Tantque (P<>Nil) faire
si ( P ^. Elem=x) alors tmp ← P finsi
P ← P ^. Suiv FinTQ
fin 13
Le but est de renvoyer l’adresse du premier élément trouvé ayant une certaine valeur. On parcourt donc la liste jusqu’au bout et dès qu’on trouve l’élément qui correspond à ce que l’on cherche, on renvoie son adresse qui est égale à NIL si l’élément n’existe pas.
14
4. Insertion d’un élément
Lorsque nous voulons ajouter un élément dans une liste chaînée, il faut savoir où l’insérer. Les deux ajouts
génériques des listes sont les ajouts en tête, et en fin de liste.
4.1. Insertion en tête de liste:
Lors de l’ajout en tête, nous allons créer un élément, lui assigner la valeur que l’on veut ajouter puis raccorder cet élément à la liste passée en paramètre. Lors d’un ajout en tête, il suffit de créer un nouveau élément puis de le relier au début de la liste originale. Il s’agit donc d’assigner à Suiv l’adresse du premier élément de la liste.
4.1. Insertion en tête de liste
Elem Elem
Tête de liste (L)
Nil
Figure 5: Principe d’insertion d’un élément en tête de liste Elem
Procédure AjouterEnTete(Var L:Liste, valeur: entier) Variables:
P: Liste Début
Allouer (P) // créer un nouvel élément
P^. Elem ← valeur //assigner la valeur au nouvel élément P^. Suiv←L //on assigne l’adresse de l’élément suivant au
//nouvel élément L ←P
Fin
15
4.2. Insertion en fin de liste:
On crée tout d’abord un nouvel élément, lui assigner sa valeur et mettre l’adresse de l’élément suivant à NIL.
On crée un pointeur temporaire sur le type element qui va se déplacer d’élément en élément et regarder si cet élément est le dernier de la liste.
Enfin, on pointe le dernier élément de la liste originale sur le nouvel élément crée.
4.2. Insertion en fin de liste
17
4.2. Insertion en fin de liste
Procédure AjouterEnFin (L:Liste, valeur: entier) Variables:
P, t: Liste Début
Allouer (P) // créer un nouvel élément
P^. Elem ← valeur //assigner la valeur au nouvel élément P^. Suiv←NIL //aucun élément ne va suivre
si(L = NIL) alors L ←P
sinon //on parcours jusqu’à la fin t ← L
TQ (t ^. Suiv <> NIL) faire t ← t ^. Suiv fin TQ
t ^. Suiv ←P Fin
18
5.1. Suppression en tête:
5. Suppression d’un élément d’une liste
Ici, on s’intéresse à la suppression du premier élément d'une liste chaînée. Si la liste n’est pas vide, on stocke l’adresse du 2ièmeélément de la liste et on supprime le premier élément.
La difficulté consiste à ne pas perdre l'accès aux éventuels éléments qui sont pointés par le premier.
Attention à ne pas libérer le premier élément avant d’avoir stocker l’adresse du second, sans quoi il sera impossible de la récupérer.
Elem Elem Elem Tête de
liste
Nil
Figure 6: Principe de suppression en tête de la liste
5.1. Suppression en tête
Procédure supprimerEnTete (L :Liste) Variables:
P: Liste Début
si L <> NIL alors P←L L ← L ^. Suiv libérer(P) finsi
Fin
Procédure supprimerEnFin (L :Liste) Variables:
tmp, ptmp: Liste Début
si L ^. Suiv =NIL alors L←NIL
sinon //tant qu’on n’est pas au dernier élément tmp ← L
ptmp ← L
TQ(tmp ^. Suiv <>NIL) faire ptmp ←tmp
tmp ← tmp ^. Suiv finTQ
5.2. Suppression en fin
Cette fois, il va falloir parcourir la liste jusqu’à son dernier élément, indiquer que l’avant dernier élément va devenir le dernier élément .
//A la sortie de la boucle, tmp //pointe sur le dernier élément et //ptmp sur l’avant-dernier
ptmp ^. Suiv ←NIL libérer(tmp)
finsi