Refine .gitignore some more.
[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 */
66 if (est_vide(*p)) {
67 printf("Erreur - pile vide\n");
68 exit(-1);
69 }
70 return p->tab[p->nbre-- - 1];
71 }
72
73 /********************************************************************/
74
75 int main()
76 {
77 Pile p;
78 int i;
79
80 p = pile_vide();
81
82 for (i = 0; i < 20; i++)
83 p = empiler(i, p);
84
85 for (i = 0; i < 25; i++)
86 printf("%d\n", depiler2(&p));
87 }
88
89 /********************************************************************/