Liste.

di il
9 risposte

Liste.

Salve. Ho scritto un codice che, in base ai numeri dati in input, deve inserire i numeri pari nelle liste. In output mi manda i numeri pari che ho inserito e fin qui tutto ok, il problema è che mi mette uno zero che io non ho inserito nella mia sequenza, come posso risolvere?

#include <stdio.h>
#include <stdlib.h>

typedef struct _elemento{
int valore;
struct _elemento *successivo;
} elemento;

elemento *crea_lista(void) {
    elemento *r = (elemento *)malloc(sizeof(elemento));

    if (r == NULL)
        return NULL;

    r->successivo = NULL;

    return r;
}

void cancella_lista(elemento *testa) {
    elemento *e = testa;

    while (e != NULL) {
        elemento *c = e;

        e = e->successivo;

        free(c);
    }
}

void aggiungi(elemento *lista, int n) {
    elemento *coda;

        if(lista==NULL) {
        elemento *lista = (elemento *)malloc(sizeof( elemento));
        lista->valore=n;
        lista->successivo=NULL;
        return;
        }
           coda=lista;

           while(coda->successivo!=NULL)
           coda=coda->successivo;

	/* qui t punta all'ultima struttura della lista: ne
	creo una nuova e sposto il puntatore in avanti */
          coda->successivo=(elemento *)malloc(sizeof(elemento));
          coda=coda->successivo;

	/* metto i valori nell'ultima struttura */
  coda->valore=n;
  coda->successivo=NULL;
}

void stampa_lista(elemento *testa) {

elemento *e;

printf("\n lista ---> ");

for (e = testa; e != NULL; e = e->successivo) {

printf("%d ", e->valore);
}
printf("\n");
}

int main() {

elemento *lista=crea_lista();

int n=0;

while(n >= 0) {

    printf("Inserisci un elmento\n");

    scanf("%d", &n);

    if (n%2 == 0)
    aggiungi(lista, n);

    /*if(n%2==0){
        lista = aggiungi(n);
        }*/
    }
stampa_lista(lista);
cancella_lista(lista);
}

