【问题标题】:incomplete definition of type struct [duplicate]类型结构的不完整定义[重复]
【发布时间】:2016-01-21 05:12:54
【问题描述】:

我正在 C 中实现 int 的优先级队列。我的标题中有一个 struct Node

typedef struct NodeTag {
  int priority;
  int value;
  struct Node *next;
}Node;

现在在我的 C 文件中,我尝试添加一个新元素,同时遍历队列并将其中每个元素的优先级值与新元素进行比较。所以我尝试这样做

Node *prev = head;
while(prev->next && prev->next->priority >= priority){
   prev=prev->next;
}
temp->next=prev->next;
prev->next=temp;

但是我得到一个编译器错误提示:

incomplete definition of type 'struct Node'

在我的 while 条件下。如何访问prev的下一个节点的优先级属性?

【问题讨论】:

  • 这是一个常见的错误,尤其是在 SO 上的初学者代码中。困难在于找到一个很好的问题来复制这个问题。
  • 可以看一下C语言中的“struct”。尝试使用 struct Node *prev = head browser
  • 实际上,如果您尝试阅读 c std,您就会知道为什么类型中的struct 用于
  • 另一个非常相关的问答是typedef a structure containing a pointer to the same type

标签: c struct


【解决方案1】:

我认为您可能混淆了哪个是类型名称,哪个是结构名称。

here

next 字段声明为Node *struct NodeTag *

这是一个编译的sn-p:

typedef struct NodeTag Node;
struct NodeTag {
  int priority;
  int value;
  Node *next;
};

【讨论】:

  • 谢谢!当我将其声明为 Node * 时,我收到一条错误消息“必须使用 'struct' 标签来引用类型 'Node'”
  • @Aida 更新了答案。我不得不将 typedef 从结构中分离出来,否则它还不知道 next 字段的类型 Node。
  • @AidaZhumabekova:有多种修复方法,包括 (1) typedef struct Node { int priority; int value; struct Node *next; } Node; 和 (2) typedef struct Node Node; struct Node { int priority; int value; Node *next; }; 和 (3) typedef struct NodeTag { int priority; int value; struct NodeTag *next; } Node; — 任何一种都可以正常工作。
  • @JonathanLeffler 恐怕我的建议 " 或答案中的struct NodeTag" 与(3)有相同的问题:prev=prev->next 会分配一个@ 987654332@ 输入Node,编译器可能不喜欢...
  • 一旦到达(3)末尾的分号,Node就是struct NodeTag的别名,就没有问题了。困难在于当您处于中间位置时,如 (1) 中,在定义 next 时没有类型 Node,因此您必须在该示例中使用 struct Node。 (2) 通过说Nodestruct Node 的别名来解决问题,然后定义struct Node 是什么。结构体可以只使用Node(typedef 名称),如图所示,或struct Node;结果是一样的。
【解决方案2】:
typedef struct NodeTag {
  int priority;
  int value;
  struct Node *next; /*this should be struct NodeTag, 
                      at this point Node is still not yet typed*/

  }Node; /*now it is*/

要克服这个问题,你应该这样做:

typedef struct Node Node;

struct Node{
     int priority;
     int value;
     Node *next; 
 };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2018-09-26
    • 2011-05-04
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多