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