198 Rozdział 7. Algorytmy przeszukiwania
pod indeks ///, stwierdzimy, że już wcześniej ktoś się tam „zameldował”, wystarczy doczepić ,v na koniec listy, której głowa jest zapamiętana w T[mj.
Analogicznie działa poszukiwanie: szukamy elementu v i H(x) zwraca nam pewien indeks m. W przypadku, gdy T[mJ zawiera NULL, możemy być pewni, że szukanego elementu nie odnaleźliśmy - w odwrotnej sytuacji, aby się ostatecznie upewnić, wystarczy przeszukać listę TfmJ. (Warto przy okazji zauważyć, że listy będą na ogół bardzo krótkie).
Opisany powyżej sposób jest zilustrowany na rysunku 7-1.
Obrazuje on sytuację powstałą po sukcesywnym wstawianiu do tablicy Trekordów A, B. ( ', D, E, F i G, którym funkcja H przydzieliła adresy (indeksy): 7, 5, 2, 5, 3, I i 0. Indeksy tablicy, pod którymi nie ukrywają się żadne rekordy danych, są zainicjowane wartością NULL - patrz np. komórki 4 i 6. Na pozycji 7 marny do czynienia z konfliktem dostępu: rekordy A i F otrzymały ten sam adres! Odpowiednia funkcja wstaw (którą musimy przewidująco napisać!) wykrywa tę sytuację i wstawia element F na koniec listy T[1J.
TAB
Rys. 7- /.
Użycie list do obsługi konfliktów dostępu.
Obrazuje on sytuację powstałą po sukcesywnym wstawianiu do tablicy T rekordów A. B, C, D, E, F i G', którym funkcja 77 przydzieliła adresy (indeksy): 7, 3, 2. 5, 3, 1 i 0. Indeksy tablicy, pod którymi nic ukrywają się żadne rekordy danych, są zainicjowane wartością NULL - patrz np. komórki 4 i 6. Na pozycji 1 mamy do czynienia z konfliktem dostępu: rekordy A i 7*' otrzymały ten sam adres! Odpowiednia funkcja wstaw (którą musimy przewidująco napisać!) wykrywa tę sytuację i wstawia element F na koniec listy T[l].
Podobna sytuacja dotyczy rekordów B i E. Proces poszukiwania elementów jest zbliżony do ich wstawiania - Czytelnik nie powinien mieć trudności z dokładnym odtworzeniem sposobu przeszukiwania tablicy T w celu odpowiedzi na pytanie, czy został w niej zapamiętany dany rekord, np. E.