Vous êtes sur la page 1sur 29

Les Files

1
Les files
Une file est une liste dans laquelle toutes les insertions se font en queue et toutes les
suppressions se font en tête : une file a une structure FIFO.
L’accès à un élément quelconque se fait après le retrait (défilement) de tous les
éléments qui le précède.

Les files sont très utilisées en informatique :


• Traitement des transactions : réservation des billets,…
• Allocation des ressources
• Appels téléphoniques
• ……..

Opérations sur les files :


 Ajouter (enfiler ) un élément : l’action consistant à ajouter un nouvel élément et
le mettre au dernier
 Supprimer (défiler) un élément : l’action consistant à retirer le premier élément
 Consultation : consulter le premier élément de la file
 Tester si la file est vide ou non

2
Représentation des files en mémoire
On peut représenter ou implémenter les files en mémoire de façon :

 Contiguë

tete Queue

50 -5 12 111

 Chaînée
Queue
tete
800
300
50 -5 12 111

600 500 800 nil

3
1- Représentation chaînée
 Déclaration
Type File= enregistrement Type File : ^Cellule ;
info :<type_elt> ; Type Cellule : Enregistrement
svt : ^File ; info: <type_elt> ;
Fing ; svt : File ;
variable Fing ;
L : ^File ; variable
L : File ;

Remarque: pour ne pas avoir à parcourir toute la liste au moment d’ajouter un


élément en queue, on maintient un pointeur sur le dernier élément.
Queue
tete
800
300
50 -5 12 111

600 500 800 nil

4
Représentation chaînée
 Tester si la file est vide
Fonction file_vide(E/ tete: file) : booléen
Début
Si (tetet = nil) alors retourne vrai ;
sinon retourne faux ;
Fsi ;
Fin ;
Queue
tete
800
300
50 -5 12 111

100 500 800 nil

tete Queue
nil nil

5
Représentation chaînée
 Consulter l’élément se trouvant en tête de file

Fonction premier_element(E/ tete : file) : <type_ele>


Début
Retourne (tete^.info) ;
Fin ;
50

Queue
tete
800
300
50 -5 12 111

100 500 800 nil

Queue
Fich2 tete
800
300
Fich2 Fich1 Fich3

100 800 nil


6
Enfiler : Ajout d’un élément
Procédure Enfiler(ES/ tete, Queue : File, E/ e :<Type_elt>)
Début
nouv : File;

Allouer(nouv) ;
si (nouv ≠nil) alors nouv ^.info ← e ;
nouv ^.svt ← nil ;

si (tete ≠ nil) alors Queue^.svt ← nouv ;


sinon tete ← nouv ;
Fsi ;
Queue ← nouv ;
sinon écrire(« mémoire pleine »);
Fsi ; tete Queue
Fin ; nil
700 nil
700 nouv
700

Fich1

nil 7
Enfiler : Ajout d’un élément
Procédure Enfiler(ES/ tete, Queue : File, E/ e :<Type_elt>)
Début
nouv : File
Allouer(nouv) ;
si (nouv ≠nil) alors nouv ^.info ← e ;
nouv ^.svt ← nil ;

si (tete ≠ nil) alors Queue^.svt ← nouv ;


sinon tete ← nouv ;
Fsi ;
Queue ← nouv ;
sinon écrire(« mémoire pleine »);
Fsi ;
tete Queue Queue Queue
Fin ; nil 700 200 nouv 900 nouv
700
200 900

Fich1 Fich2 Fich3

nil
200 nil
900 nil
8
Défiler : suppression d’un élément
Procédure défiler(ES/ tete, Queue : File, S/ e :<Type_elt>)
Début
temp : File ; (* le test si la file est vide se fait dans le prog principal *)

e ← premier_element(tete) ; (* e ← tete^.info *)
temp ← tete ;
tete ← tete^.svt ;
Libérer(temp) ;
Si(tete=nil) alors Queue ← nil ; Fsi;
Fin ;

