uses crt;

type
  PUzel = ^TUzel;
  TUzel = record
            x : integer;
            next : PUzel;
          end;

function novy_spojak : PUzel;
begin
  novy_spojak := nil;
end;

procedure smaz_prvni(var hlava : PUzel);
var
  p : PUzel;
begin
  if hlava = nil then
  begin
    writeln('Mazes prvni prvek prazdneho spojaku!');
    exit;
  end;

  p := hlava^.next;
  dispose(hlava);
  hlava := p;
end;

procedure pridej_na_zacatek(const x : integer; var hlava : PUzel);
var
  p : PUzel;
begin
  new(p);
  p^.x := x;
  p^.next := hlava;
  hlava := p;
end;

procedure vytiskni_spojak(hlava : PUzel);
begin
  while hlava <> nil do
  begin
    write(hlava^.x, ' ');
    hlava := hlava^.next;
  end;

  writeln;
end;

procedure obrat_spojak(var hlava : PUzel);
var
  obraceny, p : PUzel;
begin
  obraceny := nil;

  while hlava <> nil do
  begin
    p := hlava^.next;
    hlava^.next := obraceny;
    obraceny := hlava;
    hlava := p;
  end;

  hlava := obraceny;
end;

var
  s : PUzel;
begin
  { s je ted prazdny spojak }
  s := nil;

  { pridame nejake prvky }
  pridej_na_zacatek(10, s);
  pridej_na_zacatek(4, s);
  pridej_na_zacatek(7, s);
  pridej_na_zacatek(8, s);
  pridej_na_zacatek(9, s);

  { vytiskneme, umazeme, vytiskneme znovu...}
  vytiskni_spojak(s);
  smaz_prvni(s);
  vytiskni_spojak(s);
end.

