Witam. Mam problem z sortowaniem listy jednokierunkowej. Mógłby mnie ktoś oświecić co mam źle?
Edit: po poprawkach wydaje mi się, że wszystko działa. Mógłby mi ktoś ewentualnie powiedzieć co można poprawić/ zrobić lepiej?
program dadada;
uses SysUtils,Crt;
type plista=^tlista;
tlista=record
imie:string[15];
indeks:integer;
nast:plista;
end;
var
wyb,i:integer;
pocz,kon:plista;
procedure dodaj (var pocz,kon:plista);
var
nowy:plista;
begin
clrscr;
randomize;
new (nowy);
writeln ('Imie i indeks');
readln (nowy^.imie);
nowy^.indeks:=random (16)+1;
if pocz=nil then begin
pocz:=nowy; kon:=nowy; kon^.nast:=nil; end
else
if pocz<>nil then begin
kon^.nast:=nowy; kon:=nowy; kon^.nast:=nil; end;
writeln ('Gotowe');
end;
procedure wyswietl (pocz,kon:plista);
var
nowy:plista;
begin
clrscr;
nowy:=pocz;
while (nowy<>nil) do begin
writeln (nowy^.imie);
writeln (nowy^.indeks);
writeln ('==========================');
nowy:=nowy^.nast;
end;
if nowy=nil then writeln ('KONIEC');
end;
procedure edytuj (var pocz:plista);
var
i:integer;
n:plista ;
begin
n:=pocz ;
writeln ('ktor element chesz edytowac');
readln (i);
while n<>nil do begin
if n^.indeks=i then begin
readln (n^.imie);
readln (n^.indeks);
end;
n:=n^.nast;
end;
end;
procedure zapis (pocz:plista);
var
plik:textfile;
el:plista;
begin
el:=pocz;
assignfile (plik,'kolejka.txt');
append (plik);
while (el<>nil) do begin
write (plik,'Imie:', 'el^.imie','el^.indeks','||');
el:=el^.nast;
end;
closefile (plik);
writeln ('GOTOWE');
end;
procedure usun_wyb (var pocz,kon:plista);
var
el:plista;
pop,del,temp:plista;
i:integer;
begin
writeln ('jaki indeks chcesz usunac?');
readln (i);
el:=pocz;
while el<>nil do begin
if el^.indeks=i then begin
if (el=pocz) and (el<>nil) then begin
del:=el;
pocz:=el^.nast;
el:=el^.nast;
dispose (del);
end else
if (el=kon) then begin
del:=kon;
kon:=pop;
kon^.nast:=nil;
dispose (del);
end else
if (el^.indeks=i) and (el<>nil) then begin
del:=el;
pop^.nast:=el^.nast;
dispose (del);
el:=el^.nast;
end else
el:=el^.nast;
end;
end;
end;
procedure ilosc (var i:integer);
var
v:plista;
begin
clrscr;
v:=pocz;
i:=0;
while v<>nil do begin
inc (i);
v:=v^.nast;
end;
writeln ('Ilosc elementow ',i);
end;
procedure sortuj (var pocz:plista);
var
min,min2,min3,tmp:tlista;
el,pom,pom2,pom3,w,wmin:plista;
j,o:integer;
begin
el:=pocz;
ilosc (i);
while (el<>nil) do begin
min.imie:=el^.imie;
min.indeks:=el^.indeks;
w:=el^.nast;
while w<>nil do begin
if w^.indeks<min.indeks then begin
min.indeks:=w^.indeks;
min.imie:=w^.imie;
wmin:=w;
end;
w:=w^.nast;
end;
if min.indeks < el^.indeks then begin
tmp.indeks := el^.indeks;
tmp.imie:=el^.imie;
el^.indeks := wmin^.indeks;
el^.imie:=wmin^.imie;
wmin^.indeks:=tmp.indeks;
wmin^.imie:=tmp.imie;
end;
el := el^.nast;
end;
end;
begin
pocz:=nil;
kon:=nil;
repeat
writeln;
writeln;
writeln ('1.Dodaj. 2.Wyswietl. . 4.Sortuj. 6.Usun konkretny. 7. Edytuj. 8. Zapisz.');
readln (wyb);
case (wyb) of
1:dodaj (pocz,kon);
2:wyswietl (pocz,kon);
4:sortuj (pocz);
6:usun_wyb (pocz,kon);
7:edytuj (pocz);
8:zapis (pocz);
end
until (wyb=0);
end.