Write the algorithm once, then let function pointers change how it behaves.
ListNode *sort_list(ListNode *lst, int (*cmp)(int, int))
void sort_records(record *arr, size_t n)
void qsort(void *base, size_t nmemb, size_t size, int (*cmp)(const void *, const void *))