Ti sei accorto che stai utilizzando i tag QUOTE al posto dei tag CODE?
Ti spiego un po' la situazione: correggere codice altrui, inteso come renderlo funzionante senza "snaturarlo" troppo (sempre che sia possibile farlo), non è affatto facile. Ciò richiede infatti di entrare nella logica dell'autore, capire da dove è partito e dove vuole arrivare. Ti renderai conto che oltre alla difficoltà intrinseca, soprattutto su argomenti del genere, il tutto richiede richiede molto tempo e voglia! Sinceramente per quanto mi riguarda manca sia l'uno che l'altra, quindi o aspetti qualche buon samaritano oppure potresti prendere in considerazione il consiglio che già ti ho dato anche nell'altro topic, ossia di scrivere codice più generico basato su funzioni che effettuano operazioni elementari. In questo modo non solo scriverai codice più chiaro e conciso, ma aumenterai notevolmente anche le probabilità di ricevere aiuto altrui.
Detto questo, quello che farei è implementare le seguenti due funzioni:
void elimina_nodo(nodo **p)
finalizzata all'eliminazione di un generico nodo;
nodo** trova(nodo **p, int info)
finalizzata alla ricerca del primo nodo contenente info.
A questo punto la funzione
void cancella_elemento(nodo **p, int info)
(che tu chiami Cancella()) può essere implementata utilizzando le suddette due funzioni con sole 2 righe di codice.
Invece la funzione
void cancella_doppioni(nodo **p)
(che tu chiami Doppioni()) può essere implementata utilizzando la funzione cancella_elemento() con sole 3 righe di codice.
Se decidi di seguire il mio consiglio e hai qualche dubbio, chiedi pure!