Liste semplici

di il
38 risposte

Liste semplici

Buonasera sapete dirmi perche non mi funziona cioè inserisco il numero di elementi e gli elementi ma poi non somma tutti gli elementi presenti nella lista

#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);
void ListaSomma(Lista l)

int main()
{    int n;
    struct lista *top;
    system("clear");
    printf("Questo programma somma e sostituisce gli elementi consecutivi in una lista\n");
    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("\nEcco la lista inserita: ");
    stampa(top);
    sommaConsecutivi(top);
    printf("\nEcco la lista modificata: ");
    stampa(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;
}
void ListaSomma(Lista l) {
        if(isNull(l)) return 0;
        return *(int*)car(l) + somma(cdr(l));
}


} 

38 Risposte

  • Re: Liste semplici

    Secondo me il codice che hai postato non compila...
    Poi se non spieghi cosa dovrebbe fare con un esempio, difficile capire cosa non va.
  • Re: Liste semplici

    Andrea Quaglia ha scritto:


    Secondo me il codice che hai postato non compila...
    Poi se non spieghi cosa dovrebbe fare con un esempio, difficile capire cosa non va.
    tipo ho una lista=1,2,3,4
    deve calcolare 1+2+3+4
  • Re: Liste semplici

    Non hai provato a compilare il codice che hai postato!
    ||=== Build: Debug in ListeSemplici (compiler: GNU GCC Compiler) ===|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|13|error: unknown type name ‘Lista’|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|68|error: unknown type name ‘Lista’|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|74|error: expected identifier or ‘(’ before ‘}’ token|
    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    
  • Re: Liste semplici

    Ma hai copiato il codice di un programma Lisp?
  • Re: Liste semplici

    Andrea Quaglia ha scritto:


    Non hai provato a compilare il codice che hai postato!
    ||=== Build: Debug in ListeSemplici (compiler: GNU GCC Compiler) ===|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|13|error: unknown type name ‘Lista’|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|68|error: unknown type name ‘Lista’|
    /mnt/Disco2/SviluppoSW/ListeSemplici/main.c|74|error: expected identifier or ‘(’ before ‘}’ token|
    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    
    si ho provato e faceva quello che sta scritto sopra
  • Re: Liste semplici

    saraciao ha scritto:


    Andrea Quaglia ha scritto:


    Non hai provato a compilare il codice che hai postato!
    si ho provato e faceva quello che sta scritto sopra
    Prova a copiare e compilare il sorgente che hai postato...
  • Re: Liste semplici

    Intanto, la funzione ListaSomma non può avere tipo di ritorno 'void'.
  • Re: Liste semplici

    Andrea Quaglia ha scritto:


    Intanto, la funzione ListaSomma non può avere tipo di ritorno 'void'.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct lista
    {
        int key;
        int ITEM;
        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 SUM(struct lista *radice);
    int HEAD(struct lista *radice);
    int TAIL( struct lista *radice);
    
    
    
    int main()
    {    int n;
        struct lista *top;
        system("clear");
        printf("Questo programma somma e sostituisce gli elementi consecutivi in una lista\n");
        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("\nEcco la lista inserita: ");
        stampa(top);
        sommaConsecutivi(top);
        printf("\nEcco la lista modificata: ");
        stampa(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 HEAD(struct lista *radice)
        {
            if(radice == nil){
                return nil;
            }else{
                return radice-->ITEM;
        }
    }
    
    int TAIL( struct lista *radice)
        {
            if(radice == nil)
                return nil
            else
                return radice-->next;
        }
    }
     int SUM(struct lista *radice)
       {
           if(radice == nil)
               return 0;
           else
              return (HEAD(radice)+SUM(TAIL(radice)));
    }
    
    
    Ho provato cosi ma comunque mi da errore...come posso fare?
  • Re: Liste semplici

    Ma scrivi cose a caso?

    Esiste nil in C?

    Riparti dalla funzione che avevi scritto ovvero

    void ListaSomma(struct lista *l);

    e togli quella HEAD e TAIL.

    In C per capire se è null si scrive

    if (!l) return 0;

    E poi, come sempre nei tuoi post, non si capisce di quali errori parli. Non ne elenchi neanche uno e non li affronti ma li lasci a chi ti risponde.
  • Re: Liste semplici

    oregon ha scritto:


    Ma scrivi cose a caso?

    Esiste nil in C?

    Riparti dalla funzione che avevi scritto ovvero

    void ListaSomma(struct lista *l);

    e togli quella HEAD e TAIL.

    In C per capire se è null si scrive

    if (!l) return 0;

    E poi, come sempre nei tuoi post, non si capisce di quali errori parli. Non ne elenchi neanche uno e non li affronti ma li lasci a chi ti risponde.
    
    #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;
        system("clear");
        printf("Questo programma somma e sostituisce gli elementi consecutivi in una lista\n");
        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("\nEcco la lista inserita: ");
        stampa(top);
        sommaConsecutivi(top);
        printf("\nEcco la lista modificata: ");
        stampa(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 *(int*)car(l) + somma(cdr(l));
    }
    
    
    corretto
  • Re: Liste semplici

    E come fa questo

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

    a compilare dato che non si sa cosa sia car, cdr e somma??
  • Re: Liste semplici

    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
  • Re: Liste semplici

    Sì, dovrebbe, ma non scritta in quel modo.

    Ho il forte sospetto che tu non conosce affatto le basi del linguaggio C. In questo caso, è un problema discutere.
  • Re: Liste semplici

    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.
Devi accedere o registrarti per scrivere nel forum
38 risposte