Ciao, tra 8 giorni ho l'esame...inizio a capirci qualcosa ma mi sono impallato con la soluzione di questo esercizio (messa online dal proff ma mi sembra sbagliata ditemi voi)![]()
L'esercizio chiede di scrivere una funzione che presa in ingresso una lista di char elimini i doppioni e restituisca il puntatore alla lista cos modificata
Il codice della soluzione è questo (è quella del proff...io ho modificato solo la dichiarazione delle variabili e puntatori perchè mi trovo meglioa dichiararli all'inizio del codice anzichè in mezzo al codice...i commenti invece sono i miei, ditemi se ho sbagliato qualcosa):
Ci sono varie cose che non mi tornano:codice:/* La funzione RipulisciStr() prende in input il puntatore al primo nodo di una lista di interi, elimina i duplicati ritorna il puntatore al primo nodo della lista così ripulita, gli elementi della lista hanno il seguente tipo: typedef struct SList{ char *stringa; struct SList *next; } SList; */ typedef struct SList{ char *stringa; struct SList *next; } SList; SList *RipulisciStr(SList *L){ SList **pL; /* Dichiaro il doppio puntatore pL che contiene l'indirizzo della locazione corrente */ SList *elem; // Dichiara il puntatore elem pL = &L; // Imposta pL con l'indirizzo del primo elemento della lista (?) while(*pL != NULL){ // Finchè non si è giunti alla fine della lista elem = *pL; /* Imposta il valore di elem all'indirizzo del nodo puntato da Pl */ /* Se la funzione TrovaStr restituisce un valore non nullo */ if(TrovaStr(elem->stringa, elem->next)){ *pL = elem->next; /* Imposta il valore puntatoda da pL con l'indirizzo del campo next puntato da elem*/ free(elem->stringa); free(elem); } /* Se non è stato trovato un doppione nella lista pL contiene l'indirizzo del prossimo elemento rispetto al campo elem */ else pL = &(elem->next); } return L; } /* Funzione ausiliaria che determina se la stringa str è presente o meno nella lista di stringhe */ short TrovaStr(const char *str, const SList *L){ while(L != NULL && strcmp(str, L->stringa) != NULL) L = L->next; return(L != NULL); }
1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!
2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!
3) non ho capito bene che restituisce la funzione ausiliaria....
vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...

Rispondi quotando