# include <stdio.h>
# include <stdlib.h>

struct cellule {
  int k;
  struct cellule * suiv ;
};

typedef struct cellule* liste;

liste vide(){
  return NULL;
}

int est_vide(liste l){
  return l==vide();
}

liste cons(int n, liste l){
  liste res= malloc(sizeof(struct cellule));
  res->k = n;
  res->suiv = l;
  return res;
}

void afficher_it(liste l){
  int i=0;
  while(0==est_vide(l)){
    printf("%d",l->k);
    l=l->suiv;
  }  printf("\n");
}

void afficher_rec(liste l){
  if(1==est_vide(l));
  else{
    printf("%d",l->k);
    afficher_rec(l->suiv);
  }
}
liste libere_cons ( liste l ) {
  liste res=l->suiv;
  free ( l ) ; 
  return res ;
}

void libere_liste (liste l) {
  while(!est_vide(l)){
    l=libere_cons (l);
  }
  printf("C'est libre");
}

liste miroir_rec(liste l,liste ll){
  if(est_vide(l)){
    return ll;
  }
  else{
    ll=cons(l->k,ll);
    return miroir_rec(l->suiv,ll);
  }
}

liste miroir_it(liste l){
  if(est_vide(l)){
    return l;
  }
  liste ll=vide();
  while(!est_vide(l)){
    ll=cons(l->k,ll);
    l=l->suiv;
  }
  return ll;
}

int main (int argc, char** argv){
  liste l = cons(1,cons(2,cons(3,NULL)));
  afficher_rec(l); printf("\n");
  afficher_it(l);
  afficher_rec(miroir_it(l));
  afficher_rec(miroir_rec(l,NULL));
}

