Самый простой способ - это когда функция принимает указатель на головной узел по ссылке.
Вот вам.
void exo6( Node **head )
{
while ( *head != NULL )
{
if ( ( *head )->data == 0 )
{
Node *current = *head;
*head = ( *head )->next;
free( current );
}
else
{
head = &( *head )->next;
}
}
}
Вызывайте функцию как
exo6( &head )l
Что касается реализации вашей функции, то она начинается с утечки памяти
void exo6(Node* head)
{
Node* p=(Node*)malloc(sizeof(Node));
p=head;
// ...
Сначала выделяется память и ее адрес сохраняется в указателе p
, а затем сразу же передается указатель. Также учтите, что в целом функция может быть вызвана, когда указатель на головной узел равен NULL. Более того, функция принимает указатель на головной узел по значению. Таким образом, функция имеет дело с копией исходного указателя. Изменение копии не влияет на исходный указатель.