C/Typy złożone: Różnice pomiędzy wersjami

Usunięte 429 bajtów ,  10 lat temu
→‎Implementacja listy: lista dwukierunkowa
(→‎Implementacja listy: dwukierunkowa lista)
(→‎Implementacja listy: lista dwukierunkowa)
Możemy jeszcze pomyśleć, jak można by wykonać usuwanie elementu z listy. Najprościej byłoby zrobić:
wsk->next = wsk->next->next
ale wtedy element, na który wskazywał wcześniej <tt>wsk->next</tt> przestaje być dostępny i zaśmieca pamięć. Trzeba go usunąć. Zauważmy, że aby usunąć element potrzebujemy wskaźnika do '''elementu go poprzedzającego''' (po to, by nie rozerwać listy). Lista jest dwukierunkowa, więc elementy znają swoje poprzedniki. Popatrzmy na poniższą funkcję:
<source lang="c">
typedef struct lista
void usun_z_listy(List *lista, void* element)
{
if(lista == NULL) return;
el_listy *wsk=lista;
while if(wsklista->next) !=usun_z_listy(lista->next, NULLelement);
free(lista);
{
if (wsk->next->val == element) /* musimy mieć wskaźnik do elementu poprzedzającego */
{
el_listy *usuwany=wsk->next; /* zapamiętujemy usuwany element */
wsk->next = usuwany->next; /* przestawiamy wskaźnik next by omijał usuwany element */
free(usuwany); /* usuwamy z pamięci */
} else
{
wsk = wsk->next; /* idziemy dalej tylko wtedy kiedy nie usuwaliśmy */
} /* bo nie chcemy zostawić duplikatów */
}
}
</source>
Anonimowy użytkownik