将任意结构指针数组传递给C函数?

将任意结构指针数组传递给C函数?,c,sorting,function-pointers,C,Sorting,Function Pointers,我想将任意结构指针数组和比较函数传递给通用排序算法。这在C语言中是可能的吗 结构的goooys只能在比较函数中访问,排序函数只需要调用比较函数和交换指针,但我不知道如何声明它 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],A

我想将任意结构指针数组和比较函数传递给通用排序算法。这在C语言中是可能的吗

结构的goooys只能在比较函数中访问,排序函数只需要调用比较函数和交换指针,但我不知道如何声明它

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]
       }
    }
}
函数分类器(结构任意**数组,整数长度,整数cmp(结构节点*a,结构节点*b))
{

对于(inti=0;i也许您只需要传递void指针

function sorter(void ** Array, int Length, int cmp(void * a, void * b))

也许你只需要传递空指针

function sorter(void ** Array, int Length, int cmp(void * a, void * b))

您可以将函数声明为:

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

在比较函数内部,您将需要将要比较的两个指针转换为比较函数比较的任何结构类型的指针。

您可以将函数声明为:

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

在比较函数内部,您将需要将要比较的两个指针转换为比较函数比较的任何结构类型的指针。

在C中总是可能的,因为您可以将每个指针转换为
void*
。但是,如果您想将其转换回指向任意st的指针结构,您需要某种类型的标识

您可以通过使用特定于类型的函数(如果您正在比较的是相同的),或者以某种方式将类型编码到结构中。这可以通过在结构中有一个额外的字段或者通过更改
cmp()
函数本身来获取类型标识符来实现

但是您应该知道,C已经有了一个通常相当有效的
qsort()
函数(尽管标准中没有规定它使用什么算法-它可以使用冒泡排序,但仍然符合要求).除非你为家庭作业实施了一个算法,或者考虑了一个不同的算法,否则tou可能就应该使用它


目前,您的算法看起来像冒泡排序的内部循环,因此实际上无法正确排序。冒泡排序由两个嵌套循环组成,通常仅适用于小数据集或具有特定特征的数据集(例如大部分已排序).

在C中总是可能的,因为您可以将每个指针转换为
void*
。但是,如果您想将其转换回指向任意结构的指针,则需要某种类型的标识

您可以通过使用特定于类型的函数(如果您正在比较的是相同的),或者以某种方式将类型编码到结构中。这可以通过在结构中有一个额外的字段或者通过更改
cmp()
函数本身来获取类型标识符来实现

但是您应该知道,C已经有了一个通常相当有效的
qsort()
函数(尽管标准中没有规定它使用什么算法-它可以使用冒泡排序,但仍然符合要求).除非你为家庭作业实施了一个算法,或者考虑了一个不同的算法,否则tou可能就应该使用它


目前,您的算法看起来像冒泡排序的内部循环,因此实际上无法正确排序。冒泡排序由两个嵌套循环组成,通常仅适用于小数据集或具有特定特征的数据集(例如大部分已排序).

实际上,这个函数已经存在了…它被称为
qsort
。请参阅一些文档。它也比您的实现O(n^2)更高效。

实际上,这个函数已经存在了…它被称为
qsort
。请参阅一些文档。它也比您的实现O(n^2)更高效.

你的意思是“你不必解除指针的防护”,是吗?但OP似乎已经知道了这一点。@AndreyT:我在StackOverflow上睡得很晚时就会发生这种情况;很抱歉造成混乱。@ABentSpoon:不客气。你的意思是“你不必解除指针的防护”,是吗?但OP似乎已经知道了。@AndreyT:这就是我在StackOverflow上熬夜时发生的事情;很抱歉造成混乱。@ABentSpoon:不客气。事实上,这个实现是O(n),对于排序例程来说非常好,除了它不排序的事实:-)实际上,我的是O(n),但它只对接近排序的数组进行排序:)。不过,谢谢。我肯定会利用这一点。通常有mergesort()对于几乎排序的数组来说,在libc上也是如此。记住,它比qsort消耗的内存多一点。从技术上讲,你不能说qsort将消耗多少内存,因为标准没有指定算法。它不一定是快速排序。实际上,该实现是O(n)这对于排序例程来说是非常好的,除了它不排序的事实:-)事实上,我的是O(n),但它只对接近排序的数组进行排序:)。不过,谢谢。我肯定会利用这一点。通常有mergesort()对于几乎排序的数组来说,在libc上也是如此。但是请记住,它比qsort消耗的内存多一点。从技术上讲,你不能说qsort将消耗多少内存,因为标准没有指定算法。它不一定是快速排序。请注意缓冲区溢出。在你的代码中,在最后一次循环中,
i+1
将尝试访问不远处的元素。请注意缓冲区溢出。在代码中,在最后一次通过循环时,
i+1
将尝试访问不远处的元素。