圆形结构指针指向不完整类型

时间:2018-06-16 00:28:44

标签: c struct

因此,我正在实现自己的链接列表,以尝试使用单独的头文件和源文件来编译项目。我为定义创建了<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 typedefthis上非常有用,并告诉我编译器抱怨不知道头文件中的定义( 可能?)。

如果我移动的话,我最终会遇到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;
}

2 个答案:

答案 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可以采用的形式。