Avevo dato un occhio a quel link, ma sinceramente non ci ho capito molto sul funzionamento..

Ho comunque provato a buttar giù due righe di pseudo, per poi arrivare a questo codice che sembra funzionare (almeno teoricamente):

codice:
nodo* eliminazione(nodo *p, int val) {
    if(p->dato == val)
        p->dato = p->ptrsx;
    if(p == NULL)
        return NULL;
    else
        elimina(p->ptrsx);
}

int elimina(nodo *p) {
    int num;
    
    if(p->ptrsx == NULL) {
        num = p->dato;
        free(p);
        return num;
    } else if(p->ptrsx != NULL)
        elimina(p->ptrdx);
}
Però mi da questo errore:

assignment makes integer from pointer without a cast

in questa riga di codice:

p->dato = p->ptrsx;

Come mai?
Ho anche provato a fare una cosa del genere, ma da lo stesso identico errore..

codice:
nodo* eliminazione(nodo *p, int val) {
    nodo *r;
    r = p->dato;
    
    if(p->dato == val)
        p->dato = r->ptrsx;
    if(p == NULL)
        return NULL;
    else
        elimina(p->ptrsx);
}