Liste semplici

di il
38 risposte

38 Risposte - Pagina 2

  • Re: Liste semplici

    Andrea Quaglia ha scritto:


    saraciao ha scritto:


    oregon ha scritto:


    E come fa questo

    return *(int*)car(l) + somma(cdr(l));

    a compilare dato che non si sa cosa sia car, cdr e somma??
    qui dovrebbe sommare in modo ricorsivo tutti gli elementi della lista
    Non è così che funziona la ricorsione.
    Innanzi tutto car e cdr sono due istruzioni LISP, che servono appunto ad esplorare le liste.
    Se tu fossi in LISP, car(l) ritornerebbe il primo valore della lista, mentre cdr(l) ritorna una lista meno il primo elemento. Ma LISP non ha bisogno di strutture per fare liste concatenate, le fa di suo. Quindi in LISP return car(l)+somma(cdr(l)) avrebbe un senso, in C no.
    infatti non le avevo mai viste in c solo che un sito fa cosi
  • Re: Liste semplici

    un si sito fa così
    Quindi tu prendi la roba da un sito qualsiasi senza comprenderla? Che senso ha?

    In effetti basterebbe
    
    int ListaSomma(struct lista *l) {
            if(!l) return 0;
            return l->key + ListaSomma(l->next);
    }
    
    o anche
    
    int ListaSomma(struct lista *l) {
    	return !l ? 0 : l->key + ListaSomma(l->next);
    }
    
  • Re: Liste semplici

    oregon ha scritto:


    un si sito fa così
    Quindi tu prendi la roba da un sito qualsiasi senza comprenderla? Che senso ha?

    In effetti basterebbe
    
    int ListaSomma(struct lista *l) {
            if(!l) return 0;
            return l->key + ListaSomma(l->next);
    }
    
    o anche
    
    int ListaSomma(struct lista *l) {
    	return !l ? 0 : l->key + ListaSomma(l->next);
    }
    
    va bene..ho provato a fare cosi ma ancora non mi funziona c'è mi fa solo inserire il numero di elementi e la sequenza di numeri ma poi con calcola la somma. Per ottenere solo la somma degli elementi nella lista ho fatto cosi
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct lista
    {    int key;
        struct lista *next;
    };
    
    int listaSomma(struct lista *l);
    
    int main()
    {    int n;
        struct lista *top;
    
        printf("Inserisci gli elementi: ");
        scanf("%d", &n);
        
        listaSomma(top);
    }
    
    int listaSomma(struct lista *l)
    {
            if(!l)
                return 0;
           else
             return l->key + listaSomma(l->next);
    
    
    
    
    
  • Re: Liste semplici

    Hai eliminato la parte del codice che aggiunge gli elementi (funzione aggiungi) e ti dovrebbe dare la somma?

    Ma ci prendi in giro?
  • Re: Liste semplici

    Se non metti il valore di ritorno di listaSomma in una variabile e la stampi (o lo stampi direttamente), difficilmente vedrai il risultato.
  • Re: Liste semplici

    Andrea Quaglia ha scritto:


    Se non metti il valore di ritorno di listaSomma in una variabile e la stampi (o lo stampi direttamente), difficilmente vedrai il risultato.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct lista
    {    int key;
        struct lista *next;
    };
    
    struct lista *aggiungi(struct lista *top, struct lista *nuovo);
    struct lista *nuovo();
    void stampa(struct lista *top);
    struct lista *dealloca(struct lista *top);
    int listaSomma(struct lista *l);
    
    int main()
    {    int n;
        struct lista *top;
        printf("Inserisci il numero di elementi che la lista contiene: ");
        scanf("%d", &n);
        printf("Inserisci gli elementi: ");
        for ( ; n>0; n--)
            top = aggiungi(top, nuovo());
        printf("%d", listaSomma(n));
        top = dealloca(top);
        return 0;
    }
    
    struct lista *aggiungi(struct lista *top, struct lista *nuovo)
    {    if (top==NULL)
        {    nuovo->next = top;
            return nuovo;
        }
        top->next = aggiungi(top->next, nuovo);
        return top;
    }
    
    
    struct lista *nuovo()
    {    struct lista *nuovo = (struct lista *)malloc(sizeof(struct lista));
        scanf("%d", &nuovo->key);
        return nuovo;
    }
    
    
    void stampa(struct lista *top)
    {    if (top!=NULL)
        {    printf("%d --> ", top->key);
            stampa(top->next);
        }
        else printf("NULL\n\n");
        return;
    }
    
    
    struct lista *dealloca(struct lista *top)
    {    if(top!=NULL)
        {    dealloca(top->next);
            free(top);
        }
        return NULL;
    }
    int listaSomma(struct lista *l)
    {
            if(!l)
                return 0;
           else
            return l->key + listaSomma(l->next);
    }
    
    tipo cosi?
  • Re: Liste semplici

    Printf("%d", listaSomma(n));

    ?

    n è un intero, listaSomma accetta un parametro intero? Cosa accetta listaSomma e perché?
  • Re: Liste semplici

    oregon ha scritto:


    Printf("%d", listaSomma(n));

    ?

    n è un intero, listaSomma accetta un parametro intero? Cosa accetta listaSomma e perché?
    listaSomma prende: struct lista *l
  • Re: Liste semplici

    Che non è un int. Quindi perché hai passato n? E cosa devi passare invece?
  • Re: Liste semplici

    saraciao ha scritto:


    oregon ha scritto:


    Printf("%d", listaSomma(n));

    ?

    n è un intero, listaSomma accetta un parametro intero? Cosa accetta listaSomma e perché?
    listaSomma prende: struct lista *l
    al posso di n metto top pero poi mi stampa solo il primo elemento
  • Re: Liste semplici

    Comincia con scrivere il codice corretto e poi cerchi di capire cosa succede. Non scrivere cose a caso.

    Inizialmente, cosa che non hai fatto, top deve essere inizializzato a NULL. Fallo e riproponi tutto il codice.

    struct lista *top=NULL;
  • Re: Liste semplici

    oregon ha scritto:


    Comincia con scrivere il codice corretto e poi cerchi di capire cosa succede. Non scrivere cose a caso.

    Inizialmente, cosa che non hai fatto, top deve essere inizializzato a NULL. Fallo e riproponi tutto il codice.

    struct lista *top=NULL;
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct lista
    {    int key;
        struct lista *next;
    };
    
    struct lista *aggiungi(struct lista *top, struct lista *nuovo);
    struct lista *nuovo();
    void stampa(struct lista *top);
    struct lista *dealloca(struct lista *top);
    int listaSomma(struct lista *l);
    
    int main()
    {    int n;
        struct lista *top=NULL;
    
        printf("Inserisci il numero di elementi che la lista contiene: ");
        scanf("%d", &n);
        printf("Inserisci gli elementi: ");
        for ( ; n>0; n--)
            top = aggiungi(top, nuovo());
        printf("%d", listaSomma(top));
          top = dealloca(top);
        return 0;
    }
    
    struct lista *aggiungi(struct lista *top, struct lista *nuovo)
    {    if (top==NULL)
        {    nuovo->next = top;
            return nuovo;
        }
        top->next = aggiungi(top->next, nuovo);
        return top;
    }
    
    
    struct lista *nuovo()
    {    struct lista *nuovo = (struct lista *)malloc(sizeof(struct lista));
        scanf("%d", &nuovo->key);
        return nuovo;
    }
    
    
    void stampa(struct lista *top)
    {    if (top!=NULL)
        {    printf("%d --> ", top->key);
            stampa(top->next);
        }
        else printf("NULL\n\n");
        return;
    }
    
    
    struct lista *dealloca(struct lista *top)
    {    if(top!=NULL)
        {    dealloca(top->next);
            free(top);
        }
        return NULL;
    }
    int listaSomma(struct lista *l)
    {
            if(!l)
                return 0;
           else
            return l->key + listaSomma(l->next);
    }
    
    
    
    
    
  • Re: Liste semplici

    E quindi? Adesso funziona? Esprimiti ...
  • Re: Liste semplici

    oregon ha scritto:


    E quindi? Adesso funziona? Esprimiti ...
    no
  • Re: Liste semplici

    Perché rispondi a monosillabi? Cosa non va? Secondo me funziona ...
Devi accedere o registrarti per scrivere nel forum
38 risposte