Prima di risponderti vorrei fare alcune osservazioni:
- la funzione CaricaLista() non mi sembra un buon approccio per la creazione di una lista. Se vuoi un consiglio prova ad implementare una funzione che aggiunge un elemento in testa alla lista e una che lo aggiunge in coda;
- non so se sia voluto, in ogni caso relativamente alla funzione CaricaLista() ti sei accorto che i valori aggiunti sono sempre gli stessi? Ti dice niente la funzione srand()?
- perchè passi l'argomento Lista p alla funzione CaricaLista()?
Tornando alla questione principale, mi vengono in mente due modi per eliminare gli elementi uguali in modo automatico:
- la funzione ElimEle() continua ad eliminare un solo elemento alla volta, ma invece che una Lista gli fai ritornare vero (1) se un elemento viene rimosso e falso (0) altrimenti. Nel main basterà quindi scrivere:
while(ElimEle(&testa, x));
- se invece vuoi che tutto avvenga all'interno della funzione bisogna ragionare un po'... innanzitutto sarà necessario scorrere la lista fino alla fine e quindi bisogna lasciare solo il return finale. Nel momento in cui togli i 2 return intermedi, le istruzioni:
prev = cur;
cur = cur->next;
vengono eseguite sempre, a prescindere che la condizione
if(cur->Num == x)
sia rispettata o meno. Secondo te va bene o bisogna aggiustare il tiro?