Liste semplici

di saraciao il
38 risposte
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

  • Secondo me il codice che hai postato non compila...
    Poi se non spieghi cosa dovrebbe fare con un esempio, difficile capire cosa non va.
  • 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
  • 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)) ===|
    
  • Ma hai copiato il codice di un programma Lisp?
  • 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
  • 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...
  • Intanto, la funzione ListaSomma non può avere tipo di ritorno 'void'.
  • 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?
  • 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.
  • 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
  • E come fa questo

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

    a compilare dato che non si sa cosa sia car, cdr e somma??
  • 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
  • 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.
  • 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