Передача массива произвольных структурных указателей в функцию C? - PullRequest
1 голос
/ 01 ноября 2009

Я хочу передать массив произвольных структурных указателей и функцию сравнения в общий алгоритм сортировки. Возможно ли это в C?

Доступ к структурам будет возможен только в функции сравнения, функция сортировки должна будет вызывать только функцию сравнения и менять указатели, но я не могу понять, как ее объявить.

function sorter( struct arbitrary ** Array, int Length, int cmp(struct node * a, struct node * b))
{
    for (int i=0; i<Length;i++){
        if cmp(Array[i],Array[i+1]){
            swap(Array[i],Array[i+1]
       }
    }
}

Ответы [ 4 ]

3 голосов
/ 01 ноября 2009

Вы можете объявить функцию как:

void sorter(void** the_array, size_t array_length, int (*comparison_function)(void*, void*));

Внутри функции сравнения вам нужно будет привести два сравниваемых указателя к указателям к любому типу структуры, которую сравнивает функция сравнения.

1 голос
/ 01 ноября 2009

На самом деле эта функция уже существует ... она называется qsort. См. Некоторую документацию здесь . Это также более эффективно, чем ваша реализация, то есть O (n ^ 2).

0 голосов
/ 01 ноября 2009

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

Вы можете сделать это, используя функцию, специфичную для типа (если сравниваемые элементы одинаковы), или каким-либо образом кодировать тип в структуру. Это можно сделать, добавив в структуру дополнительное поле или изменив саму функцию cmp() на идентификатор типа.

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

Ваш алгоритм в его нынешнем виде выглядит как внутренний цикл пузырьковой сортировки и, как таковой, на самом деле не будет правильно сортироваться. Пузырьковая сортировка состоит из двух вложенных циклов и, как правило, подходит только для небольших наборов данных или наборов данных с определенными характеристиками (например, в основном уже отсортированными).

0 голосов
/ 01 ноября 2009

Может быть, вам нужно передать только пустые указатели?

function sorter(void ** Array, int Length, int cmp(void * a, void * b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...