TP 5: Add corrections
[Algorithmic_C.git] / TP5 / exo5 / pile_chaine_correction.c
CommitLineData
f5904379
JB
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
9typedef int element;
10
11typedef struct cellule {
12 element valeur;
13 struct cellule *suivant;
14} Cellule, *Pile;
15
16Pile pile_vide(void)
17{
18 return NULL;
19}
20
21int est_vide(Pile p)
22{
23 return (p==NULL); /* ou return !p; */
24}
25
26element 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
37Pile 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
44Pile 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
58element 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/******************************************************************************/
76int 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