Witam,
Wystukałem sobie taki oto kod:
program plecakowy_dynamic;
{uses crt;}
type Prekord = ^TRekord;
TRekord = record
cena:integer;
masa:integer;
wartosc:real;
poprzedni:PRekord;
nastepny:PRekord;
end;
var fin:text;
i,ile,cena,masa,skarbow:integer;
wartosc,wplecaku:real;
rekord,poczateklisty,temp,poprzedni,nastepny:PRekord;
begin
{clrscr;}
Assign(fin, 'f:\a\dane.txt');
Reset(fin);
while not eof(fin) do begin
if ile=0 then begin
{wstawiamy pierwszy element listy}
new(rekord);
inc(ile);
read(fin, rekord^.cena);
readln(fin, rekord^.masa);
rekord^.wartosc:=rekord^.cena/rekord^.masa;
rekord^.poprzedni:=nil;
rekord^.nastepny:=nil;
poczateklisty:=rekord;
end
else begin
{wstawiamy elementy kolejne}
read(fin, cena);
readln(fin, masa);
wartosc:=cena/masa;
{jeľeli wstawiany element jest wi©kszy od pierwszego
to wstawiamy go na poczatek}
if poczateklisty^.wartosc < wartosc then begin
nastepny:=poczateklisty;
new(poczateklisty^.poprzedni);
poczateklisty:=poczateklisty^.poprzedni;
poczateklisty^.cena:=cena;
poczateklisty^.masa:=masa;
poczateklisty^.wartosc:=wartosc;
poczateklisty^.poprzedni:=nil;
poczateklisty^.nastepny:=nastepny;
inc(ile);
end
{element jest mniejszy od pierwszego}
else begin
temp:=poczateklisty;
{wyszukujemy elementy listy do wstawienia pobranej wartosci}
repeat
if (temp^.nastepny = nil) then break else temp:=temp^.nastepny;
until (temp^.wartosc <= wartosc);
if temp^.wartosc <= wartosc then temp:=temp^.poprzedni;
poprzedni:=temp;
nastepny:=temp^.nastepny;
new(temp^.nastepny);
temp:=temp^.nastepny;
temp^.cena:=cena;
temp^.masa:=masa;
temp^.wartosc:=wartosc;
temp^.poprzedni:=poprzedni;
temp^.nastepny:=nastepny;
inc(ile);
end;
end;
end;
writeln('zawartosc skarbca:');
temp:=poczateklisty;
ile:=1;
while temp <> nil do begin
write(temp^.wartosc:5:2, ' ', temp^.masa, ' ');
temp:=temp^.nastepny;
if ile mod 7 = 0 then writeln;
inc(ile);
end;
readln;
end.
Mam zamiar rozwiązać problem plecakowy metodą zachłanną i do tego potrzebna jest mi posortowana lista elementó plecaka według ich wartości. Kłopot polega na tym, że niektóre wartości nie są posortowane a ja ni kija nie wiem dlaczego...
Na pewno coś nie gra z adresami podczas sortowania, sprawdziłem 4 początkowe elementy i jest ok.
A może sama idea zastosowania listy dwukierunkowej jest błędna i da się to zrobić prościej? (dane zapisane są w pliku, każdy wiersz zawiera wartość i wagę przedmiotu)