Liste in C

di il
6 risposte

Liste in C

Salve a tutti. sono alle prese con questo esercizio:
Realizzare la funzione f(L) in base alla specifica seguente. La
funzione accetta come parametro una lista L di interi. La lista e'
garantita essere non vuota.

La funzione deve restituire la somma dei valori presenti nei nodi
che si trovano tra la prima e l'ultima occorrenza del valore 0
(incluse o escluse, non fa differenza). Nel caso in cui nella lista
ci siano meno di due occorrenze del valore 0, la funzione deve
restituire 0.

Ad esempio, se L = (13, 0, 2, -7, 21, -7, 0, 13, 0, 12) la funzione
deve restituire (2 - 7 + 21 - 7 + 0 + 13) = 22


io l'ho svolto cosi: qualcuno potrebbe aiutarmi a trovare l'errore? grazie in anticipo
[
#include <stdio.h>
#include <stdlib.h>

struct list {
    int val;
    struct list *next;
};

int f(struct list *L)
{
    int s=0;
    while (L!=NULL && L->val !=0){
        L=L->next;
    }
        if(L==NULL){
            return 0;
        }else {
            L=L->next ;
        
            while(L!=NULL && L->val != 0) {
                s += L->val;
                L = L->next;
            }
        }
      return s;
      }
      
      void test(struct list *L, int expect)
{
    int result = f(L);

    if (result == expect) {
        printf("Test OK\n");
    } else {
        printf("Test FALLITO: risultato atteso=%d, risultato ottenuto=%d\n", expect, result);
    }
}

struct list  *list_create(int v, struct list *t)
{
    struct list *r=(struct list *)malloc(sizeof(struct list));
    r->val = v;
    r->next = t;
    return r;
}
struct list *list_from_array(int v[], int n)
{
    if ( n == 0 ) {
        return NULL;
    } else {
        return list_create( v[0], list_from_array(v+1, n-1));
    }
}
#define LIST_FROM_ARRAY(a) list_from_array(a, (sizeof(a)/sizeof(a[0])))
        
int main( void )
{
    int in1[] = {13, 0, 2, -7, 21, -7, 0, 13, 0, 12};
    int out1 = (2 - 7 + 21 - 7 + 0 + 13);
    struct list *L1_in = LIST_FROM_ARRAY(in1);

    int in2[] = {0, 1, 2, 3, 4, 0, 4, 5, 6, 0, 1, 2, -1, 3, 0};
    int out2 = (1 + 2 + 3 + 4 + 0 + 4 + 5 + 6 + 0 + 1 + 2 - 1 + 3);
    struct list *L2_in = LIST_FROM_ARRAY(in2);

    int in3[] = {0, 0, 0, 0, 0, 0, 0, 0};
    int out3 = 0;
    struct list *L3_in = LIST_FROM_ARRAY(in3);

    int in4[] = {13, 8, 9, -1, 2, -1, -1, 0, 3, 2};
    int out4 = 0; /* non ci sono due zeri nella lista */
    struct list *L4_in = LIST_FROM_ARRAY(in4);
    
    printf("=== Inizio test ===\n");
    test(NULL, 0);
    test(L1_in, out1);
    test(L2_in, out2);
    test(L3_in, out3);
    test(L4_in, out4);
    printf("=== Fine test ===\n");
    
    return 0;
}

6 Risposte

  • Re: Liste in C

    Usa i tag CODE quando posti del codice o potrebbe risultare confuso.

    Poi parli di errore. Quale errore? Non compila? Hai un errore a runtime? Quale? Dove? Non fornisce i risultati sperati?

    Cosa è LIST_FROM_ARRAY ? Quale codice hai usato ?
  • Re: Liste in C

    Si scusate, sono nuova.. L'errore è che non verifica tutti i test.
  • Re: Liste in C

    E la LIST_FROM_ARRAY ?
  • Re: Liste in C

    Quella parte è già presente nel testo dell’esercizio e riguarda solo la verifica dei test, la mia domanda riguarda invece la correttezza del codice presente qui:
    int f(struct list *L)
    {
    int s=0;
    while (L!=NULL && L->val !=0){
    L=L->next;
    }
    if(L==NULL){
    return 0;
    }else {
    L=L->next ;

    while(L!=NULL && L->val != 0) {
    s += L->val;
    L = L->next;
    }
    }
    return s;
    }
  • Re: Liste in C

    Ti avevo già indicato di usare i tag CODE per il codice ..

    E comunque avevo capito cosa chiedevi tu. Io ti chiedevo di pubblicare il codice della funzione list_from_array per fare delle prove
  • Re: Liste in C

    Si, scusami.. ho sistemato il codice
Devi accedere o registrarti per scrivere nel forum
6 risposte