你包括在哪里<stdlib.h>
——因为那就是那里malloc()
被宣布?
这是编译问题吗(malloc()
未声明)或链接问题(malloc()
不明确的)?
错误信息具体是什么?
现在代码可读了:
-
<cstdlib>
是一个 C++ 头文件(也是<cstdio>
).
- 您需要包括
<stdlib.h>
in C.
- 您需要包括
<stdlib.h>
哪里的malloc()
使用函数 - 在linkedlist.c
.
You also have had the header guards in the wrong place in linkedlist.h
, but the code in the question has been updated since. Originally, the sequence was:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#endif
struct linked_list{
…
头文件的规范结构是:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...the other material in the header...
...definitions and declarations...
#endif /* HEADER_H_INCLUDED */
The #endif
是文件中最后一个非注释、非空行——而不是第三行。
即使对于双向链表来说,您的数据结构也非常复杂。您确定您会经常需要该长度,以至于需要在列表中的每个节点中维护指向头的指针吗?如果您经常使用它,我会感到惊讶。我假设每个节点都有指向头的指针,这样当您从列表中删除任意节点时,您可以减少列表的长度。您可能最好传递一个指向列表的指针和指向要删除的节点的指针,而不是您所拥有的。
我看不出有什么理由length = 5
in the new_list()
功能。
此外,C 和 C++ 在以下含义上存在根本差异:
struct linked_list * new_list();
在 C++ 中,这意味着“new_list()
是一个不带参数并返回一个函数struct linked_list
指针”。
在 C 语言中,这意味着“new_list()
是一个具有完全不确定的参数列表的函数,它返回一个struct linked_list
指针”。函数已声明,但没有该函数的原型。
在 C 语言中,你应该这样写:
struct linked_list * new_list(void);
就我个人而言,我更喜欢看到extern
位于标头中函数声明的前面;它实际上对于功能来说并不是必需的,但因为它(extern
) 对于标头中声明的变量是(或应该是)必需的,我更喜欢标头中声明的函数的对称性。