算法设计手册,第3章,链表代码片段混淆

时间:2014-03-19 06:21:52

标签: c algorithm pointers function-pointers

我正在阅读算法设计手册,在第3章中,会出现以下代码段。它与从链表中删除项目有关。这个问题与数据结构无关,只与一行代码相关,其中两个变量被声明为我认为。为简洁起见,我删除了代码中不相关的部分。

list *search_list(list *l, item_type x) {
  // This function just searches the list x
}

list *predecessor_list(list *l, item_type x) {
  // This function simply returns the predecessor of x or NULL
}

delete_list(list **l, item_type x) {
  list *p;     /* item pointer */
  list *pred;  /* predecessor pointer */

  list *search_list(), *predecessor_list(); // What are these declarations?

  p = search_list(*l,x);

  // Code to delete the node if found is here    
}

我的问题出在delete_list function,特别是list *search_list(), *predecessor_list();行。那条线上发生了什么?我猜它是一个指向函数的指针,但我的理解是你应该用适当的参数声明函数指针。另外,假设我是正确的,为什么这些行甚至需要?

2 个答案:

答案 0 :(得分:3)

有问题的一行,

list *search_list(), *predecessor_list();

通知编译器identifier存在function及其返回类型是什么。在这种情况下,不需要函数所需的参数的数量和类型。

我同意它有点奇特而且不太直观,但是,C语言支持许多这样的特性。

Dabo对您的问题的评论中提供的链接更详细:Why does an empty declaration work for definitions with int arguments but not for float arguments?

答案 1 :(得分:2)

这些是函数声明,用于通知search_list()predecessor_list()返回list*。如果在声明它之前使用函数,它将被隐式声明为'function returning int'。如果在search_list()之前定义的函数predecessor_list()delete_list,您将不再需要这些声明。

尝试在delete_list之后放置这些函数并删除声明,您将得到conflicting types for search_list(),因为编译器会认为search_list()predecessor_list()应该返回int