Sorting linked lists in Pascal
- by user3712174
I'm doing my final project for Informatics class and I can't get my sorting procedure to work. Have a look at my program, specifically the bolded part (some things are in Croatian. - if you need something translated, let me know):
type pokazivac=^slog;
slog=record
prezime_ime:string[30];
redni_broj:string[2];
fakultet:string[50];
bodovi:integer;
sljedeci:pokazivac;
end;
var pocetni, trenutni, prethodni:pokazivac;
i:integer;
procedure racunaj;
var i,a,c:integer;
b,d,e,f,g,h,j:real;
begin
write('Postotak bodova (u decimalnom zapisu) koje ucenik ostvaruje na temelju prosjeka ocjena - ');
readln(e);
e:=e*1000/4;
write('Prosjek ocjena u prvom razredu : ');
readln(f);
f:=f/5*e;
write('Prosjek ocjena u drugom razredu : ');
readln(g);
g:=g/5*e;
write('Prosjek ocjena u trecem razredu : ');
readln(h);
h:=h/5*e;
write('Prosjek ocjena u cetvrtom razredu : ');
readln(j);
j:=j/5*e;
d:=f+g+h+j;
write('Broj predmeta (ne racunajuci hrvatski jezik, strani jezik i matematiku) koju je ucenik/ca polagao na maturi - ');
readln(a);
write('Postotak rijesnosti ispita iz hrvatskog jezika te zatim maksimum bodova koje je ucenik/ca mogao ostvariti - ');
readln(b);
readln(c);
d:=d+b*c;
write('Postotak rijesnosti ispita iz stranog jezika te zatim maksimum bodova koje je ucenik/ca mogao ostvariti - ');
readln(b);
readln(c);
d:=d+(b*c);
write('Postotak rijesnosti ispita iz matematike te zatim maksimum bodova koje je ucenik/ca mogao ostvariti - ');
readln(b);
readln(c);
d:=d+(b*c);
for i:=1 to a do
begin
writeln('Postotak rijesnosti dodatnog predmeta te zatim maksimum bodova koje je ucenik/ca mogao ostvariti - ');
readln(b);
readln(c);
d:=d+(b*c);
end;
d:=round(d);
writeln('Vas broj bodova je: ', d:4:2);
write('Za nastavak pritisnite ENTER..');
readln;
end;
procedure unos;
begin
new(trenutni);
write('Redni broj ucenika - ');readln(trenutni^.redni_broj);
write('Prezime i ime - ');readln(trenutni^.prezime_ime);
write('Naziv fakultet - ');readln(trenutni^.fakultet);
write('Bodovi - ');readln(trenutni^.bodovi);
trenutni^.sljedeci:=pocetni;
pocetni:=trenutni;
end;
procedure ispis;
begin
writeln();
writeln('Lista popisanih ucenika:');
writeln();
trenutni:=pocetni;
while trenutni<>NIL do
begin
with trenutni^do
begin
writeln('IME: ',prezime_ime);
writeln('FAKULTET: ',fakultet);
writeln('BODOVI: ',bodovi);
writeln();
end;
trenutni:=trenutni^.sljedeci;
end;
writeln();
write('Za nastavak pritisnite ENTER..');
readln;
end;
procedure brisi;
var s:string;
begin
trenutni:= pocetni;
prethodni:=pocetni;
write('Redni broj ucenika kojeg zelite izbrisati - ');
readln(s);
while trenutni<>NIL do
begin
if trenutni^.redni_broj=s then
begin
prethodni^.sljedeci:=trenutni^.sljedeci;
dispose(trenutni);
break;
end;
trenutni:=trenutni^.sljedeci;
end;
end;
procedure izmjeni;
var s:string;
begin
trenutni:=pocetni;
write('Redni broj ucenika cije podatke zelite izmijeniti - ');
readln(s);
while trenutni<> NIL do
begin
if trenutni^.redni_broj=s then
begin
write(trenutni^.prezime_ime, ' - '); readln(trenutni^.prezime_ime);
write(trenutni^.fakultet, ' - '); readln(trenutni^.fakultet);
write(trenutni^.bodovi, ' - '); readln(trenutni^.bodovi);
break;
end;
trenutni:=trenutni^.sljedeci;
end;
end;
**procedure sortiraj;
var t1,t2,t:pokazivac;
begin
t1:=pocetni;
while t1 <> NIL do
begin
t2:=t1^.sljedeci;
while t2<>NIL do
if t2^.bodovi<t1^.bodovi then
begin
new(t);
t^.redni_broj:=t1^.redni_broj;
t^.prezime_ime:=t1^.prezime_ime;
t^.fakultet:=t1^.fakultet;
t^.bodovi:=t1^.bodovi;
t1^.redni_broj:=t2^.redni_broj;
t1^.prezime_ime:=t2^.prezime_ime;
t1^.fakultet:=t2^.fakultet;
t1^.bodovi:=t2^.bodovi;
t2^.redni_broj:=t^.redni_broj;
t2^.prezime_ime:=t^.prezime_ime;
t2^.fakultet:=t^.fakultet;
t2^.bodovi:=t^.bodovi;
dispose(t);
end;
t2:=t2^.sljedeci;
end;
t1:=t1^.sljedeci;
write('Za nastavak pritisnite ENTER..');
readln;
end;**
begin
pocetni:=NIL;
trenutni:=NIL;
writeln('******************************************');
writeln('**********DOBRODOSLI U FAX-O-MAT**********');
writeln('******************************************');
repeat
writeln('1 - Racunaj broj bodova');
writeln('2 - Dodaj ucenika');
writeln('3 - Brisi ucenika');
writeln('4 - Ispis liste');
writeln('5 - Izmjeni podatke');
writeln('6 - Sortiraj listu prema broju bodova');
writeln('0 - Kraj');
readln(i);
case i of
1:racunaj;
2:unos;
3:brisi;
4:ispis;
5:izmjeni;
6:sortiraj;
end;
until i=0;
end.
Either it crashes with a fatal error, or when I press the number 6, nothing happens. The pointer keeps blinking and I can't enter any more numbers.