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

#define MAX_LINE 500
#define RECORDS 1000

struct osoba
{
   char imie[MAX_LINE];
   char nazwisko[MAX_LINE];
   int wiek;
   struct osoba *nastepny;
};

typedef struct osoba OSOBA;

/* Funkcja wczytuje linie tekstu do tablicy znakowej. */
char* czytaj_linie(char *napis, int n)
{
   fgets(napis, n, stdin);
   napis[strlen(napis)-1] = '\0';
   return napis;
}

/* Funkcja zwraca liczbe calkowita wydobyta z linii tekstu podenego na standardowym wejsciu */
int czytaj_liczbe()
{
   char linia[MAX_LINE];
   fgets(linia, MAX_LINE, stdin);
   return atoi(linia);
}

void wypisz(OSOBA o)
{
   printf("%s ", o.imie);
   printf("%s ", o.nazwisko);
   printf("%d", o.wiek);
}

void wczytaj(OSOBA *o)
{
   printf("Imie: ");
   czytaj_linie(o->imie, MAX_LINE);
   printf("Nazwisko: ");
   czytaj_linie(o->nazwisko, MAX_LINE);
   printf("Wiek: ");
   o->wiek = czytaj_liczbe();
}

int menu()
{
   printf("\n1. Wyswietl baze danych\n");
   printf("2. Dodaj rekord\n");
   printf("3. Usun rekord\n");
   printf("4. Edytuj rekord\n");
   printf("5. Zakoncz program\n");
   
   printf("Co wybrac? ");
   return czytaj_liczbe();
}

int main()
{
   OSOBA *baza = NULL;
   OSOBA *tmp, *poprzedni;
   int opt=0, n=0, i, k;
   
   do
   { 
      opt = menu();    
      if( opt == 1 )
      {  
         /* Wypisz baze danych */
         printf("\nIlosc rekordow: %d\n", n);
         for(tmp=baza, i=0; tmp != NULL; tmp=tmp->nastepny, i++)
         {
            printf("[%d] ", i);
            wypisz(*tmp);
            printf("\n");
        }
      }
      if( opt == 2 )
      {
         /* Dodaj rekord */
	  tmp = (OSOBA*)malloc(sizeof(OSOBA));
	  if(tmp != NULL)
          {
              printf("Nowy rekord nr %d:\n", n);
              wczytaj(tmp);
		
	      tmp->nastepny = baza;
	      baza = tmp;

              n = n + 1;
          }else printf("Uwaga: nie moge dodac nowego rekordu\n");
      }
      if( opt == 3 )
      {
         /* Usun rekord */
         printf("Podaj numer rekordu do usuniecia (od 0 do %d): ", n-1);
         k = czytaj_liczbe();
         if ( k>= 0 && k<n )
         {
            for(tmp=baza, i=0; i<k && tmp->nastepny != NULL; tmp=tmp->nastepny, i++) 
	    {
		    poprzedni=tmp;
	    }
            if(tmp == baza) 
	    {
		    baza=tmp->nastepny;
	    }
	    else
	    {
		   poprzedni->nastepny=tmp->nastepny;
	    }
	    free(tmp);
	    n--;
         }
         else
            printf("Uwaga: nie moge usunac rekordu nr %d\n", k);     
      }
      if( opt == 4 )
      {
         /* Edycja rekordu */
         printf("Podaj numer rekordu do edycji (od 0 do %d): ", n-1);
         k = czytaj_liczbe();
         if ( k>= 0 && k< n )
         {

            for(tmp=baza, i=0; i<k && tmp->nastepny != NULL; tmp=tmp->nastepny, i++) 
	    {
		
	    }
            printf("Aktualny rekord nr %d\n", k);
            printf("[%d] ", k);
            wypisz(*tmp);
            printf("\nWprowadz nowe dane:\n");
            wczytaj(tmp);
         }
         else printf("Uwaga: podana zla wartosc %d\n", n);
      }
   }while( opt !=5 );

   
   tmp=baza;
   while(tmp!=NULL) 
   {
	   poprzedni=tmp;
	   tmp=tmp->nastepny;
	   free(poprzedni);
   }

   printf("Do widzenia\n");
   
   return 0;
}
