Sortowanie na liście po 2 kryteriach

0

Witam.

Piszę program, w którym mam procedurę dodawanie elementu do listy w ten sposób, aby lista sortowana była wg nazwy, a jeżeli elementy mają tę samą nazwę, to mają one być posortowane po dacie. Z sortowaniem po nazwie nie ma problemu, ale sortowanie po dacie już nie działa mi prawdiłowo. Prosiłbym o pomoc. Po pierwsze po dodaniu pierwszego elementu kolejne dodawane elmenty wydają sie nie zwracać na niego uwagi i ustawiać jedynie wzgledem siebie. Ale i to robią źle. Nie rozumiem całkiem dlaczego. Trudno mi właściwie nawet wyjaśnić te błedne sortowanie. Gdy dodaje kolejno element o tej samej nazwie ale coraz późniejszej dacie to wszystko wydaje się być ok, ale przy dodaniu no nich jakiegos elementu pośredniego czy mniejszego trafia on lub na drugie miejsce zaraz po first'cie lub na sam koniec listy. Mam nadzieję, że ktoś pomoże mi jakoś rozwiązać ten problem.

Tutaj moja deklaracja listy:

type ptr=^programtv;


         data=record
        dzien:1..31;
        miesiac:1..12;
        rok:integer;
        end;

        programtv=record
        nazwa:string[150];
        kiedy:data;
        godzina:0..23;
        minuty:0..59;
        kat_wiek:1..3;
        rodzaj:1..6;
        next:ptr;
        end;


var t,first,temp:ptr;
     D1, D2 : TDate;
     x,y:string;

A tutaj moja nieudana próba dodania nowego elementu i ustawienia go w odpowiednim miejscu...

    New(t);

    t^.nazwa:=EdtNazwa.Text;
    t^.kiedy.dzien:=StrToInt(edtNumEditDzien.Text);
    t^.kiedy.miesiac:=StrToInt(edtNumEditMiesiac.Text);
    t^.kiedy.rok:=StrToInt(edtNumEditRok.Text);
    t^.godzina:=StrToInt(edtEditGodziny.Text);
    t^.minuty:=StrToInt(edtNumEditMinuty.Text);

    try
      D1:=StrToDate(IntToStr(t.kiedy.rok)+'-'+IntToStr(t.kiedy.miesiac)+'-'+IntToStr(t.kiedy.dzien));
    except
      on EConvertError do
        begin
        ShowMessage('Niepoprawna data!');
        Exit;
        end;
    end;
    
        if (first=nil) or (t^.nazwa<first^.nazwa) then
          begin
          t^.next:=first;
          first:=t;
          end
          else
            begin

              temp:=first;
              while (temp^.next<>nil) and (temp^.next^.nazwa<t^.nazwa)  do
              temp:=temp^.Next;            

             
              if temp.next<>nil then
              D2:=StrToDate(IntToStr(temp^.next.kiedy.rok)+'-'+IntToStr(temp^.next.kiedy.miesiac)+'-'+IntToStr(temp^.next.kiedy.dzien));

              x:=DateTimeToStr(D2);
              y:=DateTimeToStr(D1);


              while Pos('-', y) > 0 do
              Delete(y, Pos('-', y), 1);

              while Pos('-', x) > 0 do
              Delete(x, Pos('-', x), 1);

              ShowMessage(x);
              ShowMessage(y);
              while (temp^.next<>nil) and (temp^.next^.nazwa=t^.nazwa) and (x<y) do
               begin
                 temp:=temp^.Next;
               end;


              t^.next:=temp^.Next;
              temp^.next:=t;
            end;
  end;
0

Patrząc na datę twojego posta, pewno sobie już poradziłeś, ale podpowiem tu swoją koncepjcę.
Proponuję zmieniać datę na string, koniecznie w formacie rok.miesiąc.dzien i teraz wystarczy sortować np. metodą bąbelkową sumę stringów nazwa+data.

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