#include <iostream>
#include <iomanip>
#include <cstring>
#include <cassert>

struct Punkt
  {
   double x,y;
  };

struct Wezel
  {
   Punkt P;
   char *Nazwa;
   Wezel *Nastepny;
  };

struct Kolejka
  {
   Wezel *Pierwszy;
   Wezel *Ostatni;
  };

void Init(Kolejka &K)
  {
   K.Pierwszy=0;
   K.Ostatni=0;
  }

void Dodaj(Kolejka &K,double x,double y,const char *Nazwa)
  {
   Wezel *Nowy=new Wezel;
   Nowy->P.x=x;
   Nowy->P.y=y;
   int Dlugosc=strlen(Nazwa)+1;
   Nowy->Nazwa=new char[Dlugosc];
   memcpy(Nowy->Nazwa,Nazwa,Dlugosc);
   Nowy->Nastepny=0;
   if(K.Ostatni) K.Ostatni->Nastepny=Nowy;
   else          K.Pierwszy=Nowy;
   K.Ostatni=Nowy;
  }

void Skasuj(Kolejka &K)
  {
   Wezel *Stary=K.Pierwszy;
   assert(Stary);
   K.Pierwszy=Stary->Nastepny;
   if(!K.Pierwszy) K.Ostatni=0;
   delete[] Stary->Nazwa;
   delete Stary;
  }

void Wyczysc(Kolejka &K)
  {
   // while(K.Pierwszy) Skasuj(K);
   while(K.Pierwszy)
     {
      Wezel *Stary=K.Pierwszy;
      K.Pierwszy=Stary->Nastepny;
      delete[] Stary->Nazwa;
      delete Stary;
     }
   K.Ostatni=0;
  }

void Drukuj(const Kolejka &K)
  {
   for(Wezel *i=K.Pierwszy;i;i=i->Nastepny)
     {
      cout<<setw(5)<<i->P.x<<','<<setw(5)<<i->P.y<<' '<<i->Nazwa<<endl;
     }
  }

bool CzyPusta(const Kolejka &K)
  {
   return(!K.Pierwszy);
  }

const char *Pobierz(const Kolejka &K,Punkt &P)
  {
   assert(K.Pierwszy);
   P=K.Pierwszy->P;
   return(K.Pierwszy->Nazwa);
  }

void Pobierz(const Kolejka &K,double &X,double &Y,const char *&Nazwa)
  {
   assert(K.Pierwszy);
   X=K.Pierwszy->P.x;
   Y=K.Pierwszy->P.y;
   Nazwa=K.Pierwszy->Nazwa;
  }

int main()
  {
   Kolejka K;
   Init(K);
   Dodaj(K,0,0,"Abc");
   Dodaj(K,3.5,15.5,"Warszawa");
   Dodaj(K,5.8,23.3,"Krakow");
   if(!CzyPusta(K)) Skasuj(K);
   Drukuj(K);
   Punkt P;
   const char *Nazwa=Pobierz(K,P);
   cout<<"Pierwsze miasto:"<<endl;
   cout<<setw(5)<<P.x<<','<<setw(5)<<P.y<<' '<<Nazwa<<endl;
   double X=0,Y=0;
   Nazwa=0;
   Pobierz(K,X,Y,Nazwa);
   cout<<"Pierwsze miasto:"<<endl;
   cout<<setw(5)<<X<<','<<setw(5)<<Y<<' '<<Nazwa<<endl;

   Wyczysc(K);
   return(0);
  }

