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

Usunięta treść Dodana treść
→‎Implementacja listy: dwukierunkowa lista
→‎Implementacja listy: lista dwukierunkowa
Linia 510:
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
Linia 520:
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>