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.