[Pascal] wytłumaczenie kodu

Czy ktoś może mi wytłumaczyć kod programu (lista samo sortująca), do czego służą poszczególne procedury, do czego służą dane warunki, pętle, zmienne typu: głowa, pomoc itp. z góry bardzo dziekuje

program pLista;

uses Crt;


type

  Wskaznik = ^Element;

  Element = record

              Liczba : integer;

              Wsk : Wskaznik

            end;


const

  Glowa : Wskaznik = nil;


var

   znak: char;

   elem: integer;

   Obecny : Wskaznik;

{

procedure Inicjalizuj;

begin

  Glowa:=nil

end;

 }

procedure UtworzElement(s:integer;Obecny:Wskaznik);

var

  Nowy : Wskaznik;

  k: integer;

begin

  new(Nowy);

  Nowy^.Liczba:=s;

  Nowy^.Wsk:=nil;

    if Nowy^.Liczba > Obecny^.Liczba then

     begin

      Obecny^.Wsk:=Nowy;

     end

    else

     begin

       k:=Nowy^.Liczba;

       Nowy^:=Obecny^;

       Obecny^.Liczba := k;

       Obecny^.Wsk := Nowy;

     end;

 end;


procedure UtworzGlowe(s:integer);

begin

  new(Glowa);

  Glowa^.Liczba:=s;

  Glowa^.Wsk:=nil;

end;


function Szukaj(s:integer):Wskaznik;

var

  Pomoc : Wskaznik;

begin

  Pomoc:=Glowa;

  while (Pomoc^.Liczba < s) and (Pomoc^.Wsk <> nil) do

   begin

    Pomoc:=Pomoc^.Wsk;

   end;

    Szukaj:=Pomoc;

end;


procedure Wstaw(s:integer);

var

  Pomoc,Nowy : Wskaznik;

  i : integer;

begin

  if Glowa = nil then

    UtworzGlowe(s)

  else

    UtworzElement(s,Szukaj(s));

end;


procedure Usun(s:integer);

var Usuwany, Obecny, Tymcz: Wskaznik;

    k: integer;

begin

if Glowa<>nil then

  Obecny:=szukaj(s);

  if Obecny^.Liczba = s then

    begin

       if Obecny = Glowa then

         begin

           if Glowa^.Wsk = nil then

            begin

             Glowa:=nil;

             dispose(Glowa);

            end

           else

            begin

             Usuwany:=Glowa;

             Glowa:=Glowa^.Wsk;

             dispose(Usuwany);

            end;

         end

       else

        begin

         Tymcz:=Glowa;

         while (Tymcz<>Obecny) do

         begin

              k:=Tymcz^.Liczba;

              Tymcz^.Liczba:=Obecny^.Liczba;

              Obecny^.Liczba:=k;

              Tymcz:=Tymcz^.Wsk;

         end;

         Usuwany:=Glowa;

         Glowa:=Glowa^.Wsk;

         dispose(Usuwany);

        end;

    end;

end;

a to link widziałeś? Mi to bardzo pomogło w zrozumieniu tego tematu

dzięki napewno się przyda

A jeżeli chcesz to mam geanilny wykład w pdf mojego profesora z Algorytmów i struktur danych gdzie ten temat jest szczegółowo omówiony.Jak coś to PM.