Académique Documents
Professionnel Documents
Culture Documents
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
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
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
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
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
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
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
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
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
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
80 81
Manipulation d’une File: Défiler
5
82