5.1. Listy jednokierunkowe 119
wartość zwracaną przez funkcję: w normalnej sytuacji winien to być różny od NULL, adres fizycznego rekordu przeznaczonego do usunięcia.
ELEMENT* LISTA::usuń wsk{
LPTR_INFO * inf,
ELEMENT *q,
int(*decyzja)(ELEMENT *ql,
ELEMENT *q2)
)
if {inf->ęlowa==NULL)
// lista pusta, czyli nie ma co usuwać! return NULL;
else //szukamy elementu do usunięcia
LP7R *przed,*pns;
LPTR_INFO wgdzie^cdszukaj_wsk(inf,q,decyzja)/
przed=gazie->glowa;
po3-gdzie >cgon;
if(pos==NULL)
return NULL; // element nie odnaleziony if(pos==inf->glowa) // usuwamy z początku listy inf->glowa-pos->nastepny;
else
if(pos->nastepny==NULL)//usuwamy z końca listy (
inf->ogon=przed; pr zed->r.as tepny "NULL;
felse // usuwamy gozieś "ze środka" przcd->nastepny=pos->nastepny;
ELEMENT *ret=pos->adres; delata pos; return ret;
)
}
Funkcja usuń dam jest zbudowana wg podobnego schematu co funkcja usun wsk. Ponieważ przyjmowane jest założenie, że element, który chcemy usunąć, istnieje, programista musi zapewnić dokładną kontrolę poprawności wykonywanych operacji. Tak się dzieje w naszym przypadku - ewentualna nieprawidłowość zostanie wykryta już podczas próby usunięcia wskaźnika i wówczas usunięcie rekordu po prostu nie nastąpi.
int LISTA::usun_dane(ELEMENT *q)
// zależenie: q istnieje!
ELEMENT *przed,*pos; przed=NULL; pos=info dane.glcwa;
while( (pos!—q] & &(pes!=NULL))//3 zukany elementu "przed"
<
przed-pos; pos=pos->nastepny;