如何在C中使用带有头文件的链表?
我必须创建一个程序,使用链表执行各种function。 我必须将函数保存在与main()不同的文件中,但是我无法弄清楚如何将列表包含在头文件中。 我尝试了不同的组合,现在我在linkedList.h文件中有这个:
typedef struct list_elements* item;
这在linkedList.c中
typedef struct list_elements{ int value; struct list_elements *next; }item
问题是,当我尝试编译main.c时,我收到消息:“请求成员’值’不是结构或联合”和“请求成员’下一个’不是结构或联合”。
我看了建议的教科书和在线,但我找不到如何使用链接列表与头文件的解释?
(当我在一个文件中测试整个东西时,这些function起作用,所以我不认为它们是问题所在);
您尝试键入相同的标识符两次作为不同的类型。
删除第一个typedef typedef struct list_elements* item;
并将第二个放在headerList.h标题中,该标题必须包含在linkedList.c中。
标头中的声明将类型item
定义为指向struct list_elements
的指针。 来自linkedList.c
声明声明了相同的名称item
,作为struct list_elements
类型本身的别名。 虽然这本身并不是错误的,但肯定会令人困惑。 它确实使linkedList.c
错误地#include
头文件,通常它适合它。
您应该在头文件中创建所有类型声明,并将其包含在两个 C源文件中,以确保它们共享这些声明。 类型声明至少包括typedef
, struct
和union
声明以及函数原型。 这不是您可能希望放在标题中的独家列表。
有多种方法可以做到这一点:
其中一个是用你想要在.h文件中使用的函数原型来定义结构,并在单独的.c中使用函数的代码(当然在.h文件中用相同的原型编写),然后您现在可以通过包含头文件来使用任何其他.c文件中的结构。 例如:
StType.h
typedef struct Something{ int a; int b; } typedef struct anotherSomething{ int c; int d; } int fct1(); int fct2();
Fct.c
include StType.h; int fct1() { //... } void fct2() { //... }
你的program.c
include StType.h int main() { Something s; fct1(); }
我通常做这样的事情。