--- /dev/null
+/**************************************************************************
+ Implantation d'un type File d'entiers sous forme chaînée
+
+ La file est représentée par un doublet tête-queue de pointeurs
+ vers une cellule.
+ Le pointeur "tête" contient l'adresse de la tête de la file.
+ Le pointeur "queue" contient l'adresse de la queue de la file.
+
+ La file vide est représentée par le doublet NULL-NULL
+
+ Chaque cellule pointe vers la cellule suivante de la file
+ou vers NULL si on est en queue de file.
+
+**************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef int element;
+typedef struct cellule {element valeur;
+ struct cellule *suivant; } Cellule;
+
+typedef struct file { Cellule *t, *q; } File; /* tête queue */
+
+File file_vide(void)
+{
+ File f={NULL,NULL};
+ return f;
+}
+
+int est_vide(File f)
+{
+ return !f.t;
+}
+
+element tete(File f)
+/* ATTENTION: consulter la tête d'une File vide n'a pas de sens */
+{
+ if (est_vide(f)) {printf("Erreur - file vide\n"); exit(-1); }
+ return f.t->valeur; /* la File n'est pas modifiée */
+}
+
+File enfiler(element e,File f)
+{
+ Cellule *pc=(Cellule *)malloc(sizeof(Cellule));
+ pc->valeur=e;pc->suivant=NULL;
+
+ if (est_vide(f))
+ f.t=f.q=pc; /* la cellule créée est à la fois tête et queue */
+ else
+ f.q=f.q->suivant=pc; /* la cellule créée est la nouvelle queue */
+ return f;
+}
+
+File defiler(File f)
+/* ATTENTION: supprimer la tête d'une File vide n'a pas de sens */
+{
+ Cellule *pc=f.t;
+ if (est_vide(f))
+ {
+ printf("Erreur - file vide\n");
+ exit(-1);
+ }
+ if (f.t==f.q) f=file_vide(); /* la File n'avait plus qu'une seule cellule */
+ else f.t=f.t->suivant; /* la queue ne change pas */
+ free(pc);
+ return f;
+}
+
+element defiler2(File *f) /* ATTENTION: la File est modifiée */
+/* ATTENTION: supprimer la tête d'une File vide n'a pas de sens */
+{
+ Cellule *pc=f->t;
+ element e;
+ if (est_vide(*f))
+ {
+ printf("Erreur - file vide\n");
+ exit(-1);
+ }
+ e=f->t->valeur;
+ if (f->t==f->q) *f=file_vide(); /* la File n'avait plus qu'une seule cellule */
+ else f->t=f->t->suivant; /* la queue ne change pas */
+ free(pc);
+ return e;
+}
+
+
+/********************************************************************/
+int main()
+{
+ File p;
+ int i;
+ p=file_vide();
+ for (i=0; i<20; i++) p=enfiler(i,p);
+ for (i=0; i<25; i++) printf("%d\n",defiler2(&p));
+}
+/********************************************************************/
+