e Fich1
tete temp tete Queue
700 700 300 900

Fich1 Fich2 Fich3

300 900 nil


9
Défiler : suppression d’un élément
Procédure défiler(ES/ tete, Queue : File, S/ e :<Type_elt>)
Début
tmp : File ; (* le test si la file est vide se fait dans le prog principal *)

e ← premier_element(tete) ; (* e ← tete^.info *)
tmp ← tete ;
tete ← tete^.svt ;
Libérer(tmp) ;
Si(tete=nil) alors Queue ← nil ; Fsi;
Fin ;

e
tete tmp tete Queue
Fich2
300 300 900 900

Fich2 Fich3

900 nil
10
Défiler : suppression d’un élément
Procédure défiler(ES/ tete, Queue : File, S/ e :<Type_elt>)
Début
tmp : File ; (* le test si la file est vide se fait dans le prog principal *)

e ← premier_element(tete) ; (* e ← tete^.info *)
tmp ← tete ;
tete ← tete^.svt ;
Libérer(tmp) ;
Si(tete=nil) alors Queue ← nil ; Fsi;
Fin ;
e

Fich3
tete Queue tmp tete

900 900 900 nil


nil

Fich3

nil
11
2- Représentation contigüe
 Déclaration
On peut représenter une file par un tableau alloué d’une manière
statique. On peut choisir le triplet suivant : (T, Tete, nb_elt) pour
manipuler cette file.
Constante max _tab 100 ;
Type File = Enregistrement
T : tableau [max_tab] <Type_Elt> ;
Tete : entier ;
nb_elt : entier ;
Fing ;
f : File ;

tete max_tab
nb_elt
1 10
4

50 -5 12 111

12
2- Représentation contigüe
 Initialisation
Fonction InitFile ( ) : File
Constante max _tab 100 ;
Var Type File = Enregistrement
f : File ; T : tableau [max_tab] <Type_Elt> ;
Début Tete : entier ;
nb_elt : entier ;
f.Tete ← 1; Fing ;
f.nb_elt ← 0;
Retourner (f); f : File ;
Fin

f.nb_elt f.Tete max_tab


0 1 10

13
2- Représentation contigüe
 Consulter l’élément se trouvant en tête de file

Fonction premier_element (E/ f : File) : <TypeElt>


Début
retourner (f.T[f.Tete]) ;
Fin
f.Tete f.nb_elt max_tab 50
1 4 10

50 -5 12 111

f.Tete f.nb_elt max_tab Fich3


1 3 10

Fich3 Fich2 Fich1


14
2- Représentation contigüe
 Tester si la file est vide

Fonction FileVide (E/ f : File) : booléen


Debut
Si (f.nb_elt =0) alors retourner (vrai) ;
sinon retourner (faux) ;
fsi ;
Fin ;

f.nb_elt f.Tete max_tab


4 1 10

50 -5 12 111

15
2- Représentation contigüe
 Tester si la file est pleine

Fonction FilePleine (E/ f : File) : booléen


Début
si (f.nb_elt = max_tab) alors retourner (vrai) ;
sinon retourner (faux) ;
fsi ;
Fin ;

f.nb_elt f.Tete
10 1

50 -5 12 111 5 88 -12 77 100 90

16
Défiler : suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début

