【问题标题】:Algorithm Design Manual, chapter 3, linked-list code snippet confusion算法设计手册,第 3 章,链表代码片段混淆
【发布时间】:2014-03-19 06:21:52
【问题描述】:

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

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(); 行。那条线上发生了什么?我猜它是一个指向函数的指针,但我的理解是你应该用适当的参数声明函数指针。另外,假设我是对的,为什么还需要这些行?

【问题讨论】:

  • 我猜这些是函数声明,(不是原型,声明)。在这里阅读stackoverflow.com/a/5481685/2549281,我很确定它们不是必需的。尝试删除它们。
  • 删除它们后代码可以正常工作,但是乍一看,这很奇怪。我把它读作“search_list 是一个指向返回列表的函数的指针”,这显然没有意义。
  • 您的大部分问题都已得到解答,因此我将仅评论您所说的部分:“我猜它是指向函数的指针”。供将来参考 - 指向函数的指针需要在 * 和函数名称周围加上括号:list (*search_list)()

标签: c algorithm pointers function-pointers


【解决方案1】:

有问题的行,

list *search_list(), *predecessor_list();

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

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

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

【讨论】:

    【解决方案2】:

    这些是函数声明,通知search_list()predecessor_list() 返回list*。如果在声明之前使用函数,它会被隐式声明为“函数返回 int”。如果函数 search_list()predecessor_list()delete_list 之前定义,则不需要这些声明。

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

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2015-11-21
      • 2021-12-21
      • 2011-07-12
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多