Moment, najpierw przyda się typy danych zadeklarować w ludzki, czytelny sposób:
type
TPersonData = record
ID: Byte;
Name: String[30];
Surename: String[30];
end;
type
PListNode = ^TListNode;
TListNode = record
Data: TPersonData;
NextNode: PListNode;
PrevNode: PListNode;
end;
No, teraz można zastanawiać się nad dalszą częścią;
Pierwsze zadanie to znalezienie węzła zawierającego dane osobowe, pasujące do podanych w parametrach imienia i nazwiska; Funkcja przede wszystkim powinna pobierać wskaźnik na głowę listy, a oprócz tego pobierać dwa łańcuchy znaków - imienia i nazwiska; Zwracać ma wskaźnik na węzeł;
function FindPerson(AListHead: PListNode; const AName, ASurename: String): PListNode;
var
LNode: PListNode;
begin
LNode := AListHead;
while LNode <> nil do
if (LNode^.Data.Name = AName) and (LNode^.Data.Surename = ASurename) then
Exit(LNode)
else
LNode := LNode^.NextNode;
Result := nil;
end;
Przyjemny kawałek kodu;
Drugie zadanie to znalezienie węzła zawierającego dane osobowe, pasujące do podanych w parametrach imienia i nazwiska, a następnie usuniecie znalezionego węzła; Mechanizm wyszukiwania węzła jest już gotowy - wystarczy tylko zwolnić pamięć po znalezionym węźle i przepiąć wskaźniki z węzłów sąsiadujących;
function RemovePerson(AListHead: PListNode; const AName, ASurename: String): Byte;
var
LNode: PListNode;
begin
LNode := FindPerson(AListHead, AName, ASurename);
if LNode = nil then
Result := High(Byte)
else
begin
Result := LNode^.Data.ID;
if LNode^.PrevNode <> nil then
LNode^.PrevNode^.NextNode := LNode^.NextNode;
if LNode^.NextNode <> nil then
LNode^.NextNode^.PrevNode := LNode^.PrevNode;
Dispose(LNode);
end;
end;
W zadaniu nie podano co robić w przypadku, gdy dana osoba (węzeł) nie zostanie odnaleziona; Kod podany wyżej zwraca w takim przypadku wartość High(Byte)
, czyli 255
(jakąś trzeba sobie zarezerwować); Gdyby funkcja mogła zwracać liczbę typu Integer
(lub innego całkowitoliczbowego) to po nieodnalezieniu węzła można by zwrócić -1
, bo ta wartość jest do tego celu idealna;
Kod pisałem z pamięci w notatniku, więc coś może nie działać właściwie (choć wygląda na prawidłowy); Wyjątkowo dziś rozdaję gotowca, chyba głównie dlatego, że lubię listy; Składnia kodów odpowiednia dla FPC.