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;
}