Sono riuscito a farlo funzionare, avete idee per migliorarlo?
codice:
/*effettua cancellazione elemento*/

bool lista::cancella(int x)
{
    nodo *s;
    l=eliminaprimo(l,x);
    s=l;
    eliminacentro(l,x);
    l=s;
};

nodo* lista::eliminaprimo(nodo* l, int val)    //elimina in modo ricorsivo i primi se sono uguali
{
    if (val == l->valore){
        l=l->succ;
    if(l!=NULL){
    return eliminaprimo(l, val);
    }
    };
    return l;
};

nodo* lista::eliminacentro(nodo* l, int val)  //elimina elementi dopo il primo
{
    if(l!=NULL && l->succ!=NULL)
    if (val == l->succ->valore){
    l->succ=l->succ->succ;
    return eliminacentro(l, val);
    };
    };