Liste semplici

di saraciao il
38 risposte

38 Risposte - Pagina 2

  • 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
  • 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);
    }
    
  • 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);
    
    
    
    
    
  • Hai eliminato la parte del codice che aggiunge gli elementi (funzione aggiungi) e ti dovrebbe dare la somma?

    Ma ci prendi in giro?
  • Se non metti il valore di ritorno di listaSomma in una variabile e la stampi (o lo stampi direttamente), difficilmente vedrai il risultato.
  • 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?
  • Printf("%d", listaSomma(n));

    ?

    n è un intero, listaSomma accetta un parametro intero? Cosa accetta listaSomma e perché?
  • 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
  • Che non è un int. Quindi perché hai passato n? E cosa devi passare invece?
  • 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
  • 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;
  • 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);
    }
    
    
    
    
    
  • E quindi? Adesso funziona? Esprimiti ...
  • oregon ha scritto:


    E quindi? Adesso funziona? Esprimiti ...
    no
  • Perché rispondi a monosillabi? Cosa non va? Secondo me funziona ...
Devi accedere o registrarti per scrivere nel forum
38 risposte