Dovresti chiarire se questa lista generica è pensata per essere specializzata con un tipo specifico di dato (es. tutti int, tutti char, tutti quel che è), oppure ogni singolo nodo può essere specializzato per un tipo di dato diverso.
Nel primo caso la cosa è banale.
La copyk (e le altre) sono puntatori a funzione (come si vede dalla dichiarazione) a cui devi fornire una specializzazione valida.
Ad esempio per una lista di int:
codice:void* copy_key(void* p) { int *pi = (int*) p; int *new_value = malloc(sizeof(int)); *new_value = *pi; return (void*) new_value; } int compare_element(void *a, void *b) { int* pa = (int*) a; int* pb = (int*) b; if ((*pa) == (*pb)) return 0; return -1; } void* copy_paylod(void *b) { ... } list_t * new_List(compare_element,copy_key,copy_paylod);