Это всегда возможно в C просто потому, что вы можете конвертировать каждый указатель в void*
. Но если вы хотите иметь возможность преобразовать это обратно в указатель на произвольную структуру, вам понадобится какая-то идентификация типа.
Вы можете сделать это, используя функцию, специфичную для типа (если сравниваемые элементы одинаковы), или каким-либо образом кодировать тип в структуру. Это можно сделать, добавив в структуру дополнительное поле или изменив саму функцию cmp()
на идентификатор типа.
Но вы должны знать, что C уже имеет функцию qsort()
, которая обычно достаточно эффективна (хотя в стандарте нет ничего, что определяло бы, какой алгоритм он использует - он мог бы использовать пузырьковую сортировку и при этом соответствовать ). Если вы не реализуете его для домашней работы или не имеете в виду другой алгоритм, вам, вероятно, следует просто использовать это.
Ваш алгоритм в его нынешнем виде выглядит как внутренний цикл пузырьковой сортировки и, как таковой, на самом деле не будет правильно сортироваться. Пузырьковая сортировка состоит из двух вложенных циклов и, как правило, подходит только для небольших наборов данных или наборов данных с определенными характеристиками (например, в основном уже отсортированными).