Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Eliminare elementi che si ripetono in una lista

    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!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Prova ad usare un debugger, è un'ottima tecnica per capire in quale punto esatto del codice c'è un errore!

  3. #3
    Originariamente inviato da Smoke666
    Prova ad usare un debugger, è un'ottima tecnica per capire in quale punto esatto del codice c'è un errore!
    Purtroppo ci ho già provato prima di postare qui, ma per inesperienza riguardo il suo uso non sono riuscito a capire dove sbaglio.
    Il fatto è che devo sostenere un esame e durante la prova non mi sarà concesso il suo utilizzo per cui non mi son mai interessato ad usarlo, e preferirei quindi allenarmi a capire "da me" dove sono eventuali errori.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il modo migliore è capire dove termina l'esecuzione. Puoi stampare dei caratteri a video in determinati punti, così vedi quali stampa e quali no.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Hai provato a compilare? Io ricevo errori già alla seconda riga...

    Facendo delle modifiche (che IDE usi? Perchè #include<iostream> in C? Perchè usi il tipo bool se non è definito da nessuna parte? Hai per caso riadattato del codice C++?), ho trovato il punto esatto del codice in cui si blocca il programma, ricevendo come errore "Segmentation Fault", ovvero durante la valutazione di questo if nella funzione "elimina_elem_ripetuti" :

    if(n_tmp->next->elem==elemento)

    Ho anche notato che non viene mai valutata questa condizione...Devi correggere un po di cose, ma almeno ora sai dove e perchè hai questo "crash"!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.