我目前正在我的大学复习考试,遇到了一些关于链表的令人费解的代码示例。在 Steven S. Skiena 的《算法设计手册》一书中,他使用了一些我不太了解的有趣语法。
delete_list (list **l, item_type x)
{
list *p;
list *pred;
list *search_list(), *predicessor_list();
p = seach_list(*l, x);
if (p != NULL)
{
pred = predecessor_list(*l, x);
if (pred == NULL)
*l = p-> next;
else
pred->next = p->next;
free (p);
}
}
声明 search_list() 和 predcessor_list() 函数而不是显式调用它们是否有特定的优势或理由?我假设它与维护指针有关,但我找不到任何关于此的参考资料。
这些是函数声明。我认为他们有两点不好:
他们缺乏原型:
list *search_list(list *, item_type), *predecessor_list(list *, item_type);
原型(此处list *, item_type
为每个函数)告诉编译器该函数期望的参数类型(以及它们的数量)。没有理由不在函数声明中提供该信息。
如果你只是说list *search_list()
,编译器无法检查search_list
传递正确参数的调用。
它们在一个函数内。
在块内声明函数是没有意义的。这不会使函数本地化;在标准 C 中,所有函数都是全局的。它只是使该声明具有局部范围,这是相当无用的。
更标准的方法是
list *search_list(list *, item_type);
list *predecessor_list(list *, item_type);
void delete_list (list **l, item_type x)
{
...
}
请注意,我添加了一个void
返回类型,因为delete_list
它不返回任何值。省略 1999 年之前的 C 中曾经允许的返回类型,但它会默认为int
,而不是void
。
鉴于函数原型随着 1989 年 ANSI C 的发布而成为标准,并且“隐式int
”在 1999 年被删除(使用 ISO 9899:1999),我会警惕算法设计手册中的技术内容(拥有 2008 年版权注意)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句