5038a7d31518d80417224b8613ee0aea45b5f432
[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 {
11 int nbre;
12 int taille_tab;
13 element *tab;
14 } Pile;
15
16 Pile pile_vide(void)
17 {
18 Pile p;
19 p.nbre = 0;
20 p.taille_tab = LONG_PILE;
21 p.tab = (element *) calloc(p.taille_tab, sizeof(element));
22 return p;
23 }
24
25 int est_vide(Pile p)
26 {
27 return p.nbre == 0; /* ou return !p.nbre; */
28 }
29
30 element sommet(Pile p)
31 /* ATTENTION: consulter le sommet d'une pile vide n'a pas de sens */
32 {
33 if (est_vide(p)) {
34 printf("Erreur - pile vide\n");
35 exit(-1);
36 }
37 return p.tab[p.nbre - 1];
38 }
39
40 Pile empiler(element e, Pile p)
41 {
42 if (p.nbre == p.taille_tab) {
43 printf("pile pleine %d - on la rallonge!\n", p.taille_tab);
44 p.taille_tab *= 2;
45 p.tab = realloc(p.tab, p.taille_tab * sizeof(element));
46 }
47 p.tab[p.nbre++] = e;
48 return p;
49 }
50
51 Pile depiler(Pile p)
52 /* ATTENTION: supprimer le sommet d'une pile vide n'a pas de sens */
53 {
54 if (est_vide(p)) {
55 printf("Erreur - pile vide\n");
56 exit(-1);
57 }
58 p.nbre--;
59 return p;
60 }
61
62 element depiler2(Pile * p)
63 /* ATTENTION: la pile est modifiée */
64 {
65 /* ATTENTION: dépiler une pile vide n'a pas de sens */ if (est_vide(*p)) {
66 printf("Erreur - pile vide\n");
67 exit(-1);
68 }
69 return p->tab[p->nbre-- - 1];
70 }
71
72 /********************************************************************/
73
74 int main()
75 {
76 Pile p;
77 int i;
78
79 p = pile_vide();
80
81 for (i = 0; i < 20; i++)
82 p = empiler(i, p);
83
84 for (i = 0; i < 25; i++)
85 printf("%d\n", depiler2(&p));
86 }
87
88 /********************************************************************/