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)