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

问题描述:

我想传递一个任意的结构指针数组和比较函数到一个通用的排序算法。这可能在C吗?将任意结构指针的数组传递给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] 
     } 
    } 
} 
+0

注意**缓冲区溢出**。在你的代码中,通过循环的最后一遍,'i + 1'将尝试访问一个不可知的元素。 – pmg 2009-11-01 11:55:55

你可以声明功能:

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

里面的比较函数,您将需要转换的两个指针被比指向任何结构类型的比较功能进行比较。

+0

你的意思是“你*不*必须去掉指针”,是吗?但OP似乎已经知道了。 – AnT 2009-11-01 05:37:49

+0

谢谢,我不知道我可以使用那样的void指针。 – ABentSpoon 2009-11-01 05:41:22

+0

@AndreyT:当我在*上迟到时会发生这种情况;对困惑感到抱歉。 @ABentSpoon:不客气。 – 2009-11-01 05:45:10

也许你只需要传递void指针?

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

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

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

但是你应该知道,C处已经有一个qsort()功能,这通常是相当有效的(虽然没有什么在决定哪种算法,它使用了标准的 - 它可能使用冒泡排序,仍然是符合)。除非你正在实现一个功课,或者有一个不同的算法,头部应该可以使用它。

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

其实这个功能已经存在了...它叫做qsort。查看一些文档here。它比你的实现更有效率,它是O(n^2)。

+0

实际上,那个实现是O(n)对于排序例程来说非常好,除了它不排序的事实:-) – paxdiablo 2009-11-01 05:45:49

+0

实际上,我的是O(n),但它只排序几乎排序的数组:)。但是,谢谢。我一定会利用这一点。 – ABentSpoon 2009-11-01 05:48:14

+0

对于几乎有序数组的情况,libc通常也有mergesort()。不过记住它比qsort消耗更多的内存。 – alecco 2009-11-01 07:11:28