将一个任意struct指针数组传递给C函数?

时间:2009-11-01 05:26:26

标签: c sorting function-pointers

我想将一个任意struct指针数组和一个比较函数传递给泛型排序算法。这可能在C?

结构的goooeys只能在比较函数中访问,sort函数只需要调用比较函数和交换指针,但我无法弄清楚如何声明它。

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 个答案:

答案 0 :(得分:3)

您可以将该函数声明为:

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

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

答案 1 :(得分:1)

实际上,这个功能已经存在......它被称为qsort。请参阅一些文档here。它也比你的实现更有效,即O(n ^ 2)。

答案 2 :(得分:0)

也许你需要传递空指针?

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

答案 3 :(得分:0)

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

您可以通过使用特定于该类型的函数(如果您要比较的内容相同)来执行此操作,或者以某种方式将类型编码到结构中。这可以通过在结构中添加一个额外字段或通过更改cmp()函数本身来获取类型标识符来完成。

但你应该知道C已经有一个qsort()函数,它通常效率很高(虽然标准中没有任何内容决定它使用什么算法 - 它可以使用冒泡排序和仍然符合)。除非你正在实施一个家庭作业,或者考虑到不同的算法,否则你应该只使用它。

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