我正在阅读算法设计手册,在第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();
行。那条线上发生了什么?我猜它是一个指向函数的指针,但我的理解是你应该用适当的参数声明函数指针。另外,假设我是正确的,为什么这些行甚至需要?
答案 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