9 Risposte

  • Re: Liste.

    Modifica la

    if (n%2 == 0)

    aggiungendo anche che n deve essere > 0
  • Re: Liste.

    oregon ha scritto:


    Modifica la

    if (n%2 == 0)

    aggiungendo anche che n deve essere > 0
    Già fatto, ma non funziona comunque. Pensavo ad un modo per saltare il primo elemento di testa da stampare, così da evitare che me lo stampi, dato che credo che il problema sia quando la inizializzo con la funzione crealista. Come si fa?
  • Re: Liste.

    Ok ho risolto (passando al nodo successivo prima del for della stampa). Ora sto cercando di implementare la seconda funzione richiesta dall'esercizio, che sarebbe la funzione che somma tutti gli elementi presenti nella lista, se dovessi avere delle problemi, vi manderò qui il codice.
  • Re: Liste.

    Cioè hai fatto diversamente da come ti ho detto? Quindi perché ti ho risposto? Dovevi far vedere come avevi fatto e perché non ti funzionava.

    Comunque per un altro problema un altro thread, non è una chat.
  • Re: Liste.

    oregon ha scritto:


    Cioè hai fatto diversamente da come ti ho detto? Quindi perché ti ho risposto? Dovevi far vedere come avevi fatto e perché non ti funzionava.
    Non funzionava perché la lo zero veniva inizializzato quando creavo la lista, perciò era già preesistente (che poi ho anche scritto che mi dava uno zero in più che non avevo inserito). Ma poi, scusa, copiatelo il codice e provalo su un compilatore tu stesso, non dare soluzioni senza averle prima testate. Che poi è ovvio che ho fatto diversamente da come mi hai detto se ciò non risolveva il mio problema.
    Comunque per un altro problema un altro thread, non è una chat.
    Ok.
  • Re: Liste.

    KromKappa ha scritto:


    Non funzionava perché la lo zero veniva inizializzato quando creavo la lista
    In realtà non valorizzavi neanche uno zero ma un valore casuale.

    Ignorare il nodo iniziale non è una soluzione ma un modo per nascondere l'errore del codice.

    La creazione della lista può essere semplicemente
    
    elemento *crea_lista(void) {
    	return NULL;
    }
    
    a patto che aggiungi in questo modo
    
    elemento *aggiungi(elemento *lista, int n) {
    	elemento *coda;
    
    	if (lista == NULL) {
    		elemento *lista = (elemento *)malloc(sizeof(elemento));
    		lista->valore = n;
    		lista->successivo = NULL;
    	}
    	else
    	{
    		coda = lista;
    
    		while (coda->successivo != NULL)
    			coda = coda->successivo;
    
    		/* qui t punta all'ultima struttura della lista: ne
    		creo una nuova e sposto il puntatore in avanti */
    		coda->successivo = (elemento *)malloc(sizeof(elemento));
    		coda = coda->successivo;
    
    		/* metto i valori nell'ultima struttura */
    		coda->valore = n;
    		coda->successivo = NULL;
    	}
    
    	return lista;
    }
    
    e nel main la chiami con
    
    		if(n%2==0)
    			lista = aggiungi(lista, n);
    
  • Re: Liste.

    oregon ha scritto:


    KromKappa ha scritto:


    Non funzionava perché la lo zero veniva inizializzato quando creavo la lista
    In realtà non valorizzavi neanche uno zero ma un valore casuale.

    Ignorare il nodo iniziale non è una soluzione ma un modo per nascondere l'errore del codice.

    La creazione della lista può essere semplicemente
    
    elemento *crea_lista(void) {
    	return NULL;
    }
    
    a patto che aggiungi in questo modo
    
    elemento *aggiungi(elemento *lista, int n) {
    	elemento *coda;
    
    	if (lista == NULL) {
    		elemento *lista = (elemento *)malloc(sizeof(elemento));
    		lista->valore = n;
    		lista->successivo = NULL;
    	}
    	else
    	{
    		coda = lista;
    
    		while (coda->successivo != NULL)
    			coda = coda->successivo;
    
    		/* qui t punta all'ultima struttura della lista: ne
    		creo una nuova e sposto il puntatore in avanti */
    		coda->successivo = (elemento *)malloc(sizeof(elemento));
    		coda = coda->successivo;
    
    		/* metto i valori nell'ultima struttura */
    		coda->valore = n;
    		coda->successivo = NULL;
    	}
    
    	return lista;
    }
    
    e nel main la chiami con
    
    		if(n%2==0)
    			lista = aggiungi(lista, n);
    
    Ho riscritto il codice come mi hai consigliato, ma continua a non andare perché non mi rileva neanche i pari che inserisco. Qui sotto ti inserisco il codice come l'ho scritto.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include<stdbool.h>
    
    typedef struct _elemento{
    int valore;
    struct _elemento *successivo;
    } elemento;
    
    elemento *crea_lista(void) {
        return NULL;
    }
    
    void cancella_lista(elemento *testa) {
        elemento *e = testa;
    
        while (e != NULL) {
            elemento *c = e;
    
            e = e->successivo;
    
            free(c);
        }
    }
    
    elemento *aggiungi(elemento *lista, int n) {
        elemento *coda;
    
    	if (lista == NULL) {
    		elemento *lista = (elemento *)malloc(sizeof(elemento));
    		lista->valore = n;
    		lista->successivo = NULL;
    	}
    	else
    	{
    		coda = lista;
    
    		while (coda->successivo != NULL)
    			coda = coda->successivo;
    
    		/* qui t punta all'ultima struttura della lista: ne
    		creo una nuova e sposto il puntatore in avanti */
    		coda->successivo = (elemento *)malloc(sizeof(elemento));
    		coda = coda->successivo;
    
    		/* metto i valori nell'ultima struttura */
    		coda->valore = n;
    		coda->successivo = NULL;
    	}
    
    	return lista;
    }
    
    void stampa_lista(elemento *testa) {
    
    elemento *e;
    
    printf("\n lista ---> ");
    
    for (e=testa; e != NULL; e = e->successivo) {
    
    printf("%d ", e->valore);
    }
    printf("\n");
    }
    
    int main() {
    
    elemento *lista=crea_lista();
    
    int n=0;
    
    while(n >= 0) {
    
        printf("Inserisci un elmento\n");
    
        scanf("%d", &n);
    
        if (n%2 == 0)
        lista = aggiungi(lista, n);
        }
    stampa_lista(lista);
    
    cancella_lista(lista);
    
    }
    
  • Re: Liste.

    Era sfuggita una else ... per tentare di rispettare più possibile il tuo codice ...
    
    elemento *aggiungi(elemento *lista, int n) {
    	elemento *coda;
    
    	if (lista == NULL) {
    		elemento *lista = (elemento *)malloc(sizeof(elemento));
    		lista->valore = n;
    		lista->successivo = NULL;
    		return lista;
    	}
    		
    	coda = lista;
    
    	while (coda->successivo != NULL)
    		coda = coda->successivo;
    
    	/* qui t punta all'ultima struttura della lista: ne
    	creo una nuova e sposto il puntatore in avanti */
    	coda->successivo = (elemento *)malloc(sizeof(elemento));
    	coda = coda->successivo;
    
    	/* metto i valori nell'ultima struttura */
    	coda->valore = n;
    	coda->successivo = NULL;
    	
    
    	return lista;
    }
    
  • Re: Liste.

    oregon ha scritto:


    Era sfuggita una else ... per tentare di rispettare più possibile il tuo codice ...
    
    elemento *aggiungi(elemento *lista, int n) {
    	elemento *coda;
    
    	if (lista == NULL) {
    		elemento *lista = (elemento *)malloc(sizeof(elemento));
    		lista->valore = n;
    		lista->successivo = NULL;
    		return lista;
    	}
    		
    	coda = lista;
    
    	while (coda->successivo != NULL)
    		coda = coda->successivo;
    
    	/* qui t punta all'ultima struttura della lista: ne
    	creo una nuova e sposto il puntatore in avanti */
    	coda->successivo = (elemento *)malloc(sizeof(elemento));
    	coda = coda->successivo;
    
    	/* metto i valori nell'ultima struttura */
    	coda->valore = n;
    	coda->successivo = NULL;
    	
    
    	return lista;
    }
    
    Ok, l'ho modificato e adesso va. Grazie.
Devi accedere o registrarti per scrivere nel forum
9 risposte