lifo.c
#include <stdlib.h>
#include <stdio.h>
/* Les définitions de listes utiles pour gérer une pile */
typedef struct s_maillon *p_maillon_t;
typedef p_maillon_t liste_t;
typedef liste_t *p_liste_t;
typedef struct s_maillon
{
int valeur;
liste_t suivant;
} maillon_t;
liste_t nil()
{
return NULL;
}
liste_t cons(int val, liste_t liste)
{
liste_t tete = malloc(sizeof(maillon_t));
tete->valeur = val;
tete->suivant = liste;
return tete;
}
int car(liste_t liste)
{
if(liste == nil()) {
printf("Le car d'une liste vide, c'est pas terrible !!\n");
exit(1);
}
return liste->valeur;
}
liste_t cdr(liste_t liste)
{
if(liste == nil()) {
printf("Le cdr d'une liste vide... disons vide par convention !\n");
return(nil());
}
return liste->suivant;
}
typedef liste_t pile_t;
pile_t newLIFO()
{
return nil();
}
void push(pile_t *pile, int valeur)
{
*pile = cons(valeur,*pile);
}
int pop(pile_t *pile)
{
int valeur;
p_maillon_t head;
if(pile==NULL) {
printf("Ceci n'est pas une pile !!\n");
exit(1);
}
if (*pile==NULL) { /* la pile est vide... */
printf("On essaie d'extraire un élément d'une pile vide !!\n");
exit(1);
} else {
valeur = car(*pile);
head = *pile;
*pile=cdr(*pile);
free(head);
return(valeur);
}
}
int main()
{
pile_t my_pile=newLIFO();
int i,j;
for(i=0;i<10;i++) {
push(&my_pile, i);
}
for(i=0;i<10;i++) {
j=pop(&my_pile);
printf("%d\n",j);
}
for(i=0;i<10;i++) {
push(&my_pile, i);
}
for(i=0;i<11;i++) {
j=pop(&my_pile);
printf("%d\n",j);
}
return 0;
}
Generated by GNU enscript 1.6.2.