D4rkAng3l
23-05-2005, 18:04
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) :cry:
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):
/* 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...
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):
/* 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...