program SortirajListu; type pokelement =^element; element = record podatak :integer; sledeci :pokelement; end; function dodaj(p :pokelement; n :integer) :pokelement; var pom :pokelement; begin if p = nil then begin new(p); p^.podatak := n; p^.sledeci := nil; end else begin pom := p; while pom^.sledeci <> nil do pom := pom^.sledeci; new(pom^.sledeci); pom := pom^.sledeci; pom^.podatak := n; pom^.sledeci := nil; end; dodaj := p; end; procedure stampaj_listu( p:pokelement ); var pom:pokelement; begin pom := p; if p <> NIL then begin repeat write(pom^.podatak,' '); pom:=pom^.sledeci; until pom = NIL; writeln; end else writeln('Lista je prazna.'); writeln; end; function sortirajListu(p: pokelement): pokelement; var sortirano, trenutni, novi: pokelement; begin sortirano := NIL; while p <> NIL do begin novi := p; p := p^.sledeci; if (sortirano = NIL) or (novi^.podatak <= sortirano^.podatak) then begin novi^.sledeci := sortirano; sortirano := novi; end else begin trenutni := sortirano; while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak) do trenutni := trenutni^.sledeci; novi^.sledeci := trenutni^.sledeci; trenutni^.sledeci := novi; end; end; sortirajListu := sortirano; end; var x, i, n :integer; glava :pokelement; begin glava := nil; writeln('Unesi broj elemenata u listi:'); readln(n); for i:=1 to n do begin writeln('Unesi ',i,'. element:'); readln(x); glava := dodaj(glava, x); end; writeln('Kreirana lista pre sortiranja je:'); stampaj_listu( glava ); writeln; glava := sortirajListu(glava); writeln('Kreirana lista posle sortiranja je:'); stampaj_listu(glava); end.
Kako funkcioniše
1. Inicijalizacija pokazivača
sortirano := NIL;
sortirano
je pokazivač na sortirani deo liste. Početno je postavljen naNIL
jer lista još nije sortirana.
2. Prolazak kroz nesortirani deo liste
while p <> NIL do
- Petlja
while p <> NIL
se koristi da bi se prolazilo kroz nesortirani deo liste.p
pokazuje na trenutni nesortirani element liste.
3. Uzimanje trenutnog elementa za sortiranje
novi := p;
p := p^.sledeci;
novi := p
: Čuvamo trenutni elementp
koji će biti umetnut u sortirani deo.p := p^.sledeci
: Pomera se na sledeći element nesortiranog dela liste.
4. Umetanje u prazan ili već sortirani deo liste
if (sortirano = NIL) or (novi^.podatak <= sortirano^.podatak) then
begin
novi^.sledeci := sortirano;
sortirano := novi;
end
- Ako je sortirani deo liste prazan (
sortirano = NIL
) ili ako je podatak trenutnog elementanovi^.podatak
manji ili jednak prvom elementu u sortiranoj listi (novi^.podatak <= sortirano^.podatak
), umetnemonovi
na početak sortirane liste. novi^.sledeci := sortirano
povezuje novi element sa trenutnim prvim elementom sortirane liste.sortirano := novi
pomera pokazivač na novi prvi element sortirane liste.
5. Umetanje u sredinu ili kraj liste
trenutni := sortirano;
while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak) do
trenutni := trenutni^.sledeci;
novi^.sledeci := trenutni^.sledeci;
trenutni^.sledeci := novi;
- Ako novi element treba da se umetne u sredinu ili kraj liste, tražimo odgovarajuće mesto:
trenutni := sortirano
inicijalizuje pomoćni pokazivač na početak sortirane liste.while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak)
: Petlja prolazi kroz sortiranu listu dok ne pronađe mesto gde jenovi^.podatak
manji ili jednak sledećem elementu.novi^.sledeci := trenutni^.sledeci
: Novi element se povezuje sa sledećim elementom trenutnog elementa.trenutni^.sledeci := novi
: Povezujemo trenutni element sa novim elementom, efektivno ga umetnuvši u listu.
6. Vraćanje početnog pokazivača
sortirajListu := sortirano;
- Na kraju funkcije, vraćamo početni pokazivač
sortirano
, koji sada pokazuje na početak sortirane liste.
Nemate pojma zalim se na uslugu.
Nemoj begaš plati pare