Add TP5 skeleton
[Algorithmic_C.git] / TP5 / exo2 / pile_realloc.c
diff --git a/TP5/exo2/pile_realloc.c b/TP5/exo2/pile_realloc.c
new file mode 100644 (file)
index 0000000..a41cdb7
--- /dev/null
@@ -0,0 +1,65 @@
+/********************************************************************/
+/*           Implantation contiguë d'un type Pile d'entiers         */
+/*           On rallonge le tableau par realloc quand il est plein  */
+/********************************************************************/                 
+#include <stdio.h>
+#include <stdlib.h>
+
+#define LONG_PILE 5
+typedef int element;
+typedef struct {       int        nbre;
+                        int        taille_tab;
+                       element    *tab; } Pile;
+       
+Pile pile_vide(void)
+{Pile p; p.nbre=0; p.taille_tab=LONG_PILE;
+ p.tab=(element *)calloc(p.taille_tab, sizeof(element));
+ return p;
+}
+
+int est_vide(Pile p)
+{return p.nbre==0;             /* ou return !p.nbre; */
+}
+
+element sommet(Pile p)
+/* ATTENTION: consulter le sommet d'une pile vide n'a pas de sens */
+{if (est_vide(p)) { printf("Erreur - pile vide\n"); exit(-1); }
+ return p.tab[p.nbre-1];
+}
+
+Pile empiler(element e,Pile p) 
+{if (p.nbre==p.taille_tab)
+    {printf("pile pleine %d - on la rallonge!\n",p.taille_tab); 
+     p.taille_tab *=2;
+     p.tab=realloc(p.tab, p.taille_tab*sizeof(element));
+    }
+  p.tab[p.nbre++]=e;
+  return p;
+}
+
+Pile depiler(Pile p)
+/* ATTENTION: supprimer le sommet d'une pile vide n'a pas de sens */
+{if (est_vide(p)) { printf("Erreur - pile vide\n"); exit(-1); }
+ p.nbre--;
+ return p;
+}
+
+element depiler2(Pile *p)      /* ATTENTION: la pile est modifiée */
+/* ATTENTION: dépiler une pile vide n'a pas de sens */
+{if (est_vide(*p)) { printf("Erreur - pile vide\n"); exit(-1); }
+ return p->tab[p->nbre-- -1];
+}
+/********************************************************************/ 
+
+int main()
+{Pile p;
+ int i;
+
+ p=pile_vide();
+
+ for (i=0; i<20; i++) p=empiler(i,p);
+
+ for (i=0; i<25; i++) printf("%d\n",depiler2(&p));
+}
+/********************************************************************/ 
+