e ← f.t[f.tete];
Si(f.Tete = max_tab alors f.Tete ← 1;
sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e
Fin ; 50
max_tab
5
f.nb_elt f.Tete
45 21

50 -5 12 111 99

17
Défiler : suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e ← f.t[indice]; indice
e
Fin ; -5 2
max_tab
5
f.nb_elt f.Tete
34 32

50 -5 12 111 99
18
Défiler : suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e ← f.t[indice]; indice
e
Fin ; 12 3
max_tab
5
f.nb_elt f.Tete
23 43

50 -5 12 111 99
19
Défiler : suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e ← f.t[indice]; indice
e
Fin ; 111 4
max_tab
5
f.nb_elt f.Tete
21 4
5

50 -5 12 111 99
20
Défiler : suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e ← f.t[indice]; indice
e
Fin ; 99 5
max_tab
5
f.nb_elt f.Tete
10 5
1

50 -5 12 111 99
21
Enfiler : Ajout d’un élément
Procédure Enfiler (ES/ f: File, E/ e : <TypeElt>)
Début (* Tester si la file est pleine dans le PP avant l’appel de cette action *)
indice : entier ;
Si(f.tete + f.nb_elt) > max_tab
alors+ f.nb_elt
indice ← ((f.Tete indice ←– f.tete1) mod + f.nb_elt
max_tab)- max_tab;
+ 1;
sinon indice ← f.tete + f.nb_elt;
Fsi;

f.T[indice] ← e;
f.nb_elt ← f.nb_elt + 1;
Fin e indice max_tab
25 8 10
f.nb_elt f.Tete
87 1

50 -5 12 111 0 56 -40 25
22
Enfiler : Ajout d’un élément
Procédure Enfiler (ES/ f: File, E/ e : <TypeElt>)
Début
indice : entier ;

Indice ← ((f.Tete + f.nb_elt – 1) mod max_tab) + 1;


f.T[indice] ← e;
f.nb_elt ← f.nb_elt + 1;
Fin

e indice max_tab
-33 9 10
f.nb_elt f.Tete
98 1

50 -5 12 111 0 56 -40 25 -33

23
Enfiler : Ajout d’un élément
Procédure Enfiler (ES/ f: File, E/ e : <TypeElt>)
Début
indice : entier ;

Indice ← ((f.Tete + f.nb_elt – 1) mod max_tab) + 1;


f.T[indice] ← e;
f.nb_elt ← f.nb_elt + 1;
Fin

e indice max_tab
201 10 10
f.nb_elt f.Tete
9
10 1

50 -5 12 111 0 56 -40 25 -33 201

24
Défiler : Suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e <- f.t[indice];
Fin ; e indice max_tab
50 1 10
f.nb_elt f.Tete
10
9 21

50 -5 12 111 0 56 -40 25 -33 201

25
Enfiler : Ajout d’un élément
Procédure Enfiler (ES/ f: File, E/ e : <TypeElt>)
Début
indice : entier ;

Indice ← ((f.Tete + f.nb_elt – 1) mod max_tab) + 1;


f.T[indice] ← e;
f.nb_elt ← f.nb_elt + 1;
Fin

e indice max_tab
66 1 10
f.nb_elt f.Tete
9
10 2

50
66 -5 12 111 0 56 -40 25 -33 201

26
Défiler : Suppression d’un élément
Procédure défiler(ES/ f : File, S/ e :<Type_elt>)
Début
indice : entier ;
indice ← f.Tete; (* sauvegarder le rang du 1 elt *)
er

Si(f.Tete = max_tab alors f.Tete ← 1;


sinon f.Tete ← f.Tete +1;
Fsi;
f.nb_elt ← f.nb_elt - 1;
e ← f.t[indice];
Fin ; e indice max_tab
-5 2 10
f.nb_elt f.Tete
10
9 32

50
66 -5 12 111 0 56 -40 25 -33 201

27
Enfiler : Ajout d’un élément
Procédure Enfiler (ES/ f: File, E/ e : <TypeElt>)
Début
indice : entier ;

Indice ← ((f.Tete + f.nb_elt – 1) mod max_tab) + 1;


f.T[indice] ← e;
f.nb_elt ← f.nb_elt + 1;
Fin

e indice max_tab
99 2 10
f.nb_elt f.Tete
9
10 3

50
66 -5
99 12 111 0 56 -40 25 -33 201

28
FIN

29

Vous aimerez peut-être aussi