e4e562c1a64fec0e0e228e31755296e03bb80383
[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 {
31 printf("Erreur - pile vide\n");
32 exit(-1);
33 }
34 return p->valeur; /* la pile n'est pas modifiée */
35 }
36
37 Pile empiler(element e,Pile p)
38 {
39 Cellule * pc=(Cellule *)malloc(sizeof(Cellule));
40 pc->valeur=e;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 {
50 printf("Erreur - pile vide\n");
51 exit(-1);
52 }
53 p=p->suivant;
54 free(pc);
55 return p;
56 }
57
58 element depiler2(Pile * p) /*ATTENTION: la pile est modifiée */
59 /* ATTENTION: cette opération n'a pas de sens avec une pile vide */
60 {
61 Cellule *pc=*p;
62 element e;
63 if (est_vide(*p))
64 {
65 printf("Erreur - pile vide\n");
66 exit(-1);
67 }
68 e=(*p)->valeur;
69 *p=(*p)->suivant;
70 free(pc);
71 return e;
72 }
73
74
75 /******************************************************************************/
76 int main()
77 {Pile p;
78 int i;
79 p=pile_vide();
80 for (i=0; i<20; i++) p=empiler(i,p);
81 for (i=0; i<25; i++) printf("%d\n",depiler2(&p));
82 }
83 /********************************************************************/
84