[C] lista jednokierunkowa, problem z usuwaniem elementow

0

napisalem sobie liste jednokierunkowa, problem mam z funkcja usuwajaca dany element, funkcja dziala, tylko nie wiem jak zwolnic pamiec po usunieciu elementu, wiecej informacji w komentarzach

node *delete_node(node *head, int val)
{
    node *tmp=NULL;
    node *p=NULL;   //aby moc zwolnic pamiec wprowadzam dodatkowy wskaznik
    if (head->value==val)
    {
        p=head->next;   //dzieki p moge zwolnic head (ten if tylko gdy usuwam akurat pierwszy element
        free(head);
    }
    else
    {
        tmp=search_node(head,val);   //wyszukuje dany element (funkcja dziala ok)
        if(tmp->next)
        {
            p->next=tmp->next->next;
            free(tmp->next);                          //jak tu zwolnic, to co trzeba, aby obylo sie bez segmentation fault??
        }
        else
        printf("brak takiego elementu\n");
    }
    return p;       
}
0

Zle troche pomyslales z ta funkcja znajdujaca element, poniewaz do zwolnienia pamieci i zachowania ciaglosci listy potrzebujesz tez poprzedniego, wiec proponuje tak:

while(ptr != NULL)               // ptr to na poczatku wskaznik na pierwszy element
{
   if(ptr->cos == cos)           // szukasz czegos
   {
      if(prev == NULL)                // znaczy, ze element do usuniecia jest pierwszym elementem
      {
          first = ptr->next;            // pierwszy jest nastepnym
          free(ptr);                       // zwalniasz pierwszy
      } else {
          prev->next = ptr->next;   // pomijasz element
          free(ptr);                        // zwalniasz ten pominiety
      }
   } else {
       prev = ptr;                        // pointer na poprzedni element
       ptr = ptr->next;
   }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0