gpt4 book ai didi

指向不完整类型的循环结构指针

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:08 25 4
gpt4 key购买 nike

因此,我正在实现自己的链表,以尝试掌握使用单独的头文件和源文件编译项目的窍门。我创建了一个用于定义的 LinkedList.h 和一个用于实现的 LinkedList.c

我找到了 this发布关于 typedef vs structthis 的非常有用的信息通知我编译器提示不知道头文件中的定义(可能?)。

如果我四处移动,我最终会遇到错误,其中 Node 未在 struct Node { ... } 中定义,即使使用前向声明的 typedef结构节点节点.

如果我需要添加任何内容,请告诉我。

首先是错误:

🜁 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

生成文件

default: Main

Main: Main.o LinkedList.o
gcc -o Test Test.c -Wall -Wincompatible-pointer-types

链表.h

typedef struct Node Node;
typedef struct LinkedList LinkedList;

Node* CreateNode(unsigned long);
LinkedList* CreateList();
void addTail(LinkedList*, Node*);

链表.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;
}

主要.c

#include <stdio.h>
#include <stdlib.h>

#include "LinkedList.h"

int main(int argc, char *argv[]) {
LinkedList *list = CreateList();
addTail(list, CreateNode(12));
Node *runner;
runner = list->head;
while (runner != NULL)
printf("%lu\n", runner->value);

return 0;
}

最佳答案

必须将结构定义放在头文件中,而不是代码文件中,这样 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();

“ undefined reference ”问题是因为您没有在 Makefile 中正确编译。 Main 的规则应该是:

Main: Main.o LinkedList.o
gcc -o Main Main.o LinkedList.o

参见 C error: undefined reference to function, but it IS defined

关于指向不完整类型的循环结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50884085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com