#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);
}

