因此,我正在实现自己的链接列表,以尝试使用单独的头文件和源文件来编译项目。我为定义创建了<div id="wrapper">
<div id="sections">
<div id="splash">SPLASH</div>
<div id="main">MAIN</div>
<div id="secondary">
<ul>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
<li>SECONDARY</li>
</ul>
</div>
<footer>
<ul>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
<li>FOOTER</li>
</ul>
</footer>
</div>
</div>
,为实现创建了LinkedList.h
。
我发现this帖子在LinkedList.c
vs typedef
和this上非常有用,并告诉我编译器抱怨不知道头文件中的定义( 可能?)。
如果我移动的话,我最终会遇到struct
Node
未定义的错误,即使有前向声明的struct Node { ... }
。
如果我需要添加任何内容,请告诉我。
首先出错:
typedef struct Node Node
生成文件
make
cc -c -o Main.o Main.c
Main.c: In function ‘main’:
Main.c:22:16: error: dereferencing pointer to incomplete type
‘LinkedList {aka struct LinkedList}’
runner = list->head;
^~
<builtin>: recipe for target 'Main.o' failed
make: *** [Main.o] Error 1
LinkedList.h
default: Main
Main: Main.o LinkedList.o
gcc -o Test Test.c -Wall -Wincompatible-pointer-types
LinkedList.c
typedef struct Node Node;
typedef struct LinkedList LinkedList;
Node* CreateNode(unsigned long);
LinkedList* CreateList();
void addTail(LinkedList*, Node*);
MAIN.C
#include <stdlib.h>
#include <stdio.h>
#include "LinkedList.h"
typedef struct Node {
unsigned long value;
Node *next;
} Node;
typedef struct LinkedList {
unsigned long length;
Node *head;
Node *tail;
} LinkedList;
Node* CreateNode(unsigned long value) {
struct Node *node;
node = (Node*)malloc(sizeof(Node));
node->value = value;
node->next = NULL;
return node;
}
LinkedList* CreateList() {
struct LinkedList *list;
list = (LinkedList*)malloc(sizeof(LinkedList));
list->head = NULL;
list->tail = NULL;
list->length = 0;
}
void addTail(LinkedList *list, Node *node) {
if (list->head == NULL)
list->head = node;
else
list->tail->next = node;
list->tail = node;
list->length += 1;
return;
}
答案 0 :(得分:4)
您必须将结构定义放在头文件中,而不是代码文件中,以便main.c
可以引用成员。
在定义结构时,您不需要使用typedef
,这将创建重复的typedef。只需对类型进行前向定义,然后定义不带typedef
的结构。
typedef struct Node Node;
struct Node {
unsigned long value;
Node *next;
};
typedef struct LinkedList LinkedList;
struct LinkedList {
unsigned long length;
Node *head;
Node *tail;
};
Node* CreateNode(unsigned long);
LinkedList* CreateList();
void addTail(LinkedList*, Node*);
LinkedList* CreateList();
“未定义的引用”问题是因为您没有在Makefile中正确编译。 Main
的规则应为:
Main: Main.o LinkedList.o
gcc -o Main Main.o LinkedList.o
请参阅C error: undefined reference to function, but it IS defined
答案 1 :(得分:3)
更好的选择是添加
Node *nextNode(Node*)
到您的头文件并使用它来遍历列表。
然后考虑让List *createList()
为你的根节点指针提供一个位置。当您使用removeNode()
更新:要访问节点的值,请尝试添加unsigned long getValue(Node* node)
。如果您尝试隐藏API背后的实现细节(例如,可以同时提供可调整大小的数组,双链表和单链表的API),请考虑API可以采用的形式。