CHAPITRE III: STRUCTURES SÉQUENTIELLES 
Université Saad Dahlab de Blida 
Faculté des Sciences 
Département d’Informatique ...
PLAN DU CHAPITRE III 
Introduction 
I.Listes Linéaires Chaînées (LLC) 
II.Files d’Attente (FIFO) 
III.Piles (LIFO) 
Conc...
3 
Une structure séquentielle est un ensemble de variables de même nature organisées séquentiellement auxquelles on peut ...
PARTIE I: LISTES LINÉAIRES CHAÎNÉES (LLC)
PLAN DE LA PARTIE I 
Définitions 
Modèle des LLC (MLLC) 
Algorithmes sur les listes 
Listes particulières 
Représenta...
6 
Une Liste Linéaire Chaînées (LLC) est un ensemble de maillons reliés entre eux. 
Un maillon est une entité renfermant...
Nil 
7 
Une LLC est caractérisée par : 
L'adresse de son premier élément (la tête de liste). Elle doit toujours être sau...
Nil 
8 
DÉFINITIONS 
Tête de liste 
……. 
val 
suiv 
V1 
@1 
V2 
@2 
V3 
@3 
Vn 
@n 
Langage Algorithmique 
Langage C 
type...
9 
On définit un ensemble d'opérations que l'on va utiliser pour écrire des algorithmes sur les listes. Cet ensemble d'op...
10 
Voici l’équivalence en langage C, des fonctions et des procédures du modèle : 
MODÈLE DE LLC (MLLC) 
Modules 
Impléme...
11 
Parcours : 
Accès par valeur : il s'agit de rechercher (séquentiellement à partir de la tête) une valeur v dans la l...
12 
Mises à jour : 
Construction d'une liste à partir de n valeurs données. 
Insertion d'une valeur (v) à une position ...
13 
Mises à jour : 
Suppression du maillon se trouvant à une position donnée (i) : rechercher par position le maillon i ...
14 
Tri sur les LLC : Les mêmes algorithmes de tri utilisable pour les tableaux, en prenant en compte que l'accès par pos...
15 
Exercice 1: Développer les algorithmes suivants qui permettent de : 
1.Créer une LLC à partir d'une suite de n valeur...
16 
Pour créer cette liste: 
1.Allouer un nouveau maillon 
2.Remplir le champ valeur de ce maillon 
3.Insérer dans la lis...
17 
Cas 1: Insertion à la fin. Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6 
ALGORITHMES SUR LES LLCS 
CRÉATION ...
18 
Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6 
Cas 1: Insertion au début 
ALGORITHMES SUR LES LLCS 
CRÉATION...
19 
Soient la liste suivante: 
La liste imprimé est 2, 10, 5, -1 et 6 
ALGORITHMES SUR LES LLCS IMPRESSION D’UNE LLC 
2 ...
20 
Soient la liste suivante: 
ALGORITHMES SUR LES LLCS 
DESTRUCTION D’UNE LLC 
2 
10 
5 
-1 
6 
P 
Procédure Détruire (V...
21 
Exercice 2: Soient L une liste d’entier non ordonnée. Développer les modules suivants: 
1.Rechercher une valeur « v »...
22 
Exercice 2: Soient L une liste d’entier non ordonnée. Développer les modules suivants: 
4.Supprimer un maillon qui se...
23 
Rechercher une valeur « v=5 » dans la liste suivante: 
Si v= 1 alors la fonction retourne null. 
ALGORITHMES SUR LES...
24 
Pour rechercher la valeur du maillon qui se trouve à la position K, deux cas se présentent: 
Cas 1: K longueur(List...
25 
Pour rechercher la valeur du maillon qui se trouve à la position k = 4, la fonction retourne la valeur -1 (possible e...
26 
Rechercher la valeur du maillon qui se trouve à la position k 
ALGORITHMES SUR LES LLCS RECHERCHE DANS UNE LLC 
2 ème...
27 
Pour ajouter un élément dans la liste il y a plusieurs situations : 
1.Insertion au début de la liste 
2.Insertion à ...
28 
Cas 1: Insertion au début 
ALGORITHMES SUR LES LLCS 
INSERTION DANS UNE LLC 
-1 
5 
10 
2 
6 
L 
P 
Aff_adr (P, L) 
P...
29 
Cas 2: Insertion à la fin. 
ALGORITHMES SUR LES LLCS 
INSERTION DANS UNE LLC 
2 
10 
5 
-1 
6 
L 
Q 
P 
Aff_adr (Q, P...
30 
Cas 2: Insertion à une position donné « pos ». 
 On suppose que pos est entre 1 et longueur(Liste) 
On doit accéder...
31 
ALGORITHMES SUR LES LLCS 
INSERTION DANS UNE LLC 
2 
10 
5 
-1 
6 
L 
Q 
P 
(1) Aff_adr (P, suivant (Q)) 
Procédure In...
32 
Pour supprimer un élément dans la liste il y a plusieurs situations : 
1.Suppression au début de la liste 
2.Suppress...
33 
Cas 1: Suppression au début 
ALGORITHMES SUR LES LLCS 
SUPPRESSION DANS UNE LLC 
2 
10 
5 
-1 
6 
P 
Procédure Suppri...
34 
Cas 2: Suppression à la fin 
ALGORITHMES SUR LES LLCS 
SUPPRESSION DANS UNE LLC 
2 
10 
5 
-1 
6 
L 
Procédure Suppri...
35 
Cas 3: suppression à une position donné « pos ». 
 On suppose que pos est entre 1 et longueur(Liste) 
Deux situatio...
36 
Cas 3: suppression à une position donné « pos ». 
ALGORITHMES SUR LES LLCS 
SUPPRESSION DANS UNE LLC 
2 
10 
5 
-1 
L...
37 
Liste circulaire est une LLC où le dernier maillon pointe le premier, formant ainsi un cercle. 
La tête de la liste ...
38 
Construction d’une LLC circulaire 
Construire une LLC unidirectionnel 
À la fin, chaîner le dernier maillon avec le...
39 
Construction d’une LLC circulaire 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2 
10 
5 
-1 
6 
L ...
40 
Impression d’une LLC circulaire 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2 
10 
5 
-1 
L 
Proc...
41 
Recherche d’une valeur dans une LLC circulaire 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2 
10 ...
42 
Insertion dans une LLC circulaire 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2 
10 
5 
-1 
6 
L ...
43 
Suppression du maillon contenant la valeur v 
Rechercher le maillon contenant la valeur v 
S’il existe un tel maill...
44 
Suppression du maillon contenant la valeur v 
LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
Procédure...
45 
Suppression du maillon contenant la valeur v 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2ème mét...
46 
Destruction d’une LLC circulaire 
LISTES PARTICULIÈRES 
LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 
2 
10 
5 
-1 
L 
Pro...
47 
Liste bidirectionnelle ou Liste Doublement Chaînées est une liste que l'on peut parcourir dans les deux sens : de gau...
Chaque maillon d’une liste bidirectionnelle comporte trois champs: 
Un champ contenant la donnée. 
Un pointeur vers l'é...
Le modèle des LLC bidirectionnelles est donc étendu par les opérations suivantes : MLLCb = MLLC - {Aff_Adr} + { Aff_prec,...
50 
Construction d’une LLC Bidirectionnelle 
 Cas 1: Insertion à la fin. Soient N= 4 et les valeurs suivantes: 2, 5, -1,...
51 
Construction d’une LLC Bidirectionnelle 
 Cas 2: Insertion au début. Soient N= 4 et les valeurs suivantes: 2, 5, -1,...
52 
Insertion à une position donnée (avant) 
LISTES PARTICULIÈRES 
LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) 
P 
pos ...
53 
Impression d’une LLC Bidirectionnelle 
LISTES PARTICULIÈRES 
LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) 
T 
2 
5 
...
54 
Recherche d’une valeur dans une LLC Bidirectionnelle 
LISTES PARTICULIÈRES 
LISTE BIDIRECTIONNELLE (QUELQUES ALGORITH...
55 
Suppression du maillon contenant la valeur v 
LISTES PARTICULIÈRES 
LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) 
2 ...
56 
Destruction d’une LLC Bidirectionnelle 
LISTES PARTICULIÈRES 
LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) 
T 
2 
5 ...
57 
Liste bidirectionnelle circulaire est une LLC à double sens et dont le dernier pointe sur le premier et le premier po...
58 
On peut représenter une LLC par un tableau où chaque élément contient au moins 3 champs : l'information, l’indice du ...
59 
Initialement, le champ Vide de tous les éléments sont à vrai pour indiquer que les cases sont disponibles. 
Une LLC ...
60 
Le modèle de la LLC est défini comme suit: 
REPRÉSENTATION CONTIGÜE 
MODÈLE 
Modules 
Rôle 
Allouer(L, max) 
C’est un...
61 
REPRÉSENTATION CONTIGÜE 
MODÈLE 
Modules 
Rôle 
Complexité 
Allouer(L, max) 
Pour i0 à max-1 faire 
Si L[i].Vide alor...
Faut-il utiliser un tableau ou une LLC? 
CONCLUSION 
62
63 
Tableau 
LLC 
Accès à un élément 
Direct (O(1)) 
Séquentielle (O(n)) 
tq n est la longueur de la liste 
Définition de ...
64 
Tableau 
LLC 
Sur- encombrement 
Non: 
La relation suivant étant implicite, il n’y a pas besoin d’espace supplémentair...
Partie II: Files d’Attente
PLAN DE LA PARTIE II 
Définition 
Utilisation 
Modèle 
Implémentation 
Représentation statique 
Représentation dynam...
67 
Une file (en anglais queue) est une structure de données basée sur le principe « premier arrivé, premier sorti » (en ...
68 
Une file d'attente peut être définie comme une collection d'éléments dans laquelle tout nouvel élément est inséré (aj...
69 
Les files d’attente sont utilisées, en programmation comme des buffers (mémoire tampon = espace de mémorisation tempo...
70 
Les opérations habituelles sur les files sont : 
Création ou Initialisation de la file 
Vérification du contenu de ...
71 
Les files d’attente peuvent être présentées en deux manières: 
statique en utilisant les tableaux, 
dynamique en ut...
72 
A chaque défilement, on fait un décalage. 
 La tête n'est plus une caractéristique puisqu'elle est toujours égale à ...
73 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Définition de la structure : 
TYPE File_Attente = STRUCTURE 
Elements : TABLEAU[...
74 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Modèle 
Implémentation 
Créerfile(F) 
F.Queue ←-1 
Filevide(F) 
Filevide ← (F.Qu...
75 
Les incrémentations se font modulo N afin de réutiliser des cases libérées: Tete  (Tete+1) mod Max & Queue  (queue+...
76 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
V1 
V2 
V3 
V4 
V5 
Tête = 0 
Queue = 5 
V2 
V3 
V4 
V5 
Tête = 1 
Que...
77 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
V3 
V4 
V5 
V6 
V7 
V8 
Tête = 2 
Queue = 8 
V9 
V3 
V4 
V5 
V6 
V7 
V...
78 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
Définition de la structure : 
TYPE File_Attente = STRUCTURE 
Elements ...
79 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
Modèle 
Implémentation 
Créerfile(F) 
F.Tête = F.Queue ←Max 
Filevide(...
80 
La représentation dynamique utilise une liste linéaire chaînée (LLC). L’enfilement se fait à la queue de la liste et ...
81 
IMPLÉMENTATION DYNAMIQUE 
V0 
V1 
V2 
V3 
V4 
Tête 
Queue 
Définition de la structure : 
TYPE Element = STRUCTURE 
val...
82 
IMPLÉMENTATION DYNAMIQUE 
Modèle 
Implémentation 
Créerfile(F) 
F.Tete ← NIL; F.Queue← NIL 
Filevide(F) 
Filevide←(F.T...
83 
Une file d’attente avec priorité est une collection d’éléments dans laquelle l’insertion ne se fait pas toujours à la...
84 
Exercice: 
Le processeur possède un buffer permettant de gérer ses programmes à exécuter. Ce buffer est une file d'a...
85 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Définition de la structure : 
TYPE prog = STRUCTUR...
86 
FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Modèle 
Implémentation 
Créerfile(F) 
F.Queue ←-1 
...
87 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
(0, PSW00) 
(1, PSW10) 
(1, PSW11) 
(2, PSW20) 
(3...
88 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Modèle 
Implémentation 
Enfiler(F,X) 
SI (NON File...
89 
FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
Définition de la structure : 
TYPE prog =...
90 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
Modèle 
Implémentation 
Créerfile(F) 
F....
91 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
(0, PSW00) 
(1, PSW10) 
(1, PSW11) 
(2, ...
92 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE 
Modèle 
Implémentation 
Enfiler(F,X) 
SI...
93 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION DYNAMIQUE 
(0,PSW00) 
Tête 
Queue 
(1,PSW10) 
(1,PSW11) 
(2,PSW20) 
(3,PS...
94 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION DYNAMIQUE 
Modèle 
Implémentation 
Créerfile(F) 
F.Tete ← NIL 
F.Queue← N...
95 
FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION DYNAMIQUE 
(0,PSW00) 
Tête 
Queue 
(1,PSW10) 
(1,PSW11) 
(2,PSW20) 
(3,PSW...
96 
FILE D’ATTENTE AVEC PRIORITÉ 
IMPLÉMENTATION DYNAMIQUE 
Modèle 
Implémentation 
Enfiler(F,X) 
Allouer (P), Aff_Val(P, ...
Partie III: Piles
PLAN DE LA PARTIE III 
Définition 
Modèle 
Implémentation 
Représentation statique 
Représentation dynamique 
Utilis...
99 
Une pile (en anglais stack) est une structure de données fondée sur le principe « dernier arrivé, premier sorti » (ou...
100 
Une pile peut être définie comme une collection d'éléments dans laquelle tout nouvel élément est inséré à la fin (em...
101 
Les opérations habituelles sur les piles sont : 
Création ou Initialisation de la pile 
Vérification du contenu de...
102 
Les piles peuvent être présentées en deux manières: 
statique en utilisant les tableaux, 
dynamique en utilisant l...
103 
L’implémentation statique des piles utilise les tableaux. Dans ce cas, la capacité de la pile est limitée par la tai...
104 
IMPLÉMENTATION STATIQUE PAR DÉCALAGE 
Définition de la structure : 
TYPE Pile= STRUCTURE 
Elements : TABLEAU[0..Max-1...
105 
IMPLÉMENTATION STATIQUE 
modèle 
Implémentation 
Créerpile(P) 
P.Sommet ← -1 
Pilevide(P) 
Pilevide ← ( P.Sommet = -1...
106 
L’implémentation dynamique utilise les listes linéaires chinées. Dans ce cas, la pile peut être vide, mais ne peut ê...
107 
IMPLÉMENTATION DYNAMIQUE 
V4 
V3 
V2 
V0 
V1 
Tête 
Définition de la structure : 
TYPE Element = STRUCTURE 
val : typ...
108 
IMPLÉMENTATION DYNAMIQUE 
Modèle 
Implémentation 
Créerpile(P) 
P ← Nil 
Pilevide(P) 
Pilevide ← ( P = Nil) 
Empiler(...
109 
Appels de fonctions: Quand une fonction est appelée, les paramètres (incluant l’adresse de retour) doivent être pass...
110 
Analyse syntaxique : qui est une phase de la compilation qui nécessite une pile. 
Par exemple, le problème de la re...
111 
Calcul arithmétique : Une application courante des piles se fait dans le calcul arithmétique: l'ordre dans la pile p...
112 
UTILISATION (CALCUL ARITHMÉTIQUE) 
 Exercice: 
1. Ecrire cette expression en postfixé et préfixé 5 * (((9+8)*(4*6))+...
113 
UTILISATION (CALCUL ARITHMÉTIQUE) 
Soit à évaluer l’expression postfixé suivante: 598+46**7+* 
a.empiler(5) 
b.empil...
114 
UTILISATION (CALCUL ARITHMÉTIQUE) 
On suppose que l’expression est bien écrite et qu’elle se trouve dans un tableau ...
115 
UTILISATION (CALCUL ARITHMÉTIQUE) 
 Exemple: 598+46**7+* 
(5, 0) 
(9, 0) 
(8, 0) 
(+, 2) 
(4, 0) 
(6, 0) 
(*, 2) 
(*...
116 
UTILISATION (CALCUL ARITHMÉTIQUE) 
On suppose aussi que la fonction « Calcul (opd1, op, opd2) » permet de retourner ...
117 
Evaluation d'une expression postfixée Si opérande Alors empiler Si opérateur Alors Si opérateur unaire dépiler une f...
118 
EVAL_Postfixe( T: Tableau [] de terme, n: entier ) : Reel 
CreerPile(P); 
Pour i ← 0 à (n-1) faire 
Si (T[i].type=0) ...
119 
UTILISATION (CALCUL ARITHMÉTIQUE) 
Soit à évaluer l’expression préfixé suivante : *5+*+98*467 
a.empiler(7) 
b.empil...
120 
UTILISATION (CALCUL ARITHMÉTIQUE) 
EVAL_Postfixe( T: Tableau [] de terme, n: entier ) : Reel CreerPile(P); Pour i ← (...
SOURCES DE CE COURS 
N. EL-ALLIA , Cours d’Algorithmique et Structures de données dynamiques, Ecole nationale Supérieure ...
Prochain SlideShare
Chargement dans…5
×

Chapitre 3 structures séquentielles

3 711 vues

Publié le

structures séquentielles: listes linéaires chainées, files d'attente et piles

Publié dans : Formation
0 commentaire
4 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 711
Sur SlideShare
0
Issues des intégrations
0
Intégrations
5
Actions
Partages
0
Téléchargements
109
Commentaires
0
J’aime
4
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Chapitre 3 structures séquentielles

  1. 1. CHAPITRE III: STRUCTURES SÉQUENTIELLES Université Saad Dahlab de Blida Faculté des Sciences Département d’Informatique Licence d’Informatique Semestre 3 (2ème année) Algorithmique et Structures de Données Mme AROUSSI 2014-2015 Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/
  2. 2. PLAN DU CHAPITRE III Introduction I.Listes Linéaires Chaînées (LLC) II.Files d’Attente (FIFO) III.Piles (LIFO) Conclusion 2
  3. 3. 3 Une structure séquentielle est un ensemble de variables de même nature organisées séquentiellement auxquelles on peut accéder : soit directement par leur numéro d’ordre soit en les parcourant une par une dans l’ordre INTRODUCTION
  4. 4. PARTIE I: LISTES LINÉAIRES CHAÎNÉES (LLC)
  5. 5. PLAN DE LA PARTIE I Définitions Modèle des LLC (MLLC) Algorithmes sur les listes Listes particulières Représentation contigüe Conclusion 5
  6. 6. 6 Une Liste Linéaire Chaînées (LLC) est un ensemble de maillons reliés entre eux. Un maillon est une entité renfermant de l’information et ayant un pointeur sur le maillon qui la suit. C’est toujours une structure (enregistrement) avec deux champs : un champ Valeur : contenant l'information un champ Adresse : donnant l'adresse du prochain maillon. DÉFINITIONS ……. val suiv V1 @1 V2 @2 V3 @3 Vn @n
  7. 7. Nil 7 Une LLC est caractérisée par : L'adresse de son premier élément (la tête de liste). Elle doit toujours être sauvegardée dans une variable pour pouvoir manipuler la liste. NIL constitue l'adresse qui ne pointe aucun maillon (indiquant par convention la fin de la liste). Si la liste est vide (ne contient aucun maillon), la tête doit alors être positionnée à NIL. DÉFINITIONS Tête de liste ……. val suiv V1 @1 V2 @2 V3 @3 Vn @n Tête
  8. 8. Nil 8 DÉFINITIONS Tête de liste ……. val suiv V1 @1 V2 @2 V3 @3 Vn @n Langage Algorithmique Langage C type Maillon = Structure val : typeqq suiv: * Maillon fin struct Maillon { typeqq val ; struct Maillon*suiv ; }; Var Tête: *Maillon struct Maillon* Tête;
  9. 9. 9 On définit un ensemble d'opérations que l'on va utiliser pour écrire des algorithmes sur les listes. Cet ensemble d'opérations s'appelle le Modèle des Listes Linéaires Chaînées (MLLC) : MODÈLE DE LLC (MLLC) Modules Rôle Allouer( P) C’est une procédure qui alloue (dynamiquement) un nouveau maillon et affecte son adresse dans le pointeur P. Libérer(P) C’est une procédure qui détruit le maillon pointé par P. Valeur(P) C’est une fonction qui retourne le contenu du champs « val » du maillon pointé par P (retourner (*P.val)) Suivant(P) C’est une fonction qui retourne le contenu du champs « suiv » du maillon pointé par P (retourner (*P.adr)) Aff_Adr(P, Q) C’est une procédure qui affecte le pointeur Q dans le champs « suiv » du maillon pointé par P (*P.suivQ) Aff_Val(P,v) C’est une procédure qui affecte la valeur v dans le champs « val » du maillon pointé par P (*P.valv)
  10. 10. 10 Voici l’équivalence en langage C, des fonctions et des procédures du modèle : MODÈLE DE LLC (MLLC) Modules Implémentation en langage C Allouer( P) struct Maillon *Allouer ( ) { return ((struct Maillon *) malloc( sizeof(struct Maillon))); } Libérer(P) Void Libérer ( struct Maillon *P) {free (p);} Valeur(P) typeqq Valeur( struct Maillon *P) { return( P->val) ; //équivalent à *P.val} Suivant(P) struct Maillon *Suivant( struct Maillon *P) { return( P->suiv ); //équivalent à *P.suiv}} Aff_Adr(P, Q) void Aff_Adr( struct Maillon *P, struct Maillon *Q) { P->suiv = Q; //équivalent à *P.suiv=Q} Aff_Val(P,v) void Aff_Val(struct Maillon *P, int v) { P->val =v; //équivalent à *P.val = v}
  11. 11. 11 Parcours : Accès par valeur : il s'agit de rechercher (séquentiellement à partir de la tête) une valeur v dans la liste. Accès par position : il s'agit de rechercher (séquentiellement à partir de la tête) le maillon (son adresse) qui se trouve à la position donnée. La position est le numéro d'ordre du maillon dans la liste (entier). ALGORITHMES SUR LES LLCS
  12. 12. 12 Mises à jour : Construction d'une liste à partir de n valeurs données. Insertion d'une valeur (v) à une position donnée (i) : allouer un nouveau maillon contenant v et l'insérer dans la liste de telle sorte qu'il se retrouve à la i ème position. Insertion d'une valeur (v) dans une liste ordonnée : allouer un nouveau maillon contenant v et l'insérer dans la liste de telle sorte que la liste reste ordonnée après l'insertion. ALGORITHMES SUR LES LLCS
  13. 13. 13 Mises à jour : Suppression du maillon se trouvant à une position donnée (i) : rechercher par position le maillon i et le libérer. Suppression d'une valeur v dans la liste : rechercher par valeur et supprimer le maillon trouvé en mettant à jour le précédent (s'il existe). Si la liste contient plusieurs occurrences de la même valeur, on pourra les supprimer en faisant un seul parcours de à liste. Destruction de tous les maillons d'une liste. ALGORITHMES SUR LES LLCS
  14. 14. 14 Tri sur les LLC : Les mêmes algorithmes de tri utilisable pour les tableaux, en prenant en compte que l'accès par position coûte beaucoup plus cher que dans un tableau. Algorithmes sur plusieurs LLC : Fusion (ou Interclassement) de deux listes ordonnées : à partir de 2 listes ordonnées, construire une liste ordonnée contenant tous leurs éléments (sans allouer de nouveaux maillons). Eclatement d'une liste en 2 listes distinctes : à partir d'une liste L et d'un critère (un prédicat) donné, on construit deux listes, l'une contenant toutes les valeurs de L vérifiant le critère, l'autre, celles qui ne le vérifient pas. ALGORITHMES SUR LES LLCS
  15. 15. 15 Exercice 1: Développer les algorithmes suivants qui permettent de : 1.Créer une LLC à partir d'une suite de n valeurs (entières) lues, 2.Imprimer la liste ainsi créée. 3.Détruire la liste ainsi créée ALGORITHMES SUR LES LLCS
  16. 16. 16 Pour créer cette liste: 1.Allouer un nouveau maillon 2.Remplir le champ valeur de ce maillon 3.Insérer dans la liste. Dans ce cas il y a deux cas: a.Insertion à la fin b.Insertion au début et la liste crée est à l’envers ALGORITHMES SUR LES LLCS CRÉATION UNE LLC À PARTIR D'UNE SUITE DE N VALEURS LUES val suiv ??? ??? val suiv 2 NIL
  17. 17. 17 Cas 1: Insertion à la fin. Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6 ALGORITHMES SUR LES LLCS CRÉATION UNE LLC À PARTIR D'UNE SUITE DE N VALEURS LUES 2 10 5 -1 6 L Q P Aff_adr (Q, P) Procédure CréerLLC (var L:*maillon) Début Pour i1 à N faire DP lire (x) Allouer (P) aff_val(P, x) aff_adr(P, null) Si (L=null) alors //la liste est vide L P // mettre à jour l’entête Sinon aff_adr(Q, P) QP //sauvegarder l’@ du dernier maillon FP Fin
  18. 18. 18 Soient N= 5 et les valeurs suivantes: 2, 10, 5, -1, 6 Cas 1: Insertion au début ALGORITHMES SUR LES LLCS CRÉATION UNE LLC À PARTIR D'UNE SUITE DE N VALEURS LUES -1 5 10 2 6 L P Aff_adr (P, L) Procédure CréerLLC_inversé (var L:*maillon) Début Pour i1 à N faire DP lire (x) Allouer (P) aff_val(P, x) aff_adr(P, null) aff_adr(Q, L) LP //mettre à jour la tête de la liste FP Fin
  19. 19. 19 Soient la liste suivante: La liste imprimé est 2, 10, 5, -1 et 6 ALGORITHMES SUR LES LLCS IMPRESSION D’UNE LLC 2 10 5 -1 6 P Procédure Imprimer_LLC (P:*maillon) Début Tant que (PNull) faire // la liste n’est pas vide DTQ écrire (valeur (P)) P suivant (P) FTQ Fin
  20. 20. 20 Soient la liste suivante: ALGORITHMES SUR LES LLCS DESTRUCTION D’UNE LLC 2 10 5 -1 6 P Procédure Détruire (Var P:*maillon) Début Tant que (PNull) faire // la liste n’est pas vide DTQ QP P suivant (P) libérer (Q) FTQ Fin 2 10 5 -1 6 P Q
  21. 21. 21 Exercice 2: Soient L une liste d’entier non ordonnée. Développer les modules suivants: 1.Rechercher une valeur « v » dans la liste 2.Rechercher la valeur du maillon qui se trouve à la position K 3.Insérer une valeur « v »: a.Au début de la liste b.À la fin de la liste c.À une position donnée ALGORITHMES SUR LES LLCS
  22. 22. 22 Exercice 2: Soient L une liste d’entier non ordonnée. Développer les modules suivants: 4.Supprimer un maillon qui se trouve: a.Au début de la liste b.À la fin de la liste c.À une position donnée 5.Supprimer une valeur v dans la liste. ALGORITHMES SUR LES LLCS
  23. 23. 23 Rechercher une valeur « v=5 » dans la liste suivante: Si v= 1 alors la fonction retourne null. ALGORITHMES SUR LES LLCS RECHERCHE DANS UNE LLC 2 10 5 -1 6 L Fonction Rech (L:*maillon, v:entier): *maillon Début P L Tant que (PNull) faire // la liste n’est pas vide DTQ Si valeur (P) = v alors retourner (P) Sinon P suivant (P) FTQ Retourner (Null) Fin P
  24. 24. 24 Pour rechercher la valeur du maillon qui se trouve à la position K, deux cas se présentent: Cas 1: K longueur(Liste), donc le maillon du position K n’existe même pas. Cas 2: 1≤K ≤ longueur(Liste), donc il est possible d’accéder au maillon du position K ALGORITHMES SUR LES LLCS RECHERCHE DANS UNE LLC
  25. 25. 25 Pour rechercher la valeur du maillon qui se trouve à la position k = 4, la fonction retourne la valeur -1 (possible est à vrai). Si k= 6, la fonction retourne possible à faux ALGORITHMES SUR LES LLCS RECHERCHE DANS UNE LLC 2 10 5 -1 6 L Procédure Rech_pos(L: *maillon, K: entier, var v: entier, var possible: booléen) Debut P L Si K  longueur (liste) alors possible faux Sinon Dsinon possible vrai Pour i  1 à K faire P suivant (P) v valeur (P) Fsinon Fin P
  26. 26. 26 Rechercher la valeur du maillon qui se trouve à la position k ALGORITHMES SUR LES LLCS RECHERCHE DANS UNE LLC 2 ème méthode (sans l’utilisation de la fonction longueur) Procédure Rech_pos(L: *maillon, K: entier, var v: entier, var possible: booléen) Debut P L i 0 Tant que (iK) et (PNull) faire //accéder au K ème maillon DTQ P suivant (P) i++ FTQ Si (P = Null) alors //le cas où K  longueur (liste) possible faux Sinon Dsinon possible vrai v valeur (P) Fsinon Fin
  27. 27. 27 Pour ajouter un élément dans la liste il y a plusieurs situations : 1.Insertion au début de la liste 2.Insertion à la fin de la liste 1.Insertion à une position donnée ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC
  28. 28. 28 Cas 1: Insertion au début ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC -1 5 10 2 6 L P Aff_adr (P, L) Procédure Insérer_Deb(Var L:*maillon, v:entier) Début Allouer (P) aff_val(P, v) aff_adr(P, null) aff_adr(Q, L) LP //mettre à jour la tête de la liste Fin Procédure CréerLLC_inversé (var L:*maillon) Début Pour i1 à N faire lire (v) Insérer_Deb( L, v) Fin
  29. 29. 29 Cas 2: Insertion à la fin. ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC 2 10 5 -1 6 L Q P Aff_adr (Q, P) Procédure Insérer_Fin (var L:*maillon, v:entier) Début Allouer (P) aff_val(P, v) aff_adr(P, null) Si (L=null) alors //la liste est vide L P // mettre à jour l’entête Sinon Dsinon Q L Tant que (suivant (Q)Null) faire // accéder au dernier maillon Q suivant (Q) aff_adr (Q, P) Fsinon Fin Procédure CréerLLC (var L:*maillon) Début Pour i1 à N faire DP lire (v) Insérer_Fin(L, v) FP Fin
  30. 30. 30 Cas 2: Insertion à une position donné « pos ».  On suppose que pos est entre 1 et longueur(Liste) On doit accéder d’abord au maillon de position « pos -1 », ensuite refaire le chaînage comme suit; ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC 2 10 5 -1 6 L Q P (1) Aff_adr (P, suivant (Q)) pos (2) Aff_adr (Q, P)
  31. 31. 31 ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC 2 10 5 -1 6 L Q P (1) Aff_adr (P, suivant (Q)) Procédure Insérer_Pos (var L:*maillon, pos: entier, v:entier) Début Allouer (P) aff_val(P, v) Si (k=1) alors aff_adr(P, L) L P // mettre à jour l’entête Sinon Q L Pour i1 à pos-1 faire // accéder au dernier maillon Q suivant (Q) Aff_adr (P, suivant (Q)) aff_adr (Q, P) Fin pos (2) Aff_adr (Q, P)
  32. 32. 32 Pour supprimer un élément dans la liste il y a plusieurs situations : 1.Suppression au début de la liste 2.Suppression à la fin de la liste 1.Suppression à une position donnée ALGORITHMES SUR LES LLCS INSERTION DANS UNE LLC
  33. 33. 33 Cas 1: Suppression au début ALGORITHMES SUR LES LLCS SUPPRESSION DANS UNE LLC 2 10 5 -1 6 P Procédure Supprimer_Deb (Var P:*maillon) Début Si P Null alors QP P suivant (P) libérer (Q) Fin 2 10 5 -1 6 P Q Procédure Détruire (Var P:*maillon) Début Tant que (PNull) faire Supprimer_Deb (P) Fin
  34. 34. 34 Cas 2: Suppression à la fin ALGORITHMES SUR LES LLCS SUPPRESSION DANS UNE LLC 2 10 5 -1 6 L Procédure Supprimer_Fin (Var L:*maillon) Début Si L Null alors Si (suivant (L) = null) alors // le cas om la liste contient un seul maillon libérer (L) Lnull Sinon PL; QL Tant que (suivant(Q)Null) faire PQ Q suivant (Q) Aff_adr(P,null) libérer (Q) Fin P Q
  35. 35. 35 Cas 3: suppression à une position donné « pos ».  On suppose que pos est entre 1 et longueur(Liste) Deux situations se présentent: K = 1, suppression au début K  1, On doit accéder d’abord au maillon de position « pos» en sauvegardant l’adresse du maillon « pos-1 », ensuite refaire le chaînage comme suit; ALGORITHMES SUR LES LLCS SUPPRESSION DANS UNE LLC 2 10 5 -1 L Q pos P
  36. 36. 36 Cas 3: suppression à une position donné « pos ». ALGORITHMES SUR LES LLCS SUPPRESSION DANS UNE LLC 2 10 5 -1 L Q pos P Procédure Supprimer_pos (Var L:*maillon, pos:entier) Début Si (pos = 1) alors // supprimer le premier maillon Supprimer_Deb(L) Sinon PL QL Pour i 1 à pos faire QP P suivant (P) Aff_adr(Q,suivant (P)) libérer (P) Fin
  37. 37. 37 Liste circulaire est une LLC où le dernier maillon pointe le premier, formant ainsi un cercle. La tête de la liste est l'adresse de n'importe quel maillon de la liste circulaire. Le même modèle des LLC est utilisé pour écrire des algorithmes sur ce type de listes: MLLCc = MLLC LISTES PARTICULIÈRES LISTE CIRCULAIRE ……. V1 @1 V2 @2 V3 @3 Vn @n Tête
  38. 38. 38 Construction d’une LLC circulaire Construire une LLC unidirectionnel À la fin, chaîner le dernier maillon avec le premier LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 6 L Procédure CréerLLC (var L:*maillon) Début Pour i1 à N faire lire (x) Allouer (P); aff_val(P, x) ; aff_adr(P, null) Si (L=null) alors L P // mettre à jour l’entête Sinon aff_adr(Q, P) QP //sauvegarder l’@ du dernier maillon Aff_adr (P, L); Fin Q P
  39. 39. 39 Construction d’une LLC circulaire LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 6 L 2 éme Méthode Procédure CréerLLCcir (var L:*maillon) Début Pour i1 à N faire lire (x); Allouer (P); aff_val(P, x) Si (L=null) alors //la liste est vide aff_adr(P, P) L P // mettre à jour l’entête Sinon aff_adr(Q, P) aff_adr(P, L)// lier le dernier maillon au premier QP //sauvegarder l’@ du dernier maillon Fin Q P
  40. 40. 40 Impression d’une LLC circulaire LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 L Procédure Imprimer_cir (var L:*maillon) Début Si L  Null alors PL Répéter Écrire (valeur (P)) P suivant(P) Jusqu’à P=L Fin P
  41. 41. 41 Recherche d’une valeur dans une LLC circulaire LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 L Fonction Rechercher_cir (var L:*maillon, v:entier): maillon Début Si L  Null alors PL Répéter Si (valeur (P) = v) alors retourner (P) P suivant(P) Jusqu’à P=L Retourner (null) Fin P
  42. 42. 42 Insertion dans une LLC circulaire LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 6 L Procédure Insérer_cir (var L:*maillon, v:entier) Début Allouer (P) aff_val(P, v) Si (L=null) alors //la liste est vide aff_adr(P, P) L P // mettre à jour l’entête Sinon Qsuivant (L) aff_adr (L, P) aff_adr(P ,Q) Fin P Q
  43. 43. 43 Suppression du maillon contenant la valeur v Rechercher le maillon contenant la valeur v S’il existe un tel maillon, on distingue deux cas: 1.La valeur se trouve dans le maillon « L », on doit rechercher d’abord le précédent de ce maillon, a.Si la liste contient qu’un seul maillon, alors la liste devient vide b.Sinon, mettre à jour le pointeur L et refaire le chaînage. 2.La valeur se trouve dans un autre maillon ( L), refaire le chaînage LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 L
  44. 44. 44 Suppression du maillon contenant la valeur v LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) Procédure Supprimer_cir (Var L:*maillon, v:entier) Début Si (L  Null) alors // la liste n’est pas vide PL répéter Si (valeur (P)  v ) alors QP P suivant (P) jusqu’à (P = L) ou (valeur (P) =v ) Si valeur (P) =v alors // il existe un maillon contenant la valeur v Si P = L alors //la valeur se trouve dans le maillon L répéter // rechercher le maillon précédent du L Q suivant (Q) jusqu’à ce que suivant (Q) = L Si P = Q alors // la liste contient un seul maillon L  null Sinon L  suivant (P) Aff_adr(Q,suivant (P)) Sinon Aff_adr(Q,suivant (P)) libérer (P) Fin //rechercher le maillon contenant la valeur v
  45. 45. 45 Suppression du maillon contenant la valeur v LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2ème méthode Procédure Supprimer_cir (Var L:*maillon, v:entier) Début Si (L  Null) alors // la liste n’est pas vide P Rechercher_cir (L, v) Si P  Null alors // il existe un maillon contenant la valeur v Q Précédent (P) // rechercher le maillon précédent de P Si P = L alors //la valeur se trouve dans le maillon L Si P = Q alors // la liste contient un seul maillon L  null Sinon L  suivant (P) Aff_adr(Q,suivant (P)) Sinon Aff_adr(Q,suivant (P)) libérer (P) Fin
  46. 46. 46 Destruction d’une LLC circulaire LISTES PARTICULIÈRES LISTE CIRCULAIRE (QUELQUES ALGORITHMES) 2 10 5 -1 L Procédure Détruire_cir (Var L:*maillon) Début Si LNull alors P suivant (L) TQ (P≠L) faire aff_adr(L, suivant (P)) libérer (P) P suivant (L) FTQ Libérer (P); L Null; Fin
  47. 47. 47 Liste bidirectionnelle ou Liste Doublement Chaînées est une liste que l'on peut parcourir dans les deux sens : de gauche à droite (pour aller au maillon suivant) et de droite à gauche (pour aller au maillon précédent). Elle est définit par sa tête, aussi que par sa queue. LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE Tête Nil V1 V2 V3 V4 V5 Nil Queue val suiv prec
  48. 48. Chaque maillon d’une liste bidirectionnelle comporte trois champs: Un champ contenant la donnée. Un pointeur vers l'élément suivant de la liste. Un pointeur vers l'élément précédent de la liste. LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE val suiv type Maillon = Structure val : typeqq suiv: * Maillon prec:*Maillon fin Var Tête, queue: *Maillon prec 48
  49. 49. Le modèle des LLC bidirectionnelles est donc étendu par les opérations suivantes : MLLCb = MLLC - {Aff_Adr} + { Aff_prec, Aff_suiv, Précédent } LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE 49 Fonction Rôle Précédent(P) Accéder au champ « prec » du maillon d'adresse P. Aff_prec(P, Q) Modifier le champ « prec » du maillon d'adresse P en lui affectant le pointeur Q. Aff_suiv(P, Q) Modifier le champ « suiv » du maillon d'adresse P en lui affectant le pointeur Q. val suiv prec
  50. 50. 50 Construction d’une LLC Bidirectionnelle  Cas 1: Insertion à la fin. Soient N= 4 et les valeurs suivantes: 2, 5, -1, 6 LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) Procédure Insérer_Fin_BD (var T, Q:*maillon, v:entier) Début Allouer (P); aff_val(P, x); Si Q = Null //la liste est vide aff_suiv(P, null); aff_prec(P, null) T P; Q P Sinon aff_suiv(P, null) aff_suiv (Q, P); aff_prec (P, Q) QP //mettre à jour la queue Fin Aff_suiv (Q, P) T Q 2 5 -1 6 P Aff_prec (P, Q) Procédure CréerLLC_BDQ(var T, Q:*maillon) Début Pour i1 à N faire lire (x); Insérer_Fin_BD(T, Q, x); Fin
  51. 51. 51 Construction d’une LLC Bidirectionnelle  Cas 2: Insertion au début. Soient N= 4 et les valeurs suivantes: 2, 5, -1, 6 LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) Aff_suiv (P, T) T Q -1 5 2 6 P Aff_prec (T, P) Procédure Insérer_Deb_BD (var T, Q:*maillon, v:entier) Début Allouer (P); aff_val(P, v); Si L = Null alors // si la liste est vide aff_suiv(P, null); aff_prec(P, null) T P; Q P Sinon aff_prec (P, null); aff_suiv (P, T) ; aff_prec (T, P) TP //mettre à jour la tête Fin Procédure CréerLLC_BD T(var T, Q:*maillon) Début Pour i1 à N faire lire (x); Insérer_Deb_BD(T, Q, x); Fin
  52. 52. 52 Insertion à une position donnée (avant) LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) P pos T 2 5 -1 6 Q S 6 (1) (2) (3) (4) Procédure Insérer_pos_BD (var T, Q:*maillon, v:entier) Si pos = 1 alors Insérer_Deb_BD(T, Q, v) Sinon S T; Pour i  1 à pos faire S suivant (S); //accéder au maillon « pos » Allouer (P); aff_val(P, v); aff_suiv (Precedent (S), P) ; aff_prec (P, Precedent (S)); aff_suiv (P, S) ;aff_prec (S, P) ;
  53. 53. 53 Impression d’une LLC Bidirectionnelle LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) T 2 5 -1 6 Q Procédure Imprimer_LLC_BDT (T:*maillon) Début Tant que (TNull) faire // la liste n’est pas vide écrire (valeur (T)) T suivant (T) Fin La liste imprimée est 2, 5, -1, 6 Procédure Imprimer_LLC_BDQ (Q:*maillon) Début Tant que (QNull) faire // la liste n’est pas vide écrire (valeur (Q)) Q précédent (Q) Fin La liste imprimée est 6, -1, 5, 2
  54. 54. 54 Recherche d’une valeur dans une LLC Bidirectionnelle LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) Fonction Rech_BD T(T:*maillon, v:entier): *maillon Début P T Tant que (PNull) faire // la liste n’est pas vide Si valeur (P) = v alors retourner (P) Sinon P suivant (P) Retourner (Null) Fin T 2 5 -1 6 Q Fonction Rech_BDQ (Q:*maillon, v:entier): *maillon Début P Q Tant que (PNull) faire // la liste n’est pas vide Si valeur (P) = v alors retourner (P) Sinon P précédent (P) Retourner (Null) Fin
  55. 55. 55 Suppression du maillon contenant la valeur v LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) 2 5 -1 6 Procédure Supprimer_BD (Var T, Q:*maillon, v:entier) Si (L  Null) alors // la liste n’est pas vide P Rech_BDT (T, v) Si P  Null alors // il existe un maillon contenant la valeur v Si P = T = Q alors // la liste contient un seul maillon T Null; Q Null // la liste devient vide Sinon Si P = T alors //suppression au début T  suivant (P); aff_prec(T, null); Sinon Si P = Q alors //suppression à la fin Q précédent (P); aff_suiv(Q, null) Sinon aff_suiv(precedent (P), suivant(P)); aff_prec(suivant(P), precedent (P)); libérer (P) Q L P
  56. 56. 56 Destruction d’une LLC Bidirectionnelle LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE (QUELQUES ALGORITHMES) T 2 5 -1 6 Q Procédure Détruire_BD (Var T:*maillon) Début Tant que (TNull) faire // la liste n’est pas vide PT T suivant (T) libérer (P) Fin Procédure Détruire_BD (Var Q:*maillon) Début Tant que (QNull) faire // la liste n’est pas vide PQ Q précédent (Q) libérer (P) Fin
  57. 57. 57 Liste bidirectionnelle circulaire est une LLC à double sens et dont le dernier pointe sur le premier et le premier pointe sur le dernier: circulaire. Le même modèle des LLCs bidirectionnel est utilisé pour écrire des algorithmes sur ce type de liste: MLLCbc = MLLCb LISTES PARTICULIÈRES LISTE BIDIRECTIONNELLE CIRCULAIRE Tête V1 V2 V3 V4 V5
  58. 58. 58 On peut représenter une LLC par un tableau où chaque élément contient au moins 3 champs : l'information, l’indice du suivant et l’indicateur vide. Exemple d’une LLC unidirectionnel: REPRÉSENTATION CONTIGÜE DÉFINITION Tête 12 8 23 45 Nil Vide Info Lien F 12 4 F 23 7 V F 8 2 V V F 45 -1 Tête = 0
  59. 59. 59 Initialement, le champ Vide de tous les éléments sont à vrai pour indiquer que les cases sont disponibles. Une LLC est définie par l'indice de son premier élément dans le tableau T Vide Info Lien F 12 4 F 23 7 V F 8 2 V V F 45 -1 REPRÉSENTATION CONTIGÜE DÉFINITION Définition de la structure : type element = Structure vide : Booléen val : typeqq suiv : Entier fin var Liste : tableau [0..Max-1] de element Tête = 0
  60. 60. 60 Le modèle de la LLC est défini comme suit: REPRÉSENTATION CONTIGÜE MODÈLE Modules Rôle Allouer(L, max) C’est une fonction qui retourne l’indice de la case libre dans le tableau L du taille max sinon la valeur -1 s'il n’y a pas de place. Libérer(L,P) C’est une procédure qui positionne le champs « vide » de la case L[P] à vrai Valeur(L, P) C’est une fonction qui retourner le contenu du champs « val » de la case L[P]. Suivant(L, P) C’est une fonction qui retourne le contenu du champs « suiv » de la case L[P] Aff_Adr(L, P, Q) C’est une procédure qui affecte l’entier Q dans le champs « suiv » de la case L[P] Aff_Val(L, P,v) C’est une procédure qui affecte la valeur v dans le champs « val » de la case L[P]
  61. 61. 61 REPRÉSENTATION CONTIGÜE MODÈLE Modules Rôle Complexité Allouer(L, max) Pour i0 à max-1 faire Si L[i].Vide alors L[i] faux Retourner(i) Retourner (-1) O(max) Libérer(L,P) L[P].Vide  vrai O(1) Valeur(L, P) Retourner (L [P].val) O(1) Suivant(L, P) Retourner (L [P].suiv) O(1) Aff_adr(L, P, Q) L[P] .suiv Q O(1) Aff_Val(L, P, v) L[P] .val v O(1)
  62. 62. Faut-il utiliser un tableau ou une LLC? CONCLUSION 62
  63. 63. 63 Tableau LLC Accès à un élément Direct (O(1)) Séquentielle (O(n)) tq n est la longueur de la liste Définition de la relation suivant: Implicite définie par la contiguïté des composantes du tableau Explicite On peut la modifier , i.e. les maillons des LLC peuvent être réarrangés sans avoir à déplacer les informations qu’ils portent). De plus, un même maillon peut faire partie de plusieurs listes. Sur- encombrement Non: La relation suivant étant implicite, il n’y a pas besoin d’espace supplémentaire pour son codage. Oui: l’encombrement de chaque maillon est augmenté de la taille du pointeur suivant CONCLUSION
  64. 64. 64 Tableau LLC Sur- encombrement Non: La relation suivant étant implicite, il n’y a pas besoin d’espace supplémentaire pour son codage. Oui: l’encombrement de chaque maillon est augmenté de la taille du pointeur suivant Encombrement total selon le besoin Non: avec l’allocation statique, l’encombrement d’un tableau est constant (fixé d’avance). Oui: avec l’allocation dynamique des maillons, le nombre de maillons d’une LLC correspond au nombre d’éléments effectivement présents CONCLUSION
  65. 65. Partie II: Files d’Attente
  66. 66. PLAN DE LA PARTIE II Définition Utilisation Modèle Implémentation Représentation statique Représentation dynamique File d’attente avec priorité 66
  67. 67. 67 Une file (en anglais queue) est une structure de données basée sur le principe « premier arrivé, premier sorti » (en anglais FIFO: First In First Out), Le fonctionnement ressemble à une file d'attente : les premières personnes à arriver sont les premières personnes à sortir de la file. DÉFINITION
  68. 68. 68 Une file d'attente peut être définie comme une collection d'éléments dans laquelle tout nouvel élément est inséré (ajouté) à la fin (queue) et tout élément ne peut être supprimé (retiré) que du début (Tête). DÉFINITION Retrait (Défilement ) Ajout (enfilement) tête queue
  69. 69. 69 Les files d’attente sont utilisées, en programmation comme des buffers (mémoire tampon = espace de mémorisation temporaire) , pour gérer des objets qui sont en attente d’un traitement ultérieur, tel que la gestion des documents à imprimer, des programmes à exécuter, des messages reçus,...etc. Elles sont utilisées également dans le parcours des arbres. UTILISATION
  70. 70. 70 Les opérations habituelles sur les files sont : Création ou Initialisation de la file Vérification du contenu de la file (vide ou pleine) Enfilement : ajout d’un élément à la queue de la file Défilement : retrait d’un élément de la tête de la file MODÈLE Opération Rôle CréerFile(F) créer une file vide Enfiler(F,Val) ajouter Val à la queue de file Défiler(F,Val) retirer dans Val l'élément en tête de file Filevide(F) tester si la file est vide Filepleine(F) tester si la file est pleine
  71. 71. 71 Les files d’attente peuvent être présentées en deux manières: statique en utilisant les tableaux, dynamique en utilisant les listes linéaires chaînées. L’implémentation statique peut être réalisée par décalage en utilisant un tableau avec une tête fixe, toujours à 0, et une queue variable. tableau circulaire où la tête et la queue sont toutes les deux variables. IMPLÉMENTATION
  72. 72. 72 A chaque défilement, on fait un décalage.  La tête n'est plus une caractéristique puisqu'elle est toujours égale à 0. IMPLÉMENTATION STATIQUE PAR DÉCALAGE V0 V1 V2 V3 V4 V5 Tête = 0 Queue = 5 Défiler Décalage V1 V2 V3 V4 V5 Queue = 4
  73. 73. 73 IMPLÉMENTATION STATIQUE PAR DÉCALAGE Définition de la structure : TYPE File_Attente = STRUCTURE Elements : TABLEAU[0..Max-1] de Typeqq Queue : ENTIER FIN VAR F : File_Attente V1 V2 V3 V4 V5 V6 Queue File_Attente Eléments
  74. 74. 74 IMPLÉMENTATION STATIQUE PAR DÉCALAGE Modèle Implémentation Créerfile(F) F.Queue ←-1 Filevide(F) Filevide ← (F.Queue = -1) Filepleine(F) Filepleine ← (F.Queue = Max-1) Enfiler(F,X) SI (NON Filepleine(F)) F.Queue ← F.Queue + 1 F.Elements[F.Queue] ←X Defiler(F,X) SI (NON Filevide(F)) X ← F.Elements[0] POUR I ← 0 à F.Queue - 1 F.Elements[I] ← F.Elements[I+1] F.Queue ← F.Queue – 1
  75. 75. 75 Les incrémentations se font modulo N afin de réutiliser des cases libérées: Tete  (Tete+1) mod Max & Queue  (queue+1) mod Max Par convention, L'élément d'indice tête sera sacrifié (case vide). Le premier élément élément se trouve alors à l'indice (tête+1 mod Max) IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE V0 V1 V2 V3 V4 V5 Tête = 0 Queue = 5
  76. 76. 76 IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE V1 V2 V3 V4 V5 Tête = 0 Queue = 5 V2 V3 V4 V5 Tête = 1 Queue = 5 Tête = Queue = 5  Défiler (F, V)  Pour i1 à 4 faire Défiler (F, V) File Vide ssi Tête = Queue
  77. 77. 77 IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE V3 V4 V5 V6 V7 V8 Tête = 2 Queue = 8 V9 V3 V4 V5 V6 V7 V8 Tête = 2 Queue = 0  Enfiler (F, V9) V9 V10 V3 V4 V5 V6 V7 V8 Tête = 2 Queue = 1  Enfiler (F, V10) File Pleine ssi : tete = (queue+1) mod Max Queue  (queue+1) mod Max
  78. 78. 78 IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE Définition de la structure : TYPE File_Attente = STRUCTURE Elements : TABLEAU[0..Max-1] de Typeqq Tête, Queue : ENTIER FIN VAR F : File_Attente File_Attente Eléments V2 V3 V4 V5 Tête = 1 Queue = 5
  79. 79. 79 IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE Modèle Implémentation Créerfile(F) F.Tête = F.Queue ←Max Filevide(F) Filevide ← (F.Tête = F.Queue) Filepleine(F) Filepleine ← (F.Tête = ( (F.Queue +1) Mod Max )) Enfiler(F,X) SI (NON Filepleine( F)) F.Queue ← (F.Queue + 1) Mod Max F.elements[F.Queue] ← X Defiler(F,X) SI ‘(NON Filevide(F)) F.Tete ← (F.Tete + 1)Mod Max X ← F.elements[F.Tete]
  80. 80. 80 La représentation dynamique utilise une liste linéaire chaînée (LLC). L’enfilement se fait à la queue de la liste et de défilement se fait de la tête La file d’attente, dans ce cas, peut devenir vide, mais ne sera jamais pleine. Les opérations de base sont : Enfilement : insertion d’un élément à la queue de la LLC Défilement : suppression d’un élément de la tête de la LLC Vérification si la LLC n’est pas vide IMPLÉMENTATION DYNAMIQUE V0 V1 V2 V3 V4 Tête Queue Enfilement Défilement
  81. 81. 81 IMPLÉMENTATION DYNAMIQUE V0 V1 V2 V3 V4 Tête Queue Définition de la structure : TYPE Element = STRUCTURE val : typeqq suiv: * Element FIN TYPE File_Attente = STRUCTURE TêTe, Queue : *Element FIN VAR F: File_Attente File_Attente
  82. 82. 82 IMPLÉMENTATION DYNAMIQUE Modèle Implémentation Créerfile(F) F.Tete ← NIL; F.Queue← NIL Filevide(F) Filevide←(F.Tete = NIL ) // ou (F.Queue = NIL ) Enfiler(F,X) Allouer (P), Aff_Val(P, X), Aff_Adr(P, NIL) SI (NON Filevide(F)) Aff_Adr(F.Queue, P) SINON F.Tete ← P F.Queue ← P Defiler(F,X) SI (NON Filevide(F)) P ← F.Tete X ← Valeur(F.Tete) F.Tete ← Suivant(F.Tete) Liberer(P)
  83. 83. 83 Une file d’attente avec priorité est une collection d’éléments dans laquelle l’insertion ne se fait pas toujours à la queue. Tout nouvel élément est inséré dans la file, selon sa priorité. Le retrait se fait toujours du début. Dans une file avec priorité, un élément prioritaire prendra la tête de la file même s’il arrive le dernier. Un élément est toujours accompagné d’une information indiquant sa priorité dans la file. L’implémentation de ces files d’attente peut être par tableau ou listes, mais l’implémentation la plus efficace et la plus utilisée utilise des arbres particuliers qui s’appellent les TAS. FILE D’ATTENTE AVEC PRIORITÉ
  84. 84. 84 Exercice: Le processeur possède un buffer permettant de gérer ses programmes à exécuter. Ce buffer est une file d'attente avec priorité où les éléments (programmes) sont caractérisés par une priorité d’exécution: un programme de priorité supérieure est servi même s’il n’est pas arrivé le premier. Sachant qu’un programme est défini par sa priorité et son mot d’état programme (Program Status Word ou PSW) qui regroupe l’adresse de la prochaine instruction (CO) et les bits du registre de flag. Définir les structures de données nécessaires ainsi que le modèle de file, pour chaque type de présentation (statique par décalage, statique par tableau circulaire et dynamique). FILE D’ATTENTE AVEC PRIORITÉ
  85. 85. 85 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR DÉCALAGE Définition de la structure : TYPE prog = STRUCTURE prio : ENTIER PSW : typeqcq FIN TYPE File_Attente = STRUCTURE Elements : TABLEAU[0..Max-1] de prog Queue : ENTIER FIN (0, PSW00) (1, PSW10) (1, PSW11) (2, PSW20) (3, PSW30) Queue
  86. 86. 86 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR DÉCALAGE Modèle Implémentation Créerfile(F) F.Queue ←-1 Filevide(F) Filevide ← (F.Queue = -1) Filepleine(F) Filepleine ← (F.Queue = Max-1) Defiler(F,X) SI (NON Filevide(F)) X .prio← F.Elements[0].prio X .PSW← F.Elements[0].PSW POUR I ← 0 à F.Queue - 1 F.Elements[I].prio← F.Elements[I+1].prio F.Elements[I].PSW ← F.Elements[I+1].PSW F.Queue ← F.Queue – 1
  87. 87. 87 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR DÉCALAGE (0, PSW00) (1, PSW10) (1, PSW11) (2, PSW20) (3, PSW30) Queue  Enfiler (F, (1, PSW12)) (0, PSW00) (1, PSW10) (1, PSW11) (1, PSW12) (2, PSW20) (3, PSW30) Queue Décalage
  88. 88. 88 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR DÉCALAGE Modèle Implémentation Enfiler(F,X) SI (NON Filepleine(F)) I ← 0 //rechercher la bonne position où enfiler X TQ (F.Elements[I].priorité ≤ X.priorité ) & (I F.Queue) faire I←I+1 //décaler les programmes moins prioritaires POUR J ← I à F.Queue - 1 F.Elements[J+1].prio← F.Elements[J] .prio F.Elements[J+1].PSW ← F.Elements[J] .PSW //insérer le programme X F.Elements[I].prio ← X.prio F.Elements[I].PSW ← X.PSW //mettre à jour la queue F.Queue ← F.Queue + 1
  89. 89. 89 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE Définition de la structure : TYPE prog = STRUCTURE prio : ENTIER PSW : typeqcq FIN TYPE File_Attente = STRUCTURE Elements : TABLEAU[0..Max-1] de prog Queue, Tete : ENTIER FIN (0, PSW00) (1, PSW10) (1, PSW11) (2, PSW20) (3, PSW30) Tete Queue
  90. 90. 90 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE Modèle Implémentation Créerfile(F) F.Tête = F.Queue ←Max Filevide(F) Filevide ← (F.Tête = F.Queue) Filepleine(F) Filepleine ← (F.Tête = ( (F.Queue +1) Mod Max )) Defiler(F,X) SI ‘(NON Filevide(F)) F.Tete ← (F.Tete + 1)Mod Max X.prio← F.elements[F.Tete].prio X.PSW← F.elements[F.Tete].PSW
  91. 91. 91 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE (0, PSW00) (1, PSW10) (1, PSW11) (2, PSW20) (3, PSW30) Queue  Enfiler (F, (1, PSW12)) (0, PSW00) (1, PSW10) (1, PSW11) (1, PSW12) (2, PSW20) (3, PSW30) Queue Tete Tete Décalage
  92. 92. 92 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION STATIQUE PAR TABLEAU CIRCULAIRE Modèle Implémentation Enfiler(F,X) SI (NON Filepleine(F)) I ← F.Tete //rechercher la bonne position où enfiler X TQ (F.Elements[I].priorité ≤ X.priorité ) & (I F.Queue) faire I←(I+1) Mod Max //décaler les programmes moins prioritaires J ← I TQ ( J F.Queue) faire F.Elements[J+1].prio← F.Elements[J] .prio F.Elements[J+1].PSW ← F.Elements[J] .PSW J←(J+1) Mod Max //insérer le programme X F.Elements[I].prio ← X.prio F.Elements[I].PSW ← X.PSW //mettre à jour la queue F.Queue ← (F.Queue + 1) Mod Max
  93. 93. 93 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION DYNAMIQUE (0,PSW00) Tête Queue (1,PSW10) (1,PSW11) (2,PSW20) (3,PSW30) Définition de la structure : TYPE prog = STRUCTURE prio : ENTIER PSW : typeqcq FIN TYPE Element = STRUCTURE val : prog suiv: * Element FIN TYPE File_Attente = STRUCTURE TêTe, Queue : *Element FIN
  94. 94. 94 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION DYNAMIQUE Modèle Implémentation Créerfile(F) F.Tete ← NIL F.Queue← NIL Filevide(F) Filevide←(F.Tete = NIL ) // ou (F.Queue = NIL ) Defiler(F,X) SI (NON Filevide(F)) P ← F.Tete X ← Valeur(F.Tete) F.Tete ← Suivant(F.Tete) Liberer(P)
  95. 95. 95 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION DYNAMIQUE (0,PSW00) Tête Queue (1,PSW10) (1,PSW11) (2,PSW20) (3,PSW30)  Enfiler (F, (1, PSW12)) (0,PSW00) Tête Queue (1,PSW10) (1,PSW11) (2,PSW20) (3,PSW30) (1,PSW12)
  96. 96. 96 FILE D’ATTENTE AVEC PRIORITÉ IMPLÉMENTATION DYNAMIQUE Modèle Implémentation Enfiler(F,X) Allouer (P), Aff_Val(P, X), Aff_Adr(P, NIL) Si (Filevide(F)) F.Tete ← P Sinon Si (X.prio Valeur(F.Tete).prio) alors //insertion au début Aff_adr(F.Tete, P); F.Tete←P Sinon S←L TQ (suivant (S)Nil) et (valeur (suivant (S))≤X.prio) faire S← suivant (S) Si (suivant (S) = Nil) alors //insertion à la fin Aff_adr (S, P); F.Queue ← P Sinon //insertion au milieu Aff_adr(P, suivant (S)), Aff_adr(S, P)
  97. 97. Partie III: Piles
  98. 98. PLAN DE LA PARTIE III Définition Modèle Implémentation Représentation statique Représentation dynamique Utilisation 98
  99. 99. 99 Une pile (en anglais stack) est une structure de données fondée sur le principe « dernier arrivé, premier sorti » (ou LIFO: Last In, First Out) † Les derniers éléments ajoutés à la pile seront les premiers à être récupérés. DÉFINITION Le fonctionnement ressemble à une piles des livres: On ajoute des livres sur la pile, et on les récupère dans l'ordre inverse, en commençant par le dernier ajouté.
  100. 100. 100 Une pile peut être définie comme une collection d'éléments dans laquelle tout nouvel élément est inséré à la fin (empilement) et tout élément ne peut être supprimé que de la fin (dépilement). Les insertions et les suppressions d’éléments se font à une seule et même extrémité de la liste appelée le sommet de la pile. DÉFINITION 12 7 18 3 Sommet Dépilement Empilement
  101. 101. 101 Les opérations habituelles sur les piles sont : Création ou Initialisation de la pile Vérification du contenu de la pile (vide ou pleine) Empilement : ajout d’un élément au sommet de la pile Dépilement : retrait d’un élément du sommet de la pile MODÈLE Opération Rôle CréerPile(P) créer une pile vide Empiler(P,Val) ajouter Val en sommet de pile Dépiler(P,Val) retirer dans Val l'élément en sommet de pile Pilevide(P) tester si la pile est vide Pilepleine(P) tester si la pile est pleine
  102. 102. 102 Les piles peuvent être présentées en deux manières: statique en utilisant les tableaux, dynamique en utilisant les listes linéaires chaînées. IMPLÉMENTATION
  103. 103. 103 L’implémentation statique des piles utilise les tableaux. Dans ce cas, la capacité de la pile est limitée par la taille du tableau (max). L’ajout à la pile se fait dans le sens croissant des indices, tandis que le retrait se fait dans le ses inverse. IMPLÉMENTATION STATIQUE Sommet =5 V5 V4 V3 V2 V1 V0 Dépilement Empilement 0 max-1
  104. 104. 104 IMPLÉMENTATION STATIQUE PAR DÉCALAGE Définition de la structure : TYPE Pile= STRUCTURE Elements : TABLEAU[0..Max-1] de Typeqq Sommet : ENTIER FIN VAR P : Pile Pile Eléments Sommet =5 V5 V4 V3 V2 V1 V0 0 max-1
  105. 105. 105 IMPLÉMENTATION STATIQUE modèle Implémentation Créerpile(P) P.Sommet ← -1 Pilevide(P) Pilevide ← ( P.Sommet = -1) Pilepleine(P) Pilepleine ← (P.Sommet = Max-1) Empiler(P, X) SI NON Pilepleine(P) P.Sommet ← P.Sommet + 1 P.Elements[P.Sommet] ← X Sinon « Overflow » Depiler(P, X) Si NON Pilevide(P) X ← P.Elements [P.Sommet] P.Sommet ← P.Sommet – 1 Sinon « Underflow »
  106. 106. 106 L’implémentation dynamique utilise les listes linéaires chinées. Dans ce cas, la pile peut être vide, mais ne peut être jamais pleine, sauf bien sur en cas d’insuffisance de l’espace mémoire. L’empilement et le dépilement dans les piles dynamique se font à la tête de la liste. Les opérations de base sont : Enfilement : insertion d’un élément à la tête de la LLC Défilement : suppression d’un élément de la tête de la LLC Vérification si la LLC n’est pas vide IMPLÉMENTATION DYNAMIQUE V4 V3 V2 V1 V0 Tête Enpilement Dépilement
  107. 107. 107 IMPLÉMENTATION DYNAMIQUE V4 V3 V2 V0 V1 Tête Définition de la structure : TYPE Element = STRUCTURE val : typeqq suiv: * Element FIN VAR P: *Element Pile
  108. 108. 108 IMPLÉMENTATION DYNAMIQUE Modèle Implémentation Créerpile(P) P ← Nil Pilevide(P) Pilevide ← ( P = Nil) Empiler(P, X) Allouer (Q) Aff_Val(Q, X) Aff_Adr(Q, P) P ← Q Depiler(P, X) Si NON Pilevide(P) X ← Valeur(P) Q ← P P ←Suivant(P) Liberer(Q) Fsi
  109. 109. 109 Appels de fonctions: Quand une fonction est appelée, les paramètres (incluant l’adresse de retour) doivent être passés à la fonction appelante. Si ces paramètres sont sauvegardés dans une mémoire fixe, alors la fonction ne peut pas être appelée récursivement du moment que la première adresse va être écrasée par le deuxième retour d’adresse avant que la première ne soit utilisée. Les piles sont souvent nécessaires pour rendre itératif un algorithme récursif. UTILISATION
  110. 110. 110 Analyse syntaxique : qui est une phase de la compilation qui nécessite une pile. Par exemple, le problème de la reconnaissance des mots entre parenthèses: accepter les mots comme (), ()(()) ou ((()())()) ; rejeter les mots comme )(, ()(() ou ((()()))). Pour le résoudre, on stocke les parenthèses ouvrantes non encore refermées dans une pile de caractères. Autrement dit, on lit caractère par caractère, s’il s’agit d’une parenthèse : ouvrante, elle est empilée ; fermante, la parenthèse ouvrante correspondante est dépilée. Le mot est accepté si la pile est vide lorsque le mot a été lu. UTILISATION
  111. 111. 111 Calcul arithmétique : Une application courante des piles se fait dans le calcul arithmétique: l'ordre dans la pile permet d'éviter l'usage des parenthèses. UTILISATION Notation Format Exemples Infixée <expG> <opérateur> <expD> a + b, a + b * c, (a+b) * c, -a + b Postfixée <expG> <expD> <opérateur> a b +, a bc* +, ab+ c *, a- b + Préfixée <opérateur> <expG> <expD> ex : + a b, + a *bc, * +ab c, + -a b
  112. 112. 112 UTILISATION (CALCUL ARITHMÉTIQUE)  Exercice: 1. Ecrire cette expression en postfixé et préfixé 5 * (((9+8)*(4*6))+7) 2.Pour chaque présentation (postfixé et préfixé) : a.Illustrer l’utilisation de la pile lors de l’évaluation cette expression. b.Donner l’algorithme correspondant.
  113. 113. 113 UTILISATION (CALCUL ARITHMÉTIQUE) Soit à évaluer l’expression postfixé suivante: 598+46**7+* a.empiler(5) b.empiler(9) c.empiler(8) d.empiler( dépiler(9) + dépiler(8) ) e.empiler(4) f.empiler(6) g.empiler( dépiler(4) * dépiler(6) ) h.empiler( dépiler(17) * dépiler(24) ) i.empiler(7) j.empiler( dépiler(408) + dépiler(7) ) k.empiler( dépiler(5) * dépiler(415) ) l.écrire( dépiler(2075) ) 5 5 9 5 9 8 5 17 -a- -b- -c- 5 17 4 5 17 4 6 -d- -e- -f- 5 17 24 5 408 5 408 7 5 415 2075 -g- -h- -i- -j- -k- -l- 2075
  114. 114. 114 UTILISATION (CALCUL ARITHMÉTIQUE) On suppose que l’expression est bien écrite et qu’elle se trouve dans un tableau dont les éléments sont de type : (Valeur, Type).  Exemple: 5 * (((9+8)*(4*6))+7) 0 Opérande 1 Opérateur unaire (~) 2 Opérateur binaire(+, -, *, /, %) (5, 0) (9, 0) (8, 0) (+, 2) (4, 0) (6, 0) (*, 2) (*, 2) (7, 0) …
  115. 115. 115 UTILISATION (CALCUL ARITHMÉTIQUE)  Exemple: 598+46**7+* (5, 0) (9, 0) (8, 0) (+, 2) (4, 0) (6, 0) (*, 2) (*, 2) (7, 0) … Définition de la structure : TYPE terme = STRUCTURE Valeur: chaîne de caractère Type: 0 .. 2 FIN TYPE Pile= STRUCTURE Elements : TABLEAU[0..Max-1] de terme Sommet : ENTIER FIN
  116. 116. 116 UTILISATION (CALCUL ARITHMÉTIQUE) On suppose aussi que la fonction « Calcul (opd1, op, opd2) » permet de retourner le résultat de l’expression calculer opd1 op opd2 Selon op Cas ‘+’: retourner (opd1+opd2) Cas ‘-’: retourner (opd1-opd2) Cas ‘*’: retourner (opd1*opd2) Cas ‘/’: retourner (opd1/opd2) Cas ‘%’: retourner (opd1%opd2) Finselon
  117. 117. 117 Evaluation d'une expression postfixée Si opérande Alors empiler Si opérateur Alors Si opérateur unaire dépiler une fois empiler le résultat Si opérateur binaire Alors dépiler 2 fois empiler le résultat. A la fin : Le résultat final se trouve au sommet de pile UTILISATION (CALCUL ARITHMÉTIQUE)
  118. 118. 118 EVAL_Postfixe( T: Tableau [] de terme, n: entier ) : Reel CreerPile(P); Pour i ← 0 à (n-1) faire Si (T[i].type=0) alors Empiler( P1, T[i]) //opérande Sinon /* donc c'est un opérateur */ Si (T[i].type=1) // moins unaire Depiler(p,y); Empiler( p, Calcul( 0, ‘-’, y.valeur ) ) Sinon /* donc opérateur binaire */ Depiler(p,y); Depiler(p,x); Empiler( p, Calcul( x.valeur, T[i].valeur, y.valeur)) Depiler( p, x ) // le résultat se trouve au sommet Retourner (x.valeur) UTILISATION (CALCUL ARITHMÉTIQUE)
  119. 119. 119 UTILISATION (CALCUL ARITHMÉTIQUE) Soit à évaluer l’expression préfixé suivante : *5+*+98*467 a.empiler(7) b.empiler(6) c.empiler(4) d.empiler( dépiler(4) * dépiler(6) ) e.empiler(8) f.empiler(9) g.empiler( dépiler(9) + dépiler(8) ) h.empiler( dépiler(17) * dépiler(24) ) i.empiler( dépiler(408) + dépiler(7) ) j.empiler(5) k.empiler( dépiler(5) * dépiler(415) ) l.écrire( dépiler(2075) ) 7 7 6 7 6 4 7 24 -a- -b- -c- 7 24 8 7 27 8 9 -d- -e- -f- 7 24 17 7 408 415 415 5 2075 -g- -h- -i- -j- -k- -l- 2075
  120. 120. 120 UTILISATION (CALCUL ARITHMÉTIQUE) EVAL_Postfixe( T: Tableau [] de terme, n: entier ) : Reel CreerPile(P); Pour i ← (n-1) à 0 faire //décrémentation: pas -1 Si (T[i].type=0) alors Empiler( P1, T[i]) //opérande Sinon /* donc c'est un opérateur */ Si (T[i].type=1) // moins unaire Depiler(p,y); Empiler( p, Calcul( 0, ‘-’, y.valeur ) ) Sinon /* donc opérateur binaire */ Depiler(p,y); Depiler(p,x); Empiler( p, Calcul( x.valeur, T[i].valeur, y.valeur)) Depiler( p, x ) // le résultat se trouve au sommet Retourner (x.valeur)
  121. 121. SOURCES DE CE COURS N. EL-ALLIA , Cours d’Algorithmique et Structures de données dynamiques, Ecole nationale Supérieure d’Informatique (ESI), 2010. Djamel Eddine ZEGOUR, Cours de Structures de Données, Ecole nationale Supérieure d’Informatique (ESI), Disponible sur http://zegour.esi.dz/Cours/Cours_sdd.htm B. Boutoumi, , Cours d’Algorithmique et Structures de données, Université Saad Dahlab de Blida, 2014, Disponible sur https://sites.google.com/a/esi.dz/s-aroussi/algorithmique-et-structure-de- donnees/nouveau-programme . A. Djeffal, Cours d’Algorithmique et Structures de données 1, Université Mohamed Khider de Biskra, 2012, Disponible sur univ- biskra.dz/fac/fsesnv/cours/algo 121

×