这是更长的版本。(TL; DR版本在我的帖子标题中。)
让我们考虑一个quick_sort
当前设置如下的递归函数:(i)它接受一个参数-链表,(ii)以升序对元素进行排序,并且(iii)返回排序后的链表。以下是说明性代码(我可以根据要求发布实际代码-更长的时间)。
#include "list.h" /*our linked-list implementation which includes definitions
for `concatenate`, which we use below*/
typedef int (*ordinal(int referenceValue, int currentValue));
int smaller(int referenceValue, int currentValue)
{
return currentValue <= referenceValue ? 1 : 0;
}
int larger(int referenceValue, int currentValue)
{
return currentValue > referenceValue ? 1 : 0;
}
List *getElements(List *fullList, ordinal compare) /*let's assume this function exists*/
/*implementation of getElements*/
List* quickSort(List* originalList)
{
/*code to handle the two base cases, i.e., the cases
in which the input list has either 0 or 1 elements */
List *pivotElement = List_create();
List_push(pivotElement, originalList->first->value);
/*we're simply using the first element in the list as the pivot-point*/
List *prePivotElements = quickSort( getElements(originalList, smaller) );
List *postPivotElements = quickSort ( getElements(originalList, larger) );
List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);
return newList;
}
现在,我们要修改quick_sort
函数,使其具有两个参数:一个链表和一个函数指针数组。想法是使用第二个参数(即,函数指针的数组)指定排序顺序。函数调用的语法如下所示:quick_sort(linked_list, increasing[])
或quick_sort(linked_list, decreasing[])
。
我应该提到的是,我的重点是了解递归传递函数指针数组的可行性/正确语法,而不是算法效率等。换句话说,让我们尝试忽略可怕的效率/内存管理方面快速排序的这个特殊实现的内容:)
为了进行quick_sort
如上所述的修改,我认为以下代码可能会起作用...
#include "list.h"
typedef int (*ordinal(int referenceValue, int currentValue));
int smaller(int referenceValue, int currentValue)
{
return currentValue <= referenceValue ? 1 : 0;
}
int larger(int referenceValue, int currentValue)
{
return currentValue > referenceValue ? 1 : 0;
}
/*two new global arrays of function pointers*/
int (*increasing[2]) (int referenceValue, int currentValue) = {smaller, larger};
int (*decreasing[2]) (int referenceValue, int currentValue) = {larger, smaller};
List *getElements(List *fullList, ordinal compare)
/*implementation of getElements*/
/*updated argument list*/
List* quickSort(List* originalList, ordinal compare[])
{
/*base cases*/
List *pivotElement = List_create();
List_push(pivotElement, originalList->first->value);
/*updated recursive function call*/
List *prePivotElements =
quickSort( getElements(originalList, compare[0]), compare );
List *postPivotElements =
quickSort ( getElements(originalList, compare[1]), compare );
List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);
return newList;
}
...但是会导致以下错误:
error: declaration of ‘compare’ as array of functions
List* quickSort(List* originalList, ordinal compare[])
^
error: type of formal parameter 2 is incomplete
List *prePivotElements = quickSort( getElements(originalList, compare[0]), compare );
^
error: type of formal parameter 2 is incomplete
List *postPivotElements = quickSort ( getElements(originalList, compare[1]), compare );
^
概括一下我的问题:C是否允许我们将函数指针数组传递给其他函数?递归执行该怎么办?如果允许,正确的语法是什么?
请原谅,我相信你们中的一位资深人士会更加简洁!
(关于SO规则,all posted code must compile
在这种情况下,我认为坚持使用与概念相关的代码是有意义的。但是,如果人们愿意,我可以发布完整的.c
文件和.h
文件。)
更新:根据要求,这里是的工作版本的相关文件quick_sort
。我还包括了shell输出,包括用于编译/链接的命令。仅供参考,键盘给出了一些毫无意义的怪异错误(例如,在具有正确/可编译函数头的行上,声称我缺少括号):
quick_sort.c
:http://codepad.org/O2ZlWssllist.h
:http://codepad.org/SVS12bI5list.c
:http://codepad.org/x7pex3Tldbg.h
:http://codepad.org/ZRifL1hEtypedef int (*ordinal(int referenceValue, int currentValue));
是不正确的。它在语法上是有效的,但是括号没有作用,它仅定义函数类型而不是函数指针。正确定义函数指针的正确方法是
typedef int (*ordinal)(int, int);
括号是*
唯一的标识符(并且参数名称无关)。
并且使用该typedef更好地声明函数数组,而不是重复定义。
ordinal increasing[2] = {smaller, larger};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句