Vous êtes sur la page 1sur 3

Sofia Douda

LES FILES
Une file est une liste linaire o toutes les insertions dlments auront lieu une extrmit appele fin, toutes les extractions auront lieu lautre extrmit appel debut.

Les lments dune file sont extraits dans lordre de leur insertion. Ils suivent la loi FIFO (First In First Out). Le premier entr est le premier sorti. file vide debut= 0; Insertion fin = fin + 1 ; Extraction debut=debut+ 1 ; File pleine fin maxf Exemple : - File devant un guichet de scolarit - File devant un guichet automatique Organisation interne dune file Nous construisons les fonctions suivantes : Initialiser qui construit la file vide F. Insrer qui insre llment x la file F si la file nest pas pleine Extraire qui extrait le sommet x de la file F si la file nest pas vide. Nous appellerons element le type des lments de la file et deb et fin lindice ou ladresse indiquant respectivement le premier rang et le dernier rang de la file. Reprsentation dune file par un tableau : Nous dfinissons un type prdfini FIL comme une structure quatre champs : un tableau o sont rangs les lments insrs, deux variables deb et fin dont les valeurs respectives sont les indices du premier lment et du dernier lment de la file et, pour faciliter le traitement, une troisime variable long dont la valeur est le nombre dlments de la file. Nous avons donc les dclarations suivantes : #define maxf 20 typedef char element; // si on suppose qu'on va manipuler des caractres typedef struct { element T[maxf]; int deb, fin; int longueur ; }FIL ; Dans une file, les ajouts se font en queue et les extractions en tte. Puisquon range les lments dans un tableau, si lon ne prend pas de prcautions, on risque trs vite de ne plus pouvoir ajouter des lments en queue par manque de place, mme dans le cas o des places ont t libres en tte au cours des extractions. Pour pallier cet inconvnient, on peut utiliser un tableau dune dimension suffisamment grande, mais dune part il est difficile de prvoir cette dimension et dautre part le nombre de cases du tableau utilises chaque tape risque dtre faible par rapport la dimension du tableau : par exemple, si les insertions et les extractions squilibrent, la file, restant
LST GI : Cours sur les Files en C Anne 2010/2011

Sofia Douda

peu prs de mme longueur, va parcourir tout le tableau puis se bloquer la fin comme le montre la figure suivante :

Pour exploiter le tableau dune manire conomique, on va donc dfinir et utiliser ce quon appelle une gestion circulaire comme dans la figure suivante :

Nous prsentons les fonctions suivantes qui servent manipuler une file. void extraire (FIL &F, element &x) { if (F.longueur==0) printf("File vide\n"); else { x=F.T[F.deb]; F.deb= (F.deb+1)%maxf; F.longueur=F.longueur-1; } } void inserer (FIL& F, element x) { if (F.longueur==maxf-1) printf("File pleine\n"); else { F.T[F.fin]=x; F.fin= (F.fin+1) % maxf; F.longueur=F.longueur+1; }

int file_vide(FIL F) { if (F.longueur==0) return(1); return(0); }

int file_pleine(FIL F) { if (F.longueur==maxf-1) return(1); return(0); }

void initialiser(FIL &F) { F.deb=0 ; F.fin=0 ; F.longueur=0 ; }

LST GI : Cours sur les Files en C

Anne 2010/2011

Sofia Douda

Reprsentation dune file par une lise chane On va utiliser une liste chaine dont le premier nud pointe par deb contiendra le premier lment de la liste et le dernier nud point par fin contiendra le dernier lment de la liste.

Nous avons les dclarations et les fonctions suivantes : #define char element typedef struct nud *fliste ; typedef struct { element elem; pliste suivant; } nud ; typedef struct { fliste deb ; fliste fin ; }FIL ;

void initialiser (FIL &F) { F.deb=NULL ; F.fin=NULL ; }

void inserer(FIL &F, element x) { fliste q ; q=(fliste)malloc(sizeof(nud)) ; if (q==NULL) printf(pas despace mmoire); else { q->elem=x ; q->suivant=NULL ; /* Dans le cas o lon a affaire une file vide, il faut faire pointer non seulement fin, mais aussi deb, sur le nouveau element.*/ if (F.fin==NULL) F.deb=q; else F.fin->suivant=q; F.fin=q ; } }

void extraire (FIL &F, element &x) { If ((F.fin==NULL) && (F.deb==NULL)) printf(File vide\n); else { x=F.deb->elem ; q=F.deb ; F.deb=F.deb->suivant; /* Dans le cas o lon obtient une file vide, il faut mettre galement le pointeur fin NULL.*/ if (F.deb==NULL) F.fin=NULL; free(q); } }

LST GI : Cours sur les Files en C

Anne 2010/2011