Ciao....altro esercizio per l'esame di programmazione 1...questa volta non ho guardato la soluzione del proff e l'ho risolto a modo mio (diverso da come l'ha fatto lui...) dite che può andare?è decente come soluzione o fà schifo?

L'esercizio dice:

Scrivere una funzione con prototipo int *extract(List *pL, int *nE) che elimini dalla lista *pL gli elementi x per i quali esiste un elemento successivo y tale y.cod > x.cod, alloca dinamicamente un vettore che contiene i valori dei campi cod degli elementi eliminati, restituisce in *pL il puntatore al primo elemento della lista modificata, in *nE il numero degli elementi eliminati e ritorna il vettore.

Se non ci sono elementi eliminati la funzione ritorna NULL. Si assume che i valori dei campi cod siano tutti distinti

Esempio: se la lista è 5->12->7->10->9 viene modificata in: 5->7->9, il vettore creato è [12, 10] e in *nE è restituito 2.

Mia Soluzione:

codice:
/* La funzione extract() riceve il puntatore al primo nodo della lista e il
   puntatore alla variabile nE dove andare ad inserire il numero degli elementi
   eliminati e ritorna l'indirizzo del vettore di interi */

#include <stdio.h>
#include <stdlib.h>
   
typedef struct Elem{
    int cod;
    struct Elem *next;
} Elem, *List;    

int *extract(List *pL, int *nE){
    
    List L;         // Dichiaro il puntatore al nodo corrente
    List succ;      // Dichiaro il puntatore al nodo successivo
    int dimvet;    // Numero di elementi che compongono il vettore
    int *vett=NULL;     // Puntatore alla prima locazione del vettore di interi
    int val1;     // Contiene il valore del campo cod del nodo puntato da L
    int val2;     // Contiene il valore del campo cod del nodo puntato da suc
    int contatore = 0;    // Indice di scorrimento del vettore
    
    L = pL;           // Setta L al primo nodo della lista
    succ = L->next;    // Setta suc al nodo successivo ad L
    
    /* Ciclo che calcola quanti elementi vanno eliminati dalla lista e quante
       locazioni dovranno essere allocate per il vettore di interi vet */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){       // Se la funzione Less restituisce 1
                dimvet++;                // incrementa dimvet
        }
        
        L = L->next;    // Aggiorna L e fallo puntare al prossimo nodo
        succ = succ->next; // Aggiorna succ e fallo puntare al prossimo nodo
        *nE = dimvet;
    }
    
    vett = calloc(dimvet, sizeof(int)); // Alloca un vettore di dimevet interi
    
    L = pL;    // Reimposta nuovamente il puntatore L al primo nodo della lista
    succ = L->next;    // Reimposta suc al nodo successivo a L
    
    /* Ciclo che salva i valori da eliminare nel vettore ed elimina i nodi */
    
    while(succ != NULL){
        
        val1 = L->cod;
        val2 = succ->cod;
        
        if(Less(val1, val2) == 1){    // Se la funzione Less restituisce 1
                
                /* Imposta il valore del campo next puntato da L con il valore
                   del campo next del nodo puntato da succ */
                L->next = succ->next;
                
                /* Copia il valore del campo cod del nodo puntato da suc nel
                   vettore di interi alla posizione indicizzata da contatore */
                vett[contatore] = succ->cod;
                
                contatore++;    // Incrementa il contatore
                
                free(succ);    // Elimina il nodo puntato da succ 
        }
        
       L = pL;    // Reimposta nuovamente il puntatore L al primo nodo
       succ = L->next;    // Reimposta suc al nodo successivo a L
   }
   
   return(vett);       // Ritorna il puntatore alla prima locazione del vettore
}

/* La funzione Less() riceve il valore del campo cod del nodo corrente e il
   valore del campo cod del nodo successivo, se il valore corrente < del valore
   successivo restituisce 1, 0 altrimenti */
   
short Less(int val, int valsucc){
    
    if(valsucc > val)
          return 1;
    else
      return 0;
}
Grazie
Andrea