Vorrei eseguire questa funzione che mi cancelli alcune occorrenze,ma dovendola passare per riferimento non so come fare.Sono nuovo sulle liste.....consigli.....?
codice:
#include <stdlib.h>
#include <stdio.h>

typedef struct nod {
        int data;
        struct nod *next;
} node;

node *newnode(void)
{
   return (node *)malloc(sizeof(node));
}

/* Dato un intero n>0, costruisce la lista di nodi da 1 ad n */
node* buildlis_n (int n)
{
    node *p, *lis;
    lis=NULL;
    while (n>0) {
          p=newnode();
          p->data=n;
          p->next=lis;
          lis=p;
          n--;
    }
    return(lis);
}

/* Stampa degli elementi di una lista */
void printlis(node *lis)
{
     node* tmp;

     tmp = lis;
     int somma=0;float media=0;int conteggio=0;
     printf("\nlista risultato\n");
     while (tmp != NULL) {
           printf(">>>> %d\n", tmp->data) && (somma=somma+tmp->data) && (conteggio=conteggio+1) ;
           tmp = tmp->next;

     }
    printf("Somma %d\n",somma);
    printf("Conteggio %d \n",conteggio);
    media=(somma/conteggio);
    printf("Media %f",media);
}


void myFree ( node* top )
{
    node* tmp;
    tmp = top;

    while ( top->next != NULL ) {
          tmp = top->next;
          free(top);
          top = tmp;
    }
}

void cancella(int x, node **lis)
{
        node *p,*head;
        if (lis != NULL)
{
    head=*lis;
    while (head->next != NULL)
{
if (head->next->data==x)
{
    p=head->next;
    head->next=head->next->next;
    free(p);
}
    else head=head->next;
}
    if ((*lis)->data==x) *lis=(*lis)->next;
}
}

int main()
{
    node* head;node* head2;
    int n;int m=6;

    printf ("Inserire valore: \n");
    scanf  ("%d", &n);

    head = buildlis_n ( n );
   

    printf ("\n-----CONTROLLO-----\n");
    cancella(3,head);
    myFree ( head );
    

    return 0;
}