Ciao ragazzi,
sto scrivendo un codice che, data una lista dinamica di interi immessi dall'utente, mi elimini gli elementi che si ripetono una o più volte.
Per esempio, se la lista è:

5
3
3
4
3

allora la lista che devo ricevere deve essere:

5
4

Oppure, se la lista è:

5
3
4
3
5

la nuova lista dev'essere:

4

Ho già scritto tutto il codice, ma quello che non dovrebbe andare è proprio la funzione che mi dovrebbe eliminare, appunto, gli elementi che si ripetono.
Quando eseguo il programma, dopo aver inserito e stampato la lista l'eseguibile va in crash, e sembra farlo proprio nel momento in cui esso richiama la funzione che mi elimina i "doppioni".
Tutte le altre funzioni (l'inserisci in testa, la stampa della lista, l'elimina un elemento sia in testa che in mezzo....) dovrebbero funzionare correttamente.

Il codice è:

codice:
#include <stdio.h>
#include <iostream>

typedef int E;
struct blocchetto;
typedef blocchetto*L;
typedef struct blocchetto{
E elem;
L next;};

L insert(E e,L l){
L q;  
q=(L)malloc(sizeof(blocchetto));
q->elem=e;
q->next=l;
return(q);} 

void stampa(L l){
L temp=l;
while(temp!=NULL){
printf("Elemento: %d \n",temp->elem);
temp=temp->next;}}


L elimina (L l,int elemento){
L tmp=l;
L cnc;
while(tmp->elem==elemento){
cnc=tmp;
tmp=tmp->next;
free(cnc);}
l=tmp;
while(tmp->next!=NULL){
if(tmp->next->elem==elemento){
cnc=tmp->next;
tmp->next=tmp->next->next;
free(cnc);}
else{tmp=tmp->next;}}
return(l);}




L elimina_elem_ripetuti (L l){
L tmp=l;
L n_tmp;
int elemento;
bool ripetuto=false;
while(tmp->next!=NULL){
elemento=tmp->elem;
n_tmp=tmp;
while(n_tmp!=NULL){
if(n_tmp->next->elem==elemento){
ripetuto=true;}
n_tmp=n_tmp->next;}

if(ripetuto==true){
l=elimina(l,elemento);}

tmp=tmp->next;}
return(l);}






int main(){
E e; L l;
l=NULL;
char risp[3];
while(strcmp(risp,"no")!=0){
printf("Vuoi inserire un elemento?(si o no) \n");
scanf("%s",&risp);
if(strcmp(risp,"si")==0){
printf("Inserisci elemento: \n");
scanf("%d",&e);
l=insert(e,l);}}

stampa(l);

l=elimina_elem_ripetuti(l);

stampa(l);

free(l);

system("PAUSE");
return(0);}
Potreste darmi una mano?

Grazie!