Vous êtes sur la page 1sur 14

Partie Partie

II: Structures Autoréférentielles II: Structures Autoréférentielles


 Introduction  Introduction
 Liste chaînée  Liste chaînée
 Liste chaînée circulaire  Liste chaînée circulaire
 Liste doublement chaînée  Liste doublement chaînée
 Pile & File  Pile & File

30 31

Introduction Introduction
1 1

La structure de type tableau ; de dimension fixée à sa Une structure autoréférentielle (ou structure récursive) est ;
création; pose des problèmes pour insérer ou supprimer un une structure linéaire; référence à une autre structure de
élément car ces actions nécessitent des décalages du contenu même type
des cases du tableau qui prennent du temps dans l'exécution
d'un programme Ses éléments de même type (appelés nœud ou maillon)
Ce type de stockage de valeurs peut donc être coûteux en contenant les données sont éparpillés; contrairement à un
temps d'exécution !!!!!!!! tableau; dans la mémoire et reliés entre eux par des liens
logiques (des pointeurs)
Solution: Structures Autoréférentielles
Ainsi, une structure autoréférentielle est un ensemble
« liste » de cellules liées entre elles par des pointeurs. Chaque
32 cellule est une structure contenant les champs suivants : 33
Introduction Introduction
1 1

 une ou plusieurs données ; Si une structure contient des données et un pointeur vers la
 un pointeur « Suivant » sur la cellule suivante. structure suivante, il s’agit alors de liste chaînée
Type
Processus = Enregistrement
Nom_Pr : Chaîne Une structure qui contient des données, un pointeur vers la
Nb_UC, Nb_ES : Entier Données
*Suivant : Processus structure suivante et un pointeur vers la structure précédente,
FinEnregistrement représente une liste chaînée double
Variables Pointeur
*L : Processus
On accède à la liste par un pointeur « L » sur la première
Un arbre binaire est une structure contenant des données, un
cellule, puis en parcourant la liste d’une cellule à l’autre en
pointeur vers une première structure suivante et un autre
suivant les pointeurs « Suivant ». Le dernier pointeur
pointeur vers une seconde
« Suivant » vaut NULL, ce qui indique la fin de la liste.
34 35

Liste Chaînée
22

Partie Une liste chaînée est une structure de données dans laquelle
II: Structures Autoréférentielles les éléments sont rangés linéairement. Chaque élément est lié
à son successeur. il est donc impossible d'accéder directement
 Introduction à un élément quelconque de la liste
 Liste chaînée
 Liste chaînée circulaire Fin de la liste
Tête de la liste
 Liste doublement chaînée
 Pile & File Cette linéarité est purement virtuelle. A la différence du
tableau, les éléments n'ont aucune raison d'être contigus ni
ordonnés en mémoire

36 37
Liste Chaînée Liste Chaînée: Exemples d’application
22 22

Une liste L est soit vide, soit constituée de :  Ajout d’un élément au début de la liste
 une tête T (qui est donc la valeur du premier élément de  Ajout d’un élément en fin de la liste
la liste) et  Suppression d’un élément au début de la liste
 le reste de la liste.  Suppression d’un élément en fin de la liste
Elles ont l'avantage d'être réellement dynamiques, c'est dire  Suppression de toute la liste
que l'on peut les rallonger ou les raccourcir, avec pour seule  Compte du nombre d’éléments dans la liste
limite la mémoire disponible.  Recherche d’un élément dans la liste
De plus, l'insertion d'une cellule au milieu d'une liste ne  Calcul de la somme des valeurs de la liste
nécessite que la modification des liens avec la cellule  Comparaison de l’égalité de deux listes
précédente et suivante. Le temps nécessaire pour l'opération  Concaténation de deux listes
sera donc indépendant de la longueur de la liste.
38 39

Liste Chaînée: Exemples d’application Liste Chaînée: Création


22 22

Type Algorithme Création_liste


