/* 
   Laboratorium Praktyki Programowania  
*/


/* Należ pozostawić definicję tylko jednej ze stałych : */

/* dla nowszych kompilatorów */
#define ANSI

/* dla starszych kompilatorów */
//#define ARM


#ifdef ANSI
#include <iostream>
#include <cstring>
using namespace std;
#endif

#ifdef ARM
#include <iostream.h>
#include <string.h>
#endif


typedef int Elem;

typedef struct lista{
  Elem e;
  struct lista *nast; 
} Lista;

/* wypisz element e*/
void wypisz_elem(Elem e);
/* wypisz elementy od początku listy*/
void wypisz_p(Lista *l);
/* wypisz elementy od końca listy*/
void wypisz_k(Lista *l);
/* zwraca wskaźnik do listy z elementem e wstawionym  na początek listy l */
  Lista* wstaw_p(Lista *l, Elem e);

int main()
{
  int i;
  Lista *l=NULL;
  
  /*wstawia kolejne liczby naturalne na początek listy*/
  for (i=1; i<10; i++)
    l=wstaw_p(l,i);
  cout << "Od poczatku : " << endl;
  wypisz_p(l);
  cout << "Od konca : " << endl;
  wypisz_k(l);
  return 0;
}

/* wypisuje element e*/
void wypisz_elem(Elem e){
  cout << e << endl;
}

/* wypisuje elementy od początku listy*/
void wypisz_p(Lista *l){
  if (l){
    wypisz_elem(l->e);
    wypisz_p(l->nast);
  }
}

/* wypisuje elementy od końca listy*/
void wypisz_k(Lista *l){
  if (l){
    wypisz_k(l->nast);
    wypisz_elem(l->e);
  }
}

/* zwraca wkaźnik do listy z e wstawionym  na początek listy l*/
Lista* wstaw_p(Lista *l, Elem e){
  Lista *pom;
  pom = new Lista;
  pom->e=e;
  pom->nast=l;
  return pom;
}

