noiseimpera
29-03-2010, 20:30
Devo implementare una funz. void free_List (list_t ** pt) che libera l'area di memoria occupata da una lista.
la struttura dati lista è così definita:
typedef struct {
/** la testa della lista */
elem_t * head;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
} list_t;
typedef struct elem {
/** chiave */
void * key;
/** informazione */
void * payload;
/** puntatore elemento successivo */
struct elem * next;
} elem_t;
la mia implementazione della freeList è la seguente:
void free_List (list_t ** pt){
if(!(*pt))
errno = EINVAL;
else{
/**Se la lista non è vuota libera l'area di memoria occupata da tutti i suoi elementi*/
if ((*pt)->head!=NULL)
liberalista((*pt)->head);
free(*pt);
(*pt)=NULL;}
return;
}
void liberalista (elem_t *e){
elem_t* tmp = e->next;
free(e->key);
free(e->payload);
free(e);
if(tmp!=NULL) liberalista(tmp);
}
non sono sicuro della sua correttezza in quanto un utilizzo della stessa in un programma che lavora su tabelle hash che risolvono collisioni con le liste non va a buon fine.
sapreste dirmi se c'è qualche problema? grazie.
la struttura dati lista è così definita:
typedef struct {
/** la testa della lista */
elem_t * head;
/** la funzione per confrontare due chiavi */
int (* compare) (void *, void *);
/** la funzione per copiare una chiave */
void * (* copyk) (void *);
/** la funzione per copiare un payload*/
void * (* copyp) (void *);
} list_t;
typedef struct elem {
/** chiave */
void * key;
/** informazione */
void * payload;
/** puntatore elemento successivo */
struct elem * next;
} elem_t;
la mia implementazione della freeList è la seguente:
void free_List (list_t ** pt){
if(!(*pt))
errno = EINVAL;
else{
/**Se la lista non è vuota libera l'area di memoria occupata da tutti i suoi elementi*/
if ((*pt)->head!=NULL)
liberalista((*pt)->head);
free(*pt);
(*pt)=NULL;}
return;
}
void liberalista (elem_t *e){
elem_t* tmp = e->next;
free(e->key);
free(e->payload);
free(e);
if(tmp!=NULL) liberalista(tmp);
}
non sono sicuro della sua correttezza in quanto un utilizzo della stessa in un programma che lavora su tabelle hash che risolvono collisioni con le liste non va a buon fine.
sapreste dirmi se c'è qualche problema? grazie.