TP5: properly indent more C files
[Algorithmic_C.git] / TP5 / exo_c5 / pile_chaine_correction.c
1 /*******************************************************************************
2 Implantation d'un type Pile d'entiers sous forme chaînée
3 La pile est représentée par un pointeur.
4 La pile vide est représentée par NULL.
5 *******************************************************************************/
6 #include<stdio.h>
7 #include<stdlib.h>
8
9 typedef int element;
10
11 typedef struct cellule {
12 element valeur;
13 struct cellule *suivant;
14 } Cellule, *Pile;
15
16 Pile pile_vide(void)
17 {
18 return NULL;
19 }
20
21 int est_vide(Pile p)
22 {
23 return (p == NULL); /* ou return !p; */
24 }
25
26 element sommet(Pile p)
27 /* ATTENTION: consulter le sommet d'une pile vide n'a pas de sens */
28 {
29 if (est_vide(p)) {
30 printf("Erreur - pile vide\n");
31 exit(-1);
32 }
33 return p->valeur; /* la pile n'est pas modifiée */
34 }
35
36 Pile empiler(element e, Pile p)
37 {
38 Cellule *pc = (Cellule *) malloc(sizeof(Cellule));
39 pc->valeur = e;
40 pc->suivant = p;
41 return pc;
42 }
43
44 Pile depiler(Pile p)
45 /* ATTENTION: supprimer le sommet d'une pile vide n'a pas de sens */
46 {
47 Cellule *pc = p;
48 if (est_vide(p)) {
49 printf("Erreur - pile vide\n");
50 exit(-1);
51 }
52 p = p->suivant;
53 free(pc);
54 return p;
55 }
56
57 element depiler2(Pile * p)
58 {
59 /* ATTENTION: la pile est modifiée */
60 /* ATTENTION: cette opération n'a pas de sens avec une pile vide */
61 Cellule *pc = *p;
62 element e;
63 if (est_vide(*p)) {
64 printf("Erreur - pile vide\n");
65 exit(-1);
66 }
67 e = (*p)->valeur;
68 *p = (*p)->suivant;
69 free(pc);
70 return e;
71 }
72
73 /******************************************************************************/
74 int main()
75 {
76 Pile p;
77 int i;
78 p = pile_vide();
79 for (i = 0; i < 20; i++)
80 p = empiler(i, p);
81 for (i = 0; i < 25; i++)
82 printf("%d\n", depiler2(&p));
83 }
84
85 /********************************************************************/