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:
Graziecodice:/* 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; }
Andrea

					
					
					
						
  Rispondi quotando
, perchè nella dichiarazione
  