Zadatak 1
Napisati procedure za dodavanje elementa na početak jednostruko povezane liste, kao i za brisanje elementa sa početka. U glavnom programu učitati listu u obrnutom poretku, ispisati prvi i poslednji element liste i obrisati listu.
program zad1; type pok =^slog; slog = record vrednost :integer; sledeci :pok; end; procedure push(var vrh :pok; x :integer); var p :pok; begin new(p); p^.vrednost := x; p^.sledeci := vrh; vrh := p; end; procedure pop(var vrh :pok; var x :integer); var p :pok; begin if vrh = nil then x := -1; p := vrh; x := vrh^.vrednost; vrh := vrh^.sledeci; dispose(p); end; var s :pok; x,n,i:integer; begin readln(n); for i := 1 to n do begin readln(x); push(s, x); end; for i := 1 to n do begin pop(s, x); if (i = 1) or (i = n) then writeln(x); end; end
Zadatak 2
Napisati proceduru za dodavanje elementa na kraj dvostruko povezane liste. U glavnom programu učitati jednu dvostruko povezanu listu, ispisati njene elemente i obrisati listu.
program zad2; type pokelement = ^element; element = record vr :integer; sl :pokelement; pr :pokelement; end; function dodaj(p :pokelement; n :integer) :pokelement; var pom1, pom2 :pokelement; begin if p = nil then begin new(p); p^.vr := n; p^.sl := nil; p^.pr := nil; end else begin pom1 := p; while pom1^.sl <> nil do begin pom2 := pom1; pom1 := pom1^.sl; end; new(pom1^.sl); pom1 := pom1^.sl; pom1^.vr := n; pom1^.sl := nil; pom1^.pr := pom2; end; dodaj := p; end; procedure stampaj(p :pokelement); var pom :pokelement; begin pom := p; if p <> NIL then begin repeat write(pom^.vr,' '); pom:=pom^.sl; until pom = NIL; writeln; end else writeln('Lista je prazna.'); writeln; end; var n,i,x: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('Unesite broj koji hocete da dodate na kraj liste: '); read(x); glava := dodaj(glava, x); writeln('Kreirana lista je: '); stampaj( glava ); end
1. Deklaracija funkcije
function dodaj(p: pokelement; n: integer): pokelement;
p
: Pokazivač na prvi čvor liste. Ako je lista prazna,p
jenil
.n
: Vrednost tipainteger
koju želimo da dodamo u listu.- Funkcija vraća pokazivač na prvi čvor liste nakon dodavanja novog elementa.
2. Deklaracija pomoćnih promenljivih
var pom1, pom2: pokelement;
pom1
: Privremena promenljiva koja se koristi za iteraciju kroz listu.pom2
: Privremena promenljiva koja se koristi za čuvanje pokazivača na prethodni čvor tokom iteracije.
3. Provera da li je lista prazna
if p = nil then
begin
new(p);
p^.vr := n;
p^.sl := nil;
p^.pr := nil;
end
- Ako je
p = nil
, lista je prazna:- Kreira se novi čvor pomoću
new(p)
. p^.vr := n
: Dodeljuje se vrednost novog čvora.p^.sl := nil
ip^.pr := nil
: Novi čvor nema ni sledeći ni prethodni element, jer je jedini u listi.
- Kreira se novi čvor pomoću
4. Ako lista nije prazna
else
begin
pom1 := p;
while pom1^.sl <> nil do
begin
pom2 := pom1;
pom1 := pom1^.sl;
end;
- Ako lista nije prazna:
pom1 := p;
: Iteracija kroz listu počinje od prvog čvora.while pom1^.sl <> nil
: Petlja ide do poslednjeg čvora (dokpom1^.sl
nijenil
).pom2 := pom1;
:pom2
čuva trenutni čvor kao prethodni čvor za budući novi element.
5. Dodavanje novog elementa na kraj liste
new(pom1^.sl);
pom1 := pom1^.sl;
pom1^.vr := n;
pom1^.sl := nil;
pom1^.pr := pom2;
new(pom1^.sl);
: Kreira se novi čvor na kraju liste.pom1 := pom1^.sl;
:pom1
sada pokazuje na novokreirani čvor.pom1^.vr := n;
: Dodeljuje se vrednost novom čvoru.pom1^.sl := nil;
: Novi čvor nema sledeći element, jer je poslednji.pom1^.pr := pom2;
: Pokazivač na prethodni element postavlja se na poslednji čvor pre dodavanja.
6. Vraćanje pokazivača na početak liste
dodaj := p;
- Funkcija vraća pokazivač na prvi čvor liste (
p
), koji nije promenjen.
Zadatak 3
Napisati program koji učitava niz karaktera koji se sastoji od otvorenih i zatvorenih, malih, srednjih i velikih zagrada i proverava da li su zagrade korektno zapisane u unetom nizu.
ideja je da kad naidje na otvorenu zagradu stavi je na vrh novog steka
a kad naidje na zatvorenu zagradu proverava da li je na vrhu otvorena zagrada koja odgovara toj, a ukoliko se to ne desi onda prekida proceduru i ispisuje nij
u slucaju da je to tacno brise tu zagradu iz steka
na kraju proverava da li je stek prazan jer ako nije onda je ostala zagrada koja nema svog para
program zad3; type stek=^slog; slog=record vr:char; sl:stek; end; procedure pop(var vrh:stek); var p:stek; begin if vrh=nil then exit; p:=vrh; vrh:=vrh^.sl; dispose(p); end; procedure push(var vrh:stek; x :char); var p:stek; begin new(p); p^.vr:=x; p^.sl:=vrh; vrh:=p; end; procedure TacneZagrade(str :string); var noviStek :stek; x :char; i :integer; begin noviStek := nil; for i := 1 to length(str) do begin if (str[i] = '(') or (str[i] = '{') or (str[i] = '[') then push(noviStek, str[i]) else if (str[i] = ')') or (str[i] = '}') or (str[i] = ']') then begin if (noviStek = nil) then begin writeln('Nije'); exit; end; x := noviStek^.vr; pop(noviStek); if ((str[i] = ')') and (x <> '(')) or ((str[i] = '}') and (x <> '{')) or ((str[i] = ']') and (x <> '[')) then begin writeln('Nije'); exit; end; end; end; if noviStek = nil then writeln('Jeste') else writeln('Nije'); end; var str :string; begin readln(str); TacneZagrade(str) end.
1. Ulazni parametar
procedure TacneZagrade(str: string);
str
: Ulazni string koji sadrži zagrade koje treba proveriti.
2. Deklaracija pomoćnih promenljivih
var noviStek: stek;
x: char;
i: integer;
noviStek
: Pomoćni stek koji se koristi za praćenje otvarajućih zagrada.x
: Privremena promenljiva koja čuva vrednost skinutu sa steka.i
: Brojač za iteraciju kroz string.
3. Inicijalizacija steka
noviStek := nil;
- Stek je inicijalno prazan jer još nisu obrađene zagrade.
4. Iteracija kroz string
for i := 1 to length(str) do
- Iterira kroz svaki karakter u stringu
str
.
5. Provera otvarajućih zagrada
if (str[i] = '(') or (str[i] = '{') or (str[i] = '[') then
push(noviStek, str[i]);
- Ako je trenutni karakter otvarajuća zagrada
(
,{
, ili[
, dodaje se na stek pomoću funkcijepush
.
6. Provera zatvarajućih zagrada
if (str[i] = ')') or (str[i] = '}') or (str[i] = ']') the
- Ako je trenutni karakter zatvarajuća zagrada
)
,}
, ili]
, radi se sledeće:
-
- Provera da li je stek prazan
if (noviStek = nil) then
begin
writeln('Nije');
exit;
end;
-
-
- Ako je stek prazan, to znači da nema odgovarajuće otvarajuće zagrade, pa je string neispravan. Ispisuje
Nije
i završava izvršavanje.
- Ako je stek prazan, to znači da nema odgovarajuće otvarajuće zagrade, pa je string neispravan. Ispisuje
-
-
- Skidanje poslednje otvarajuće zagrade
x := noviStek^.vr;
pop(noviStek);
-
-
- Skida se poslednja otvarajuća zagrada sa steka pomoću
pop
i čuva se u promenljivojx
.
- Skida se poslednja otvarajuća zagrada sa steka pomoću
- Provera da li se zagrade podudaraju
-
if ((str[i] = ')') and (x <> '(')) or ((str[i] = '}') and (x <> '{')) or ((str[i] = ']') and (x <> '[')) then
begin
writeln('Nije');
exit;
end;
-
- Proverava se da li se trenutna zatvarajuća zagrada
str[i]
podudara sa otvarajućom zagradomx
:)
mora da odgovara(
.}
mora da odgovara{
.]
mora da odgovara[
.
- Ako se ne podudaraju, string je neispravan. Ispisuje
Nije
i završava izvršavanje.
- Proverava se da li se trenutna zatvarajuća zagrada
7. Provera steka nakon obrade svih zagrada
if noviStek = nil then
writeln('Jeste')
else
writeln('Nije');
- Ako je stek prazan nakon obrade svih karaktera u stringu, sve otvarajuće zagrade su uparene i string je ispravan. Ispisuje
Jeste
. - Ako stek nije prazan, ostale su neparne otvarajuće zagrade, pa string nije ispravan. Ispisuje
Nije
.
Zadatak 4
Napisati proceduru za sortiranje elemenata jednostruko povezane liste u rastućem poretku. U glavnom programu učitati listu u obrnutom poretku, sortirati je, ispisati elemente sortirane liste i obrisati listu.
ideja je da napravimo novi stek gde smestamo elemente po sortiranom redosledu
da bi nam izbacivao u rastucem redosledu veci elementi moraju da idu na dno
da bi nam elementi isli na dno moramo sve prethodne elemente da vratimo u pocetni stek (ostace sortirani jer ih ubacujemo redom) i da kada naidjemo na elementi od kojeg trenutni nije veci smestimo taj element i krenemo da vracamo elemente iz starog steka onoliko puta koliko smo ih vratili nazad (tome sluzi brojac)
da bi sortirali u opadajucem poretku samo treba promeniti:
while (noviStek <> nil) and (x > noviStek^.vr) do u
while (noviStek <> nil) and (x < noviStek^.vr) do
program zad4; type stek=^slog; slog=record vr:integer; sl:stek; end; procedure push(var vrh:stek; x :integer); var p:stek; begin new(p); p^.vr:=x; p^.sl:=vrh; vrh:=p; end; procedure pop(var vrh:stek; var x :integer); var p:stek; begin if vrh=nil then begin x:=-1; exit; end; p:=vrh; x := vrh^.vr; vrh:=vrh^.sl; dispose(p); end; function sortiraj(vrh :stek) :stek; var noviStek :stek; x, y, i, brojac :integer; begin noviStek := nil; while vrh <> nil do begin pop(vrh, x); brojac := 0; while (noviStek <> nil) and (x > noviStek^.vr) do begin pop(noviStek, y); push(vrh, y); inc(brojac); end; push(noviStek, x); for i := 1 to brojac do begin pop(vrh, y); push(noviStek, y); end; end; sortiraj := noviStek; end; var i, x, n :integer; s :stek; begin s:=nil; readln(n); for i := 1 to n do begin readln(x); push(s, x); end; s := sortiraj(s); writeln; for i := 1 to n do begin pop(s, x); writeln(x); end; end.
1. Deklaracija funkcije i promenljivih
function sortiraj(vrh: stek): stek;
var noviStek: stek;
x, y, i, brojac: integer;
vrh
: Pokazivač na prvi čvor početnog steka koji treba da bude sortiran.noviStek
: Pomoćni stek u koji će se postepeno smestiti sortirani elementi.x
,y
: Privremene promenljive za skladištenje vrednosti tokom operacija sa stekom.i
,brojac
: Brojači za iteraciju i praćenje broja pomerenih elemenata prilikom svakog ubacivanja elementa unoviStek
.
2. Inicijalizacija pomoćnog steka
noviStek := nil;
noviStek
je inicijalno prazan, jer će u njega biti smeštani sortirani elementi.
3. Glavna petlja (dokle god stek nije prazan)
while vrh <> nil do
begin
pop(vrh, x);
brojac := 0;
- Ova petlja se ponavlja dokle god stek
vrh
nije prazan. pop(vrh, x)
: Skida vrh stekavrh
i smešta njegovu vrednost u promenljivux
.brojac := 0;
: Postavlja se brojčanik za praćenje broja pomerenih elemenata.
4. Unutrašnja petlja za premještanje elemenata u stek dok se ne nađe odgovarajuće mesto za x
while (noviStek <> nil) and (x > noviStek^.vr) do
begin
pop(noviStek, y);
push(vrh, y);
inc(brojac);
end;
(noviStek <> nil) and (x > noviStek^.vr)
: Dokle godnoviStek
nije prazan i dok je trenutna vrednostx
veća od vrhanoviStek
:- Skida se element
y
sanoviStek
i smešta se uvrh
. inc(brojac)
: Povećava se brojčanik za pomerene elemente.
- Skida se element
- Ova petlja omogućava da se premeste svi elementi sa
noviStek
koji su manji odx
uvrh
, sve dok se ne nađe odgovarajuće mesto zax
unoviStek
.
5. Ubacivanje elementa x
u noviStek
push(noviStek, x);
- Nakon što je pronađeno odgovarajuće mesto,
x
se stavlja na vrhnoviStek
.
6. Vraćanje pomerenih elemenata nazad u noviStek
for i := 1 to brojac do
begin
pop(vrh, y);
push(noviStek, y);
end
- Ova petlja vraća sve elemente koje smo prethodno premestili iz
noviStek
nazad unoviStek
, čime se obezbeđuje da redosled elemenata bude očuvan, ali i dalje sortiran.
7. Vraćanje sortirane liste
sortiraj := noviStek;
- Na kraju, funkcija vraća
noviStek
, koji sada sadrži sve elemente iz originalnog steka, ali sortirane.
Zadatak 6
Napisati funkciju koja izračunava zbir elemenata na parnim pozicijama date linearne liste. U glavnom programu, učitati elemente liste (u obrnutom poretku) ispisati zbir elemenata na parnim pozicijama i obrisati listu.
program zad6č type stek=^slog; slog=record vr:integer; sl:stek; end; procedure push(var vrh:stek; x :integer); var p:stek; begin new(p); p^.vr:=x; p^.sl:=vrh; vrh:=p; end; procedure pop(var vrh:stek; var x :integer); var p:stek; begin if vrh=nil then begin x:=-1; exit; end; p:=vrh; x := vrh^.vr; vrh:=vrh^.sl; dispose(p); end; procedure zbirParnih(var s :stek; n :integer); var zbir, x, i :integer; begin zbir := 0; for i := 1 to n do begin pop(s, x); if i mod 2 = 0 then zbir := zbir + x; end; writeln(zbir); end; var i, x, n :integer; s :stek; begin s:=nil; readln(n); for i := 1 to n do begin readln(x); push(s, x); end; zbirParnih(s, n); end.
1. Inicijalizacija promenljivih
zbir := 0;
zbir
je promenljiva koja čuva zbir parnih brojeva na parnim pozicijama.
2. Prolazak kroz stek
i := 1 to n do
begin
pop(s, x);
if i mod 2 = 0 then
zbir := zbir + x;
end;
for i := 1 to n do
: Petlja se pokreće n puta, gden
označava broj elemenata koje treba obraditi u steku.pop(s, x)
: Funkcijapop
uklanja gornji element iz stekas
i dodeljuje njegovu vrednost promenljivojx
.if i mod 2 = 0 then zbir := zbir + x;
: Ako je pozicijai
parna (kroz uslovi mod 2 = 0
), vrednostx
(koja predstavlja element sa steka) se dodaje uzbir
.
3. Ispis rezultata
writeln(zbir);
- Na kraju,
writeln(zbir)
ispisuje zbir parnih brojeva sa parnih pozicija.
Zadatak 7
Napisati funkciju koja izbacuje sve elemente liste koji su prosti brojevi.
program zad7; type stek=^slog; slog=record vr:integer; sl:stek; end; function prostBroj(x :integer) :boolean; var i :integer; begin if x <= 1 then begin prostBroj := False; exit; end; for i := 2 to x-1 do begin if x mod i = 0 then begin prostBroj := False; exit; end; end; prostBroj := True; end; procedure push(var vrh:stek; x :integer); var p:stek; begin new(p); p^.vr:=x; p^.sl:=vrh; vrh:=p; end; procedure pop(var vrh:stek; var x :integer); var p:stek; begin if vrh=nil then begin x:=-1; exit; end; p:=vrh; x := vrh^.vr; vrh:=vrh^.sl; dispose(p); end; function izabciProste(var s :stek; n :integer) :stek; var i, x :integer; r :boolean; stekBezProstih :stek; begin stekBezProstih := nil; for i := 1 to n do begin pop(s, x); r := prostBroj(x); if r = False then push(stekBezProstih, x) end; izabciProste := stekBezProstih; end; var i, x, n :integer; s :stek; begin s:=nil; readln(n); for i := 1 to n do begin readln(x); push(s, x); end; s := izabciProste(s, n); while s <> nil do begin pop(s, x); writeln(x); end; end.
1. Inicijalizacija
stekBezProstih := nil;
stekBezProstih
: Novi stek u koji ćemo smeštati sve brojeve koji nisu prosti.
2. Petlja za prolazak kroz stek
for i := 1 to n do
begin
pop(s, x);
r := prostBroj(x);
if r = False then
push(stekBezProstih, x);
end;
for i := 1 to n do
: Petlja prolazi kroz sve elemente steka.n
označava ukupan broj elemenata u steku.pop(s, x)
: Skidamo element sa vrha originalnog stekas
i smeštamo njegovu vrednost u promenljivux
.r := prostBroj(x)
: Poziv funkcijeprostBroj
, koja proverava da li je brojx
prost. Rezultat je logička vrednost:True
(prost broj) iliFalse
(nije prost).if r = False then push(stekBezProstih, x);
: Ako brojx
nije prost, dodajemo ga u novi stekstekBezProstih
.
3. Vraćanje rezultata
izabciProste := stekBezProstih;
- Na kraju, funkcija vraća
stekBezProstih
, koji sadrži samo neproste brojeve.
Zadatak 8
Napisati funkciju koja testerasto uređuje datu linearnu listu.
(Testerasto uređivanje linearne liste podrazumeva transformaciju elemenata liste tako da se raspoređuju u obrascu “manje-veće-manje-veće” ili “veće-manje-veće-manje”)
Prolazi kroz elemente liste po indeksima.
Ako si na neparnom mestu u listi (prvi, treći, peti element itd.):
Proveri da li je trenutni broj manji od prethodnog. Ako jeste, zameni mesta ta dva broja.
Ako si na parnom mestu u listi (drugi, četvrti, šesti element itd.):
Proveri da li je trenutni broj veći od prethodnog. Ako jeste, zameni mesta ta dva broja.
program zad8; type pokelement = ^element; element = record vr :integer; sl :pokelement; pr :pokelement; end; function dodaj(p :pokelement; n :integer) :pokelement; var pom1, pom2 :pokelement; begin if p = nil then begin new(p); p^.vr := n; p^.sl := nil; p^.pr := nil; end else begin pom1 := p; while pom1^.sl <> nil do begin pom2 := pom1; pom1 := pom1^.sl; end; new(pom1^.sl); pom1 := pom1^.sl; pom1^.vr := n; pom1^.sl := nil; pom1^.pr := pom2; end; dodaj := p; end; function napraviTesterasto(p: pokelement): pokelement; var pom: pokelement; index, pomVrednost: integer; begin if p = nil then begin napraviTesterasto := nil; Exit; end; pom := p; index := 0; while pom^.sl <> nil do begin if (index mod 2 = 0) and (pom^.vr > pom^.sl^.vr) then begin pomVrednost := pom^.vr; pom^.vr := pom^.sl^.vr; pom^.sl^.vr := pomVrednost; end else if (index mod 2 = 1) and (pom^.vr < pom^.sl^.vr) then begin pomVrednost := pom^.vr; pom^.vr := pom^.sl^.vr; pom^.sl^.vr := pomVrednost; end; pom := pom^.sl; inc(index); end; napraviTesterasto := p; end; procedure stampaj(p :pokelement); var pom :pokelement; begin pom := p; if p <> NIL then begin repeat write(pom^.vr,' '); pom:=pom^.sl; until pom = NIL; writeln; end else writeln('Lista je prazna.'); writeln; end; var n,i,x: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; glava := napraviTesterasto(glava); writeln('Kreirana lista je: '); stampaj( glava ); end.
1. Prazna lista
if p = nil then
begin
napraviTesterasto := nil;
Exit;
end;
- Ako je ulazna lista prazna (
p = nil
), funkcija odmah vraćanil
, jer nema elemenata za preuređivanje.
2. Inicijalizacija promenljivih
pom := p;
index := 0;
pom
pokazuje na trenutni element liste tokom prolaska kroz listu.index
prati indeks trenutnog elementa (paran ili neparan).
3. Prolazak kroz listu
while pom^.sl <> nil do
begin
...
pom := pom^.sl;
inc(index);
end;
- Petlja se izvršava dok postoji sledeći element u listi (
pom^.sl <> nil
). - Na kraju svake iteracije, prelazimo na sledeći element u listi (
pom := pom^.sl
) i povećavamo indeks (inc(index)
).
4. Provera i zamena vrednosti
Unutar petlje se proverava da li trenutni i sledeći element ispunjavaju uslove za “testerasti” niz.
Za parne pozicije (index mod 2 = 0):
if (index mod 2 = 0) and (pom^.vr > pom^.sl^.vr) then
begin
pomVrednost := pom^.vr;
pom^.vr := pom^.sl^.vr;
pom^.sl^.vr := pomVrednost;
end;
- Ako je trenutni indeks paran (
index mod 2 = 0
) i trenutna vrednost (pom^.vr
) veća od sledeće vrednosti (pom^.sl^.vr
), zamene se vrednosti ova dva elementa.
Za neparne pozicije (index mod 2 = 1):
if (index mod 2 = 1) and (pom^.vr < pom^.sl^.vr) then
begin
pomVrednost := pom^.vr;
pom^.vr := pom^.sl^.vr;
pom^.sl^.vr := pomVrednost;
end;
- Ako je trenutni indeks neparan (
index mod 2 = 1
) i trenutna vrednost (pom^.vr
) manja od sledeće vrednosti (pom^.sl^.vr
), vrednosti se zamene.
5. Vraćanje rezultata
napraviTesterasto := p;
- Na kraju funkcija vraća pokazivač na početak liste, koja je sada preuređena u “testerasti” niz.
Sortiranje dvostruko povezane liste
program SortirajListu; type pokelement =^element; element = record podatak :integer; sledeci, pr :pokelement; end; function dodaj(p :pokelement; n :integer) :pokelement; var pom1, pom2 :pokelement; begin if p = nil then begin new(p); p^.podatak := n; p^.sledeci := nil; p^.pr := nil; end else begin pom1 := p; while pom1^.sledeci <> nil do begin pom2 := pom1; pom1 := pom1^.sledeci; end; new(pom1^.sledeci); pom1 := pom1^.sledeci; pom1^.podatak := n; pom1^.sledeci := nil; pom1^.pr := pom2; 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; novi^.pr := nil; 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; novi^.pr := trenutni; 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.
1. Inicijalizacija nove sortirane liste
sortirano := NIL;
- Kreira se prazna lista
sortirano
u koju će se dodavati elementi ulazne listep
, sortirani po veličini.
2. Prolazak kroz ulaznu listu
while p <> NIL do
- Petlja prolazi kroz sve elemente ulazne liste
p
. - Svaki element se uklanja iz ulazne liste i premešta u odgovarajuću poziciju u sortiranoj listi.
3. Premeštanje trenutnog elementa
novi := p;
p := p^.sledeci;
novi
je trenutni element liste koji se trenutno obrađuje.- Uklanja se iz ulazne liste tako što se pokazivač
p
preusmeri na sledeći element.
4. Dodavanje elementa u sortiranu listu
Postoje dva slučaja za dodavanje elementa:
a) Dodavanje elementa na početak sortirane liste
if (sortirano = NIL) or (novi^.podatak <= sortirano^.podatak) then
begin
novi^.sledeci := sortirano;
novi^.pr := nil;
sortirano := novi;
end;
- Ako je lista
sortirano
prazna (sortirano = NIL
) ili je vrednost trenutnog elementanovi^.podatak
manja ili jednaka vrednosti prvog elementa sortirane liste (sortirano^.podatak
), element se dodaje na početak. - Podešavanja:
novi^.sledeci
pokazuje na trenutni prvi element listesortirano
.novi^.pr
se postavlja nanil
, jer je element na početku.sortirano
sada pokazuje nanovi
, jer je on postao prvi element.
b) Dodavanje elementa na odgovarajuću poziciju u sredini ili na kraju
trenutni := sortirano;
while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak) do
trenutni := trenutni^.sledeci;
novi^.sledeci := trenutni^.sledeci;
novi^.pr := trenutni;
trenutni^.sledeci := novi;
- Ako
novi
ne ide na početak, traži se odgovarajuća pozicija u sortiranoj listi:- Pokazivač
trenutni
započinje od početka listesortirano
. - Petlja traži mesto gde vrednost trenutnog sledećeg elementa (
trenutni^.sledeci^.podatak
) postaje veća ili jednaka vrednostinovi^.podatak
.
- Pokazivač
- Kada se pronađe odgovarajuće mesto:
novi^.sledeci
pokazuje na trenutnog sledećeg elementa (trenutni^.sledeci
).novi^.pr
pokazuje na trenutni element (trenutni
).trenutni^.sledeci
pokazuje nanovi
, umetnuvši ga na odgovarajuće mesto.
5. Vraćanje sortirane liste
sortirajListu := sortirano;
- Nakon obrade svih elemenata, funkcija vraća pokazivač na početak sortirane liste.