Type …………..
Liste = Enregistrement Variables
valeur : Entier *Cell1, *Cell2, *Cell3 : Liste
*suivant : Liste Début
FinEnregistrement Cell1 ← Allouer()
Cell2 ← Allouer()
Variables Cell3 ← Allouer()
*L : Liste Cell1^.valeur ← 12
Cell1^.suivant ← Cell2
Cell2^.valeur ← 25
Cell2^.suivant ← Cell3
Cell3^.valeur ← 4
Cell3^.suivant ← Nil
Fin
Fin de la liste
40 41
Tête de la liste
Liste Chaînée: Insertion en tête Liste Chaînée: Recherche élément
22 22

Procédure Ajout_Tete (*tete: Liste) Fonction Recherche (*L: Liste, x: Entier) :Booléen
Variables Variables
*element : Liste *P : Liste
Début Trouve: Booléen
/* vérifier si la liste est vide ou non */ Début
element ← Allouer() Trouve ← faux
*element.valeur ← 28 P←L
*element.suivant ← tete TantQue P ET (NON trouve) Faire
tete ← element SI *P.valeur = x Alors
Fin Trouve ← vrai //Trouve ← (P^.valeur = x)
Sinon
P ← *P.suivant // P ← P^.suivant
FinSI
FinTantQue
X Recherche ← Trouve
Tête de la liste 42 Fin 43

Liste Chaînée: Recherche élément Liste Chaînée: Nombre d’éléments


22 22

Fonction Recherche_Adresse (*L: Liste, x: Entier) : *Liste Procédure Nbr_Element (*L: Liste): Entier
Variables Variables
*P : Liste Nb : Entier
Début *P : Liste
P←L Début
TantQue (P <> NIL) Faire P←L
SI *P.valeur = x Alors Nb ← 0
Recherche_Adresse ← P TantQue (P) Faire
Sinon Nb ← Nb + 1
P ← *P.suivant P ← *P.suivant
FinSI FinTantQue
FinTantQue Nbr_Element ← Nb
Recherche_Adresse ← NIL Fin
Fin

44 45
Liste Chaînée: Insertion en tête Liste Chaînée: Insertion en queue
22 22

Procédure Insertion_Tete (*tete: Liste, x: Entier) Procédure Insertion_Queue (*tete: Liste, x: Entier)
Variables Variables
*P : Liste *P,*PP : Liste
Début Début
P ← Allouer() P ← Allouer()
*P.valeur ← x *P.valeur ← x
*P.suivant ← tete *P.suivant ← Nil
tete ← P Si tete = Nil Alors
Fin tete ← P
Sinon
PP ← tete
TantQue (*PP.suivant <> Nil) faire
PP ← *PP.suivant
FinTantQue
*PP.suivant ← P
46 FinSI 47
Fin

Liste Chaînée: Insertion après élément Liste Chaînée:Insertion après élément_V2


22 22

