Secondo me quella funzione è completamente da ripensare...
Se posso darti un consiglio, io mi soffermerei nell'implementare una serie di funzioni standard per le liste, da utilizzare poi come base per risolvere i diversi problemi che ti si presentano di volta in volta.
Per esempio funzioni base possono essere nell'ordine:
void inserisci_in_testa(nodo* &p, const "TIPO" &dato);
void inserisci_in_coda(nodo* &p, const "TIPO" &dato);
void inserisci_in_ordine(nodo* &p, const "TIPO" &dato);
nodo*& trova(nodo* &p, const "TIPO" &dato);
void elimina_nodo(nodo* &p);
void cancella_elemento(nodo* &p, const "TIPO" &dato);
//che elimina dalla lista tutti i nodi contenenti un certo elemento
void stampa(nodo *p)
P.S.
Tornando alla funzione, non sono sicuro di aver capito fino in fondo quelle che sono le tue intenzioni, ma riguardo a quello che ti diceva @Weierstrass, prova a lanciare il seguente codice:
#include <iostream>
using namespace std;
int main()
{
cout << ("null" == NULL) << endl;
cout << ("null" == nullptr) << endl;
}