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):
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);
}
Ci sono varie cose che non mi tornano:
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...