Procédure Insertion_Milieu (*tete: Liste, a,x: Entier) Procédure Insertion_Milieu_V2 (*tete: Liste, a,x: Entier)
Variables Variables
*P, *Q : Liste *P, *Q : Liste
Trouve: Booléen Trouve: Booléen
Début Début
Trouve ← faux SI Trouve Alors P ← Recherche_Adresse (tete, a)
P ← tete Q ← Allouer() SI P Alors
TantQue P ET (NON trouve) Faire *Q.valeur ← n Q ← Allouer()
SI *P.valeur = x Alors *Q.suivant ← *P.suivant *Q.valeur ← n
Trouve ← vrai *P.suivant ← Q *Q.suivant ← *P.suivant
Sinon Sinon *P.suivant ← Q
P ← *P.suivant Ecrire ("Insertion impossible, Sinon
FinSI élément " , a , " non trouvé") Ecrire ("Insertion impossible, élément " , a , " non trouvé")
FinTantQue FinSI FinSI
Fin Fin
48 49
Liste Chaînée: Suppression en tête Liste Chaînée: Suppression en queue
22 22

Procédure Suppression_Tete (*tete: Liste) Procédure Suppression_Queue (*tete: Liste)


Variables Variables
*P : Liste *P, *Q : Liste
Début
Début Si tete <> Nil Alors
Si tete <> Nil Alors Si (*tete.suivant = Nil) Alors
P ← tete Libére (tete)
tete ← *tete.suivant tete ← Nil
Libère(P) Sinon
P ← tete
FinSI Q ← *tete.suivant
Fin TantQue (*Q.suivant <> Nil) Faire
P←Q
Q ← *Q.suivant
FinTantQue
*P.suivant ← Nil
Libère (Q)
FinSi
50 FinSI 51
Fin

Liste Chaînée: Suppression en queue_V2 Liste Chaînée: Suppression en milieu


22 22

Procédure Suppression_Queue_V2 (*tete: Liste) Procédure Suppression_Milieu (*tete: Liste, x:Entier)


Variables *P, *Q : Liste
*P : Liste Trouve: Booléen
Début Début Sinon
Si tete <> Nil Alors P←Q
Si (*tete.suivant = Nil) Alors Si tete <> Nil Alors
Si (*tete.valeur = x) Alors Q ← *Q.suivant
Libére (tete) FinSI
tete ← Nil Suppression_Tete (tete)
Sinon FinTantQue
Sinon Si Non Trouve Alors
P ← tete P ← tete
Q← *tete.suivant Écrire ("Pas d’élément
TantQue (*(*Q.suivant).suivant <> Nil) Faire contenant ", x)
P ← *P.suivant Trouve ← faux
TantQue (Q ET Non Trouve) Faire FinSi
FinTantQue FinSi
Libère (*P.suivant ) SI (*Q.valeur = x) Alors
*P.suivant ← *Q.suivant Sinon
*P.suivant ← Nil Écrire ("la liste est vide")
FinSi Libère(Q)
Trouve ← vrai FinSI
FinSI 52
Fin 53
Fin
Liste Chaînée Circulaire
23

Partie Une liste chaînée circulaire est une liste particulière dans
II: Structures Autoréférentielles laquelle le dernier élément pointe sur la tête de la liste
 Introduction
 Liste chaînée
 Liste chaînée circulaire
Tête de la liste
 Liste doublement chaînée
 Pile & File

54 55

Liste Chaînée Circulaire: Application Liste Chaînée Circulaire: dernier élément


23 23

 Dernier de la liste Fonction Dernier (*tete: Liste): *Liste


Variables
 Ajout d’un élément au début de la liste *P : Liste
 Ajout d’un élément en fin de la liste Début
P ← tete
Si Non P Alors
Dernier ← P
Sinon
TantQue (*P.suivant <> tete) Faire
P← *P.suivant
FinTantQue
Dernier ← P
FinSI
Fin

56
Liste Chaînée Circulaire: Insertion en tête Liste Chaînée Circulaire: Insertion à la fin
23 23

Procédure Insertion_Circulaire_Tete (*tete: Liste, x:Entier) Procédure Insertion_Circulaire_Queue (*tete: Liste, x:Entier)
Variables Variables
*P, *Q : Liste *P, *Q : Liste
Début Début
Q ← Dernier(tete) Si tete = Nil Alors
P ← Allouer() Insertion_Circulaire_Tete (tete, x)
*P.valeur ← x Sinon
*P.suivant ← tete Q ← Dernier(tete)
tete ← P P ← Allouer()
Si Q = Nil Alors *P.valeur ← x
*tete.suivant ← tete *P.suivant ← tete
Sinon *Q.suivant ← P
*Q.suivant ← tete FinSI
FinSI Fin
Fin

Liste Chaînée Circulaire: Exercice


23

Exercice : Écrire la procédure Création_Liste_Circulaire qui Partie


crée une liste chainée circulaire de N éléments entiers. II: Structures Autoréférentielles
 Introduction
Procédure Création_Liste_Circulaire(*L: Liste, N:Entier)  Liste chaînée
Variables
………………………….....  Liste chaînée circulaire
Début  Liste doublement chaînée
…………………………………………………………………………………………..
…………………………………………………………………………………………..
 Pile & File
…………………………………………………………………………………………..
…………………………………………………………………………………………..
…………………………………………………………………………………………..
…………………………………………………………………………………………..
…………………………………………………………………………………………..
61
Fin
Introduction Liste Chaînée Double : Application
4 24

Une Liste à Chaînage Double (LCD) ou encore structure Type


doublement autoréférentielle se base sur le même principe ListeChDouble = Enregistrement
que la liste chaînée simple, à la différence qu'elle contient non valeur : Entier
seulement un pointeur vers l’élément (le maillon) « suivant » *suivant : ListeChDouble
mais aussi un pointeur vers l’élément (le maillon) « précédent », *precedent : ListeChDouble Données
permettant de cette façon le parcours de la liste dans les deux FinEnregistrement
sens. Variables Pointeur
*L : ListeChDouble Pointeur
Tête de la liste

62 63

Liste Chaînée Double: Insertion en tête Liste Chaînée Double: Insertion en queue
24 24

Procédure Insertion_LCD_Tete (*tete: Liste, x: Entier) Procédure Insertion_LCD_Queue (*tete: Liste, x: Entier)
Variables Variables
*P : Liste *P,*Q : Liste
Début Début
P ← Allouer() Si tete = Nil Alors
*P.valeur ← x Insertion_LCD_Tete (tete, x)
*P.suivant ← tete Sinon
*P.precedent ← Nil Q ← Dernier (tete)
Si tete <> Nil Alors P ← Allouer()
*tete.precedent ← P *P.valeur ← x
FinSI *P.suivant ← Nil
tete ← P *P.precedent ← Q
Fin *Q.suivant ← P
FinSI
Fin
64 65
Liste Chaînée Double: Insertion en milieu Liste Chaînée Double: Insertion en milieu
24 24

Écrire une procédure qui permet d’insérer un élément « A » dans une liste à Écrire une procédure qui permet d’insérer un élément « A » dans une liste à
chaînage double après un élément « B » A
chaînage double
Pointeur
Procédure Insertion_LCD_Milieu (*tete: Liste, A: Entier) Pointeur Procédure Supprimer_LCD_Milieu (*tete: Liste, A: Entier)
Variables Données B Données Données
Variables Données Données A Données Données
………………………… Pointeur Pointeur Pointeur NIL
*P,*Q : Liste Pointeur Pointeur Pointeur Pointeur NIL
Début NIL Pointeur Pointeur Pointeur
Début NIL Pointeur Pointeur Pointeur Pointeur

………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..


………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. ………………………………………….. ………………………………………….. …………………………………………..
………………………………………….. Fin 66 ………………………………………….. Fin 67

Liste Chaînée Double: Exercice


23

Exercice : Écrire la procédure Création_LCD_Circulaire qui Partie


crée une liste chainée double circulaire de N éléments entiers. II: Structures Autoréférentielles
Procédure Création_LCD_Circulaire (*L: Liste, N:Entier)  Introduction
Variables  Liste chaînée
………………………….....
Début  Liste chaînée circulaire
…………………………………………..
………………………………………………..
…………………………………………..  Liste doublement chaînée
………………………………………………..
………………………………………………..
…………………………………………..  Pile & File
…………………………………………..
………………………………………………..
…………………………………………..
………………………………………………..
…………………………………………..
………………………………………………..
…………………………………………..
………………………………………………..
…………………………………………..
………………………………………………..
Fin 69
Pile: Introduction Pile : Déclaration
5 25

Une pile est une liste chaînée d'informations dans laquelle : Une pile peut être implémentée dans un tableau (pile statique)
 Un élément ne peut être ajouté qu'au sommet de la pile, ou dans une liste chaînée (pile dynamique). L'implémentation en
 Un élément ne peut être retiré que du sommet de la pile. liste chaînée qui est présentée ci-dessous. Le sommet de la pile
Il s'agit donc d'une structure de type LIFO (Last In First Out) est le premier élément et le pointeur de tête pointe sur ce
dont le sommet de la pile est y uniquement manipuler sommet.
Empiler Dépiler Type
Tête de la liste Pile = Enregistrement
valeur : Entier
*suivant : Pile
FinEnregistrement
Variables
*P : Pile
70 71

Manipulation d’une Pile Manipulation d’une Pile: Initialiser/Vide


5 5

Les procédures et les fonctions les plus utilisées pour la Procédure Initialiser_Pile (*P: Pile)
Début
manipulation d’une Pile sont les suivantes : P ← Nil
 Procédure Initialiser(*P : Pile) : crée une pile vide P Fin
 Fonction Pile_Vide (*P : Pile) : Booléen : Renvoie la valeur « vrai » si la pile est
vide Fonction Pile_Vide (*P: Pile): Booleen
 Procédure Empiler(*P : Pile, X : Entier) : ajoute l’élément X au sommet de la pile Début
 Procédure Dépiler (*P : Pile, X : Entier) : dépile le sommet de la pile et le place Pile_Vide ← P = Nil
dans la variable X Fin

72 73
Manipulation d’une Pile: Empliler Manipulation d’une Pile: Dépiler
5 5

Procédure Emplier (*P: Pile, x: Entier) Procédure Déplier (*P: Pile, x: Entier)
Variables Variables
*S : Pile *S : Pile
Début Début
S ← Allouer() Si (NON Pile_Vide(P)) Alors
*S.valeur ← x S←P
*S.suivant ← P x ← *P.valeur
P←S P ← *P.suivant
Fin Libère(P)
FinSi
Fin

74 75

File: Introduction File : Déclaration


5 25

Une File, ou file d'attente, est une liste chaînée Pour ne pas avoir à parcourir toute la liste au moment
d'informations dans laquelle : d'ajouter un élément en queue, on maintient un pointeur de queue.
 Un élément ne peut être ajouté qu'à la queue de la file, Attention: une file peut très bien être simplement chaînée même
 Un élément ne peut être retiré qu'à la tête de la file. s'il y a un pointeur de queue.
Il s'agit donc d'une structure de type FIFO (First In First Out). Une file peut être implémentée dans un tableau (file statique)
Les données sont retirées dans l’ordre où elles ont été ajoutées. ou dans une liste chaînée (file dynamique). L'implémentation en
Défiler liste chaînée qui est présentée ci-dessous. Le pointeur de tête
Tête de la liste pointe sur le premier élément de la file, et le pointeur de queue
sur le dernier.

Queue de la liste

Enfiler 76 77
File : Déclaration Manipulation d’une File
25 5

Type Les procédures et les fonctions les plus utilisées pour la


Liste = Enregistrement manipulation d’une File sont les suivantes :
valeur : Entier  Procédure Initialiser(F : File) : crée une file vide F
*suivant : Liste  Procédure Enfiler(F : File, X : Entier) : ajoute l’élément X à la fin de la File
FinEnregistrement  Procédure Défiler (F : File, X : Entier) : extraire le sommet de la fille et le place
dans la variable X
File = Enregistrement
*Tête : Liste
*Queue : Liste
FinEnregistrement
Variables
F : File
78 79

Manipulation d’une File: Initialiser/Vide Manipulation d’une File: Enfiler


5 5

Procédure Initialiser_File (F: File) Procédure Enfiler (F: File, x: Entier)


Début Variables
F.Tête ← Nil *P : Liste
F.Queue ← Nil Début
Fin P ← Allouer()
*P.valeur ← x
Fonction File_Vide (F: File): Booleen *P.suivant ← NIL
Début Si File_Vide (F) Alors
File_Vide ← F.Tête = Nil F.Tête ← P
Fin Sinon
*(F.Queue).suivant ← P
FinSI
F.Queue ← P
Fin

80 81
Manipulation d’une File: Défiler
5

Procédure Défiler (F: File, x: Entier)


Variables
*P : Liste
Début
Si F.Tête <> Nil Alors
P ← F.Tête
x ← *(F.Tête).valeur
F.Tête ← *(F.Tête).suivant
Libère(P)
Si F.Tête= Nil Alors
F.Queue ← Nil
FinSi
FinSi
Fin

82

Vous aimerez peut-être aussi