代码之家  ›  专栏  ›  技术社区  ›  ABentSpoon Ungue

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

  •  1
  • ABentSpoon Ungue  · 技术社区  · 15 年前

    我要将任意结构指针数组和比较函数传递给通用排序算法。用C语言可以吗?

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

    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 回复  |  直到 15 年前
        1
  •  3
  •   James McNellis    15 年前

    您可以将函数声明为:

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

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

        2
  •  1
  •   rlbond    15 年前

    实际上,这个函数已经存在…它叫 qsort . 参见一些文档 here . 它也比您的实现(即O(n^2))更有效。

        3
  •  0
  •   user181548    15 年前

    也许你需要通过空指针?

    function sorter(void ** Array, int Length, int cmp(void * a, void * b))
    
        4
  •  0
  •   paxdiablo    15 年前

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

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

    但是你应该知道C已经有了 qsort() 通常效率相当高的函数(尽管标准中没有规定它使用什么算法的函数-it 能够 使用气泡分类,仍然保持一致)。除非您正在为家庭作业实现一个,或者在头脑中有一个不同的算法,否则TOU应该只使用它。

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