120 Rozdział 5. Struktury danych
i
if (pos!=q)
rsturn(O); II element nie odnaleziony?!
if (pos==info dane.głowa) // usuwamy z ooczatku listy I
info_dane.glowa=pos->nastepny; delete pos; tełse
if (pos->nastepny==Nl!LL; // usuwamy z końca listy (
info_dane.ogon=przea; przed->nastepny-NULL; delete pos;
)else II usuwamy gdzieś "ze środka"
<
przed->nastepny=pos->nastepny; delete pos;
)
return(1);
}
Pomimo wszelkich prób uczynienia powyższych funkcji bezpiecznymi, kontrola w' nich zastosowana jest ciągle bardzo uproszczona. Czytelnik, który będzie zajmował się implementacją dużego programu w C—t% powinien bardzo dokładnie kontrolować poprawność operacji na wskaźnikach. Programy stają się wówczas co prawda mniej czytelne, ale jest to cena za mały, lecz jakże istotny szczegół: ich poprawne działanie...
Poniżej znajduje się rozbudowany przykład użycia nowej wersji listy jednokierunkowej. Jest to dość spory fragment kodu. ale zdecydowałem się na jego zamieszczenie (biorąc pod uwagę względne skomplikowanie omówionego materiału ktoś nieprzyzwyczajony do sprawnego operowania wskaźnikami miał prawo się nieco zgubić; szczegółowy przykład zastosowania może mieć zatem duże znaczenie dla ogólnego zrozumienia całości).
Dwie proste funkcje wypisz 1 i wypisz zajmują się eleganckim wypisaniem na ekranie zawartości bazy danych w kolejności narzuconej przez odpowiednią listę wskaźników;
void LISTA::wypiszl(LPTR_INFO *inf)
I
II wypisujemy zawartość posortowanej listy
// wskaźników (oczywiścio nic interesuje nas II wypisanie wskaźników (są to adresy), lecz II informacji na które one wskazują LPTR ‘,q=inf->glowa; while (q != NULL) ł
cout << setw(9)<<q->adres->nazwisko<< " zarabia "
« setw (4 ) <<q->adres->zarobek«"z \n"; c=q->nastepny;