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 è:
Potreste darmi una mano?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);}
Grazie!![]()

Rispondi quotando
