[C] Eliminare elementi dispari da una lista

di il
7 risposte

[C] Eliminare elementi dispari da una lista

Salve a tutti, ho un problema con questo codice!

Devo scrivere un programma che
1) generi un numero casuale x compreso tra 20 e 31
2)crei una lista di x nodi tale che ogni nodo contiene un numero naturale tra 1 e 20 generato casualmente
3)cancella dalla lista tutti i nodi contenenti un numero dispari.

Allora questo è il mio codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


struct nodo{int valore;
struct nodo *succ};

struct nodo *inserisci(struct nodo *l, int x);
struct nodo *cancella(struct nodo *l,int x);


int main(void)
{
    int x,i,t;
    srand(time(NULL));
    struct nodo *lista;
    t=20+rand()%31;

    for(i=0;i<t;i++)
    {
        x=rand()%21;
        lista=inserisci(lista,x);

    }
    stampa(lista);

    for(i=0;i<t;i++)
        if (x%2!=0) lista=cancella(lista,x);
    stampa(lista);
    return 0;
}
struct nodo *inserisci(struct nodo *l,int x)
{
    struct nodo *nuovo;
    nuovo=malloc(sizeof(struct nodo));
    nuovo->valore=x;
    nuovo->succ=l;
    return nuovo;
};

void stampa(struct nodo *l)
{
    while(l!=NULL)
    {
        printf("%d\n",l->valore);
        l=l->succ;
    }
}


struct nodo *cancella(struct nodo *l,int x)
{
    struct nodo *ultimo,*corr,*p;
    ultimo=NULL;
    corr=l;
    while((corr!=NULL) && (corr->valore=x))
    {
        ultimo=corr;
        corr=corr->succ;
    }
    if(corr!=NULL)
        if((corr->succ==NULL) && (ultimo==NULL))
    {
        free(corr);
        return NULL;
    }
    else if(ultimo==NULL)
    {
        p=corr->succ;
        free(corr);
        return p;
    }
    else {ultimo->succ=corr->succ;
    free(corr);
    return l;}
    else return l;
};

Soltanto che quando lo avvio mi genera la lista ma non termina. Dove potrebbe essere l'errore? Devo aggiungere una funzione che cerchi gli elementi dispari prima di cancellarli?
Grazie a chi risponderà

7 Risposte

  • Re: [C] Eliminare elementi dispari da una lista

    L'errore sta nel ciclo di eliminazione: utilizzi x per fare il test ma in realtà x non lo leggi dalla lista. Devi rivedere quella parte perché devi fare una lettura di tutta la lista...
  • Re: [C] Eliminare elementi dispari da una lista

    candaluar ha scritto:


    L'errore sta nel ciclo di eliminazione: utilizzi x per fare il test ma in realtà x non lo leggi dalla lista. Devi rivedere quella parte perché devi fare una lettura di tutta la lista...
    Quindi dovrei prima leggere la lista, individuare tutti gli elementi dispari e poi cancellarli?
  • Re: [C] Eliminare elementi dispari da una lista

    Ho provato a cambiare nel ciclo di eliminazione (togliendo come input int x) nel primo while corr->valore%2==0 invece di corr->valore=x . Ma non termina comunque..
  • Re: [C] Eliminare elementi dispari da una lista

    Nessuno riesce a risolvere questo problema?
  • Re: [C] Eliminare elementi dispari da una lista

    Intanto questo

    corr->valore=x

    è sbagliato, perché così assegni un valore.

    Poi, prova tu a dare una soluzione, non attendere il codice pronto.
  • Re: [C] Eliminare elementi dispari da una lista

    oregon ha scritto:


    Intanto questo

    corr->valore=x

    è sbagliato, perché così assegni un valore.

    Poi, prova tu a dare una soluzione, non attendere il codice pronto.
    Quindi neanche la correzione con il modulo 2 è giusta? Non saprei cosa mettere allora..

    Sinceramente sto provando e riprovando ma non mi viene in mente nulla!


    Aggiungo una cosa: Il codice è stato fatto a lezione. Ho compreso tutto tranne questa parte :
    if(corr!=NULL)
            if((corr->succ==NULL) && (ultimo==NULL))
        {
            free(corr);
             return NULL;
        }
    corr->succ==NULL è il caso in cui il puntatore corrente punta sul successivo che è nullo ,quindi sarà l'ultimo della lista.
    Mentre ultimo==NULL dovrebbe essere quando il valore è il primo nodo! Ma non riesco a capire come possano essere collegati!
  • Re: [C] Eliminare elementi dispari da una lista

    Forse ho risolto il mio dubbio! corr->succ==NULL significa che corr sta puntando l'elemento da eliminare! Quindi in questo caso devo solo cancellare corr. Qualcuno che mi dica solo se è giusto o no?
Devi accedere o registrarti per scrivere nel forum
7 risposte