Delphi Sortowanie listy jednokierunkowej

0

Witam wszystkich:)
Musze napisać program obsługujący książkę adresową oparty na liscie jednokierunkowej. Większość funkcjonalnosci mam juz napisane, jednak w programie musi być opcja sortowania wedlug numeru lub wedlog nazwiska.

Oto deklaracja listy:

 
type
 PElement = ^TElement;
 TElement = record
   Next: PElement;
   n_ind: integer;
   Imie: String;
   Nazwisko: String;
   Numer:String;
   Ulica: String;
   Ndomu:String;
   Miasto:String;
 end;

A to procedura sortująca, napisana na podstawie procedury znalezionej na forum:

 
procedure TForm1.SortujNazw(q:PElement);
var
  tmp, tmp2 : PElement;
begin
   if q <> nil then
     begin
       tmp := q^.Next;
         while (tmp <> nil) do
            begin
               if (q^.Nazwisko > tmp^.Nazwisko) then
                 begin
                    tmp2^.Next:= tmp^.Next;
                    tmp^.Next := q^.Next;
                    q^.Next := tmp2^.Next;
                 end;
              tmp := tmp^.Next;
            end;
        SortujNazw(q^.Next);
     end;
end;

Procedura sie wykonuje, nie wpada w petle nieskończoną, jednak nie dokonuje żadnych zmian w liscie.Moje bytanie brzmi w którym miejscu jest błąd i jak go poprawic?

0

Raz nie dokona, raz porąbie całą listę, raz dostaniesz access violation, masz mazanie po pamięci.
Tu: tmp2^.Next:=...
tmp2 to nie przedzielony obszar.

0
piotr92 napisał(a):

Procedura sie wykonuje, nie wpada w petle nieskończoną, jednak nie dokonuje żadnych zmian w liscie.Moje bytanie brzmi w którym miejscu jest błąd i jak go poprawic?

Tak jak @_13th_Dragon zauważył, kod jest kopnięty, więc już wiesz gdzie jest błąd. Poprawić go możesz pisząc od nowa tylko że samemu. To łatwiejsze do zrobienia niż zrozumienie czyjegoś algorytmu który nawet nie działa.

0

Zawsze łatwiej skorzystać z gotowego kontenerka TList w którym mamy dodatkowo metodę Sort w której wystarczy podać procedurkę porównującą.

Po co wynajdować koło od nowa skoro już ktoś za nas napisał i to bardzo dobrze :D ?

0
5corpio napisał(a):

Zawsze łatwiej skorzystać z gotowego kontenerka TList w którym mamy dodatkowo metodę Sort w której wystarczy podać procedurkę porównującą.

Po co wynajdować koło od nowa skoro już ktoś za nas napisał i to bardzo dobrze :D ?

Bo ma to zrobić na liście jednokierunkowej. A TList nie jest czymś takim. Tutaj chodzi o sztukę dla sztuki, nie o rozwiązanie konkretnego problemu. Potem taką listę jednokierunkową da się przerobić np. w drzewko binarne, które będzie wydajniejsze od TList.

Skoro już się bawimy w dobre rozwiązania to użyłbym TFPGList z modułu fgl (FPC 2.6.0+).

1 użytkowników online, w tym zalogowanych: 0, gości: 1