[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