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;