Zadanie zaliczeniowe nr 10 (2 trymestr), 19 II 2003

Kazda permutacja sklada sie z jednego lub wiecej
rozlacznych cykli, np. permutacja liczb od 1 do 6
postaci 4 2 6 1 3 5 ma trzy cykle: <1,4> <2> <3,6,5>.

Permutacje ciagu liczb calkowitych mozemy reprezentowac
korzystajac z deklaracji:

type lista=^wezel;
     wezel=record
             wart:integer;
             nast:lista
           end;
     permutacja=^wperm;
     wperm=record
             cykl:lista;
             nast:permutacja;
           end

Permutacja bedzie przechowywana jako lista cykli a
cykle jako listy cykliczne liczb calkowitych.

Napisz program, ktory wczyta ze standardowego wejscia
permutacje liczb 1..n (stalej n nie znamy) i wypisze
na standardowe wyjscie permutacje odwrotna do niej,
tzn. majaca odwrocona kolejnosc elementow w cyklach.

Program glowny powinien miec postac:

var memStart:longint;
    p1,p2:permutacja;
begin
  memStart:=memAvail;
  p1:=wczytaj;
  if p1=nil then
    writeln('Bledne dane')
  else begin
    p2:=odwrotna(p1);
    writeln('Permutacja dana:');
    wypisz(p1);
    usun(p1);
    writeln('Permutacja odwrotna:');
    wypisz(p2);
    usun(p2)
  end;
  if memStart<>memAvail then
    writeln('Program niepoprawny')
end.

Zakladamy, ze permutacja dana i wynikowa beda zapisane jako
ciag cykli, z ktorych kazdy bedzie opisany ciagiem liczb
znajdujacych sie w cyklu i konczacym sie liczba, od ktorej
rozpoczelismy. Np. permutacja wymieniona na poczatku
tresci zadania moglaby byc zapisana tak: 1 4 1 2 2 3 6 5 3
a permutacja do niej odwrotna: 1 4 1 2 2 3 5 6 3

Uwaga: program powinien sprawdzac poprawnosc danych wejsciowych.