Lista dwukierunkowa - wyszukiwanie i usuwanie osoby

0

Witam,

Może mi ktoś pomóc z tym zadaniem? Nie ogarniam zbytnio tematu list :/

pElem = ^Element;

TDane = record
id : byte;
imie : String[20];
nazwisko : String[30];
end;

Element = record
 osoba : TDane;
nast : pElem;
poprz : pElem;
end;
  1. Napisz funkcję znajdzOsobe, która zwraca wskaźnik na znaleziony element. Funkcja przyjmuje jako parametry imię oraz nazwisko szukanej osoby.
  2. Napisz funkcję usunOsobe, usuwającą osobę o zadanym imieniu i nazwisku, z listy. W implementacji należy skorzystać z funkcji wyszukującej z pierwszego podpunktu. Funkcja zwraca id usuwanej osoby.
0

Z czym konkretnie masz problem?

2

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.

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