sì, hai ragione, non avevo notato.
Ho provato ad implementare le altre funzioni:
la free in questa maniera dealloca tutto correttamente? Inoltre leggevo da qualche parte che è consigliato settare a NULL quando si dealloca (facendo cioè un key_element = NULL dopo la chiamata alla free?), anche se non ho ben capito il motivo.codice:int remove_ListElement(list_t * t,void * key) { elem_t *key_element_prec; elem_t *key_element; key_element_prec = key_element = t->head; /*primo elemento*/ if (t->head->key == key) { t->head = t->head->next; /*dealloco memoria*/ free(key_element); return 0; } /*altri elementi*/ while (key_element != NULL) { key_element = key_element->next; if (key_element->key == key) { key_element_prec->next = key_element->next; free(key_element); return 0; } key_element_prec = key_element; } return -1; }
qui avrei un dubbio: non esiste un modo per creare una versione ricorsiva della find? Il mio problema è che tale funzione prende in ingresso la lista e non un elemento della lista, quindi non mi sarebbe stato possibile fare una cosa del tipo:codice:elem_t *find_ListElement(list_t *t, void* key) { elem_t *current = t->head; while (current != NULL) { if (t->compare(current->key, key) == 0) return current; current = current->next; } return NULL; }
proprio perché nel passo ricorsivo come primo parametro vuole un tipo list_t* piuttosto che un elem_t*codice:elem_t *find_ListElement(list_t *t, void* key) { if (t->head == NULL ) return NULL; if (compare(t->head ->key, key)==0) return t->head; return find_ListElement(t->head->next , key); }. Devo necessariamente arrangiarmi con la versione iterativa? :master:
Mi resta da implementare la free e la new_list, con questi prototipi:
Avrei un paio di dubbi, giusto uno per ciascuna funzionecodice:list_t * new_List(int (* compare) (void *, void *),void* (* copyk) (void *),void* (*copyp) (void*)); void free_List (list_t ** pt);:
1) perché la new_list prende come argomenti le funzioni compare, copyk e copyp? Nel momento in cui creo la lista di tipo list_t non dovrei comunque poter avere accesso alle 3 funzioni in quanto all'interno della struct di definizione?
2) perché la free prende in ingresso un puntatore ad un puntatore alla lista? Mi si ripresenta lo stesso problema della find. Avesse preso in ingresso un parametro elem_t*, potevo facilmente implementare questa versione ricorsiva (ammettendo pt il primo elemento della lista):
Grazie mille per la pazienzacodice:void free_List (elem_t* pt) { if (pt == NULL) return; elem_t* node = pt->next; free(pt); free_List(node); }![]()

. Devo necessariamente arrangiarmi con la versione iterativa? :master:
:
Rispondi quotando