TP 5: Add corrections
[Algorithmic_C.git] / TP5 / exo6 / file_chaine_correction.c
diff --git a/TP5/exo6/file_chaine_correction.c b/TP5/exo6/file_chaine_correction.c
new file mode 100644 (file)
index 0000000..f3c3369
--- /dev/null
@@ -0,0 +1,97 @@
+/**************************************************************************
+ 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));
+}
+/********************************************************************/
+