/* File: listeman.c */
/* Time-stamp: "2002-05-15 17:25:37 calvanes" */
/* Scopo: creazione di liste a mano */

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

struct nodoLista {
  int info;
  struct nodoLista *next;
};
typedef struct nodoLista NodoLista;
typedef NodoLista *TipoLista;


void StampaLista(TipoLista lis)
  /* Stampa la lista lis.  Versione iterativa. */
{
  while (lis != NULL) {
    printf("%d ", lis->info);
    lis = lis->next;
  }
}  /* StampaLista */


void StampaListaRicorsiva(TipoLista lis)
  /* Stampa la lista lis.  Versione ricorsiva. */
{
  if (lis != NULL) {
    printf("%d ", lis->info);
    StampaListaRicorsiva(lis->next);
  }
}  /* StampaListaRicorsiva */


void StampaListaInvertita(TipoLista lis)
  /* Stampa la lista lis in ordine invertito.  Versione ricorsiva. */
{
  if (lis != NULL) {
    StampaListaInvertita(lis->next);
    printf("%d ", lis->info);
  }
}  /* StampaListaInvertita */


int main (void)
  /* Crea manualmente una lista di tre interi. */
{
  int a, b, c;
  TipoLista lis1, lis2;
  TipoLista aux;

  printf("Inserisci tre interi: ");
  scanf("%d%d%d", &a, &b, &c);

  /* incominciando dal primo elemento */
  lis1 = malloc(sizeof(NodoLista));        /* allocazione del primo elemento */

  lis1->info = a;
  lis1->next = malloc(sizeof(NodoLista));    /* allocazione secondo elemento */

  lis1->next->info = b;
  lis1->next->next = malloc(sizeof(NodoLista));;    /* alloc. terzo elemento */

  lis1->next->next->info = c;
  lis1->next->next->next = NULL;

  /* incominciando dall'ultimo elemento */
  lis2 = NULL;

  aux = malloc(sizeof(NodoLista));       /* allocazione dell'ultimo elemento */
  aux->info = c;
  aux->next = lis2;
  lis2 = aux;

  aux = malloc(sizeof(NodoLista));       /* allocazione dell'ultimo elemento */
  aux->info = b;
  aux->next = lis2;
  lis2 = aux;

  aux = malloc(sizeof(NodoLista));       /* allocazione dell'ultimo elemento */
  aux->info = a;
  aux->next = lis2;
  lis2 = aux;

  printf("Ecco i numeri che hai scritto\n");
  StampaLista(lis1);
  putchar('\n');

  printf("Ecco i numeri che hai scritto (stampa ricorsiva)\n");
  StampaListaRicorsiva(lis2);
  putchar('\n');

  printf("Ecco i numeri che hai scritto (in ordine inverso)\n");
  StampaListaInvertita(lis1);
  putchar('\n');

  return 0;
}