Ciao,
oddioo l'esame si avvicina (è su carta, non deve girare eil proff guarda più che altro la logica che ci stà dietro)....questo era il primo esercizio di un vecchio esame...esercizio a sbarramento...ovvero se non si prendono 7 punti su 10 su questo puoi anche aver fatto gli altri esercizzi tutti perfetti ma sei tristemente bocciato...

Come logica ci dovrei essere...perchè ad occhio e croce è la stessa usata dal proff nella soluzione ma non mi gira e il compilatore dà vari errori...

Potete dirmi cosa ci sia di sbagliato e se come logica ci stà?

codice:
/* La funzione int Comp(LStr *L) riceve il puntatore al primo nodo della lista
   ordinata in senso non decrescente rispetto al valore del campo val, la
   modifica in modo tale che  elementi consecutivi che hanno lo stesso valore
   del campo val sono sostituiti da un elemento  il cui valore del campo val è
   lo stesso e il campo str è la stringa prodotta dalla concatenazione, nell'
   ordine, delle strighe degli elementi sostituiti. La funzione ritorna il
   numero massimo di elementi con lo stesso valore del campo val */
   
#include <stdio.h>
#include <stdlib.h>

typedef struct VStr{
    long val;
    char *str;
    struct VStr *next;
}VStr, *LStr;

int Comp(LStr *L){
    
    int max = 0;    // Valore massimo da restituire al chiamante
    int numvol = 0; // Numero di doppioni trovati per un determinato elemento
    int nuovalunghezza;    // Numero di caratteri della nuova stringa
    int val;        // Contiene il valore del campo val puntato da L
    
    LStr prev;    /* Contiene l'indirizzo del nodo che precede il nodo puntato
                     da L */
    
    prev = NULL;  // Inizialmente prev corrisponde a NULL perchè L punta 1° nodo
    
    while(L!=NULL)    // Scorre la lista fino alla fine
    
        /* Se L non punta al primo nodo e il valore del campo val del nodo
           precedente (messo in val) è uguale al valore del campo val del nodo
           corrente */
        
        if(prev != NULL && val == L->val){
            /* Calcola la nuova lunghezza della nuova stringa */
            nuovalunghezza = strlen(prev->str)+strlen(L->str);
            /* Rialloca dinamicamente per inserire la nuova stringa */
            prev->str = realloc((prev->str, (nuovalunghezza+1)*sizeof(char));
            /* Concatena le 2 strinhe nel campo str puntato da prev */
            strcat(prev->str, L->str);
            
            /* Linka il nodo puntato da prev al nodo puntato da L (L sarà
               eliminato) */
            prev->next = L->next;
            
            /* Libera la memoria del vettore il cui puntatore è nel campo str 
               puntato da L */
            free(L->str);
            /* Elimina il nodo L e libera la memoria */
            free(L);
            
            L = prev->next; // Aggiorna il valore di L al nodo successivo
            
            numvol++;       // Incrementa il numero di doppioni trovati
        }
        
        else{
            if(numvol > max)
                    max = numvol;
            
            numvol = 1;
            val = L->val;
            prev = L;
            L = L->next;
        }
        
        if(numvol > max)
                max = numvol;
        
        return max;
}
Ancora infinitamente grazie

Ciao
Andrea