[C], può andar bene questa soluzione?
L'esame è il 15...può andar bene questa soluzione:


/* La funzione Agg(), modifica i valori del campo val degli elementi della lista
L in modo tale che il valore del campo val di un elemento m sia pari alla
somma dei (vecchi) valori dei campi val dell'elemento m e degli elementi
successivi che sono interi dispari.
Esempio: se la sequenza dei valori dei campi val della lista era:2,5,8,3,2,4
allora l funzione la modifica così: 10,8,11,3,2,4. */

codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct Elem{
    long val;
    struct Elem *next;
} Elem, *List;    

void Agg(List L){
    
    /* Dichiaro il puntatore al nodo corrente e lo setto al primo nodo */
    List corrente = L; 
    
    while(corrente != NULL){    // Finchè non raggiunge la fine della lista
        L->val += Som(L->next);
        L = L->next;        // Passa al prossimo nodo
    }
}


/* La funzione Som() riceve l'indirizzo del nodo successivo al nodo corrente e
   calcola la somma di tutti gli elementi aventi campo val dispari per poi
   restituire il risultato alla funzione Agg() */
   
long Som(List L){
    
    long somma = 0;
    
    if(L == 0)    return 0;   // Se non ci sono altri elementi la somma è 0
    
    else{
        while(L->next != NULL){
            if(L->val%2==1) // Se il campo val del nodo puntato da L è dispari
                 somma += L->val;
            
            L = L->next;    // Passa al prossimo nodo
        }
    return somma;            // Ritorna ad Agg il valore della somma
    }
}
Grazie
Andrea
La soluzione è giusta modificando la condizione del while della funzione somma in

while(L != NULL)

anche se non è molto efficiente in quanto scorri la lista per ogni elemento; ricorrendo alla ricorsione si può fare di meglio: l'idea e di avere una funzione ricorsiva che si occupa di aggiornare l'elemento su cui è chiamata facendo in modo che la funzione lavori dall'ultimo elemento verso il primo in modo che con un'unica passata sia progressivamente calcolata la somma da aggiungere al campo val di un elemento.


Codice PHP:
void Agg(List L){
    if((
== NULL) || (-> next == NULL)
        return;
    
//valore dell'elemento successivo prima dell'aggiornamento
    
int prima -> next -> val;
    
//aggiorno l'elemento successivo
    
Agg(-> next);
    
//Ora aggiorno l'elemento corrente: sommo il contributo
    //dei numeri dispari che è arrivato all'elemento successivo
    //e che corrisponde al suo incremento
    
-> val -> val + (-> next -> val prima);
    
//e infine sommo il vecchio valore dellìelemento successivo
    //se era dispari
    
if((prima 2) == 1)
        
-> val -> val prima;