Простым решением было бы использовать указатель на функцию и передать указатель на функцию.
Я бы порекомендовал вам также объявить псевдоним для сигнатуры функции, чтобы через некоторое время вы не сошли с ума:)
Я предполагаю, что ll_node.data
имеет тип void *
.Таким образом, ваш связанный список требует двух вещей:
- Функция сравнения берет два пустых указателя, сравнивает их (используя инсайдерские знания).Функция сравнения должна знать, как обращаться с данными.Это требование, конечно, неявно применяется к человеку / коду / злому сотруднику, звонящему
ll_add_ordered
. - Функция сравнения возвращает 1, 0 или -1.
Псевдоним типа для такого указателя функции будет:
typedef int (*ll_comp_func)(void *, void*);
Если вы думаете, что этовыглядит сумасшедшим, вы совершенно правы.Он служит для того, чтобы сделать вас сумасшедшими убойными поздними ночами, когда ничего не работает.Как бы то ни было, на самом деле он создает typedef для указателя функции и вызывает псевдоним ll_comp_func
.
. Затем вы измените ваш ll_add_ordered
в следующую форму:
void ll_add_ordered(ll_node *head, void *d, ll_comp_func comparison){
// Do stuff.
int order = comparison(temp->data, cur->data);
// Do even more stuff.
}