Add TP5 skeleton
[Algorithmic_C.git] / TP5 / exo2 / pile_realloc.c
1 /********************************************************************/
2 /* Implantation contiguë d'un type Pile d'entiers */
3 /* On rallonge le tableau par realloc quand il est plein */
4 /********************************************************************/
5 #include <stdio.h>
6 #include <stdlib.h>
7
8 #define LONG_PILE 5
9 typedef int element;
10 typedef struct { int nbre;
11 int taille_tab;
12 element *tab; } Pile;
13
14 Pile pile_vide(void)
15 {Pile p; p.nbre=0; p.taille_tab=LONG_PILE;
16 p.tab=(element *)calloc(p.taille_tab, sizeof(element));
17 return p;
18 }
19
20 int est_vide(Pile p)
21 {return p.nbre==0; /* ou return !p.nbre; */
22 }
23
24 element sommet(Pile p)
25 /* ATTENTION: consulter le sommet d'une pile vide n'a pas de sens */
26 {if (est_vide(p)) { printf("Erreur - pile vide\n"); exit(-1); }
27 return p.tab[p.nbre-1];
28 }
29
30 Pile empiler(element e,Pile p)
31 {if (p.nbre==p.taille_tab)
32 {printf("pile pleine %d - on la rallonge!\n",p.taille_tab);
33 p.taille_tab *=2;
34 p.tab=realloc(p.tab, p.taille_tab*sizeof(element));
35 }
36 p.tab[p.nbre++]=e;
37 return p;
38 }
39
40 Pile depiler(Pile p)
41 /* ATTENTION: supprimer le sommet d'une pile vide n'a pas de sens */
42 {if (est_vide(p)) { printf("Erreur - pile vide\n"); exit(-1); }
43 p.nbre--;
44 return p;
45 }
46
47 element depiler2(Pile *p) /* ATTENTION: la pile est modifiée */
48 /* ATTENTION: dépiler une pile vide n'a pas de sens */
49 {if (est_vide(*p)) { printf("Erreur - pile vide\n"); exit(-1); }
50 return p->tab[p->nbre-- -1];
51 }
52 /********************************************************************/
53
54 int main()
55 {Pile p;
56 int i;
57
58 p=pile_vide();
59
60 for (i=0; i<20; i++) p=empiler(i,p);
61
62 for (i=0; i<25; i++) printf("%d\n",depiler2(&p));
63 }
64 /********************************************************************/
65