C 不允许使用不完整的类型

C 不允许使用不完整的类型,c,struct,incomplete-type,C,Struct,Incomplete Type,我试图通过将内存分配给指向队列的指针来创建队列,但是当我在大小槽中写入结构的名称时,我遇到了这个错误。我真的不知道如何解释,所以代码: 结构,在queue.c中定义: struct queue { Node front; Node back; int num; int (*e_func)(Elem,Elem); }; typedef struct node* Node; struct node { Elem e; Node next; No

我试图通过将内存分配给指向队列的指针来创建队列,但是当我在大小槽中写入结构的名称时,我遇到了这个错误。我真的不知道如何解释,所以代码:

结构,在queue.c中定义:

struct queue {
    Node front;
    Node back;
    int num;
    int (*e_func)(Elem,Elem);
};
typedef struct node* Node;
struct node {
    Elem e;
    Node next;
    Node prev;
};
队列.h:

#ifndef QUEUE_H
#define QUEUE_H
#include <malloc.h>
#include <stdlib.h>
typedef struct queue* Queue;
typedef void* Elem;
Queue CreateQ(int (*equals)(Elem,Elem));
void Enqueue(Queue Q, Elem e);
Elem Dequeue();
Elem front(Queue Q);
Elem back(Queue Q);
int size(Queue Q);
int isIn(Queue Q, Elem e);
#endif

将鼠标悬停在
sizeof()
参数中的
struct
上时会显示错误。我到底做错了什么?我记得过去也做过类似的事情,而且成功了。我相信这可能与节点中的void指针有关,但是我如何解决这个问题呢?

首先定义typedef“node”,这样它就可以用于下一个结构定义。 但是,现在在结构“node”中,“next”和“prev”元素不能是“node”类型,因为只有在完成typedef之后才定义它。然而,“结构节点*”可用于定义“下一个”和“上一个”,因为“结构节点”已充分定义

typedef struct node {
    Elem e;
    struct node *next;
    struct node *prev;
    } *Node;
稍后,您会发现您可以引用“next”和“prev”,就像它们被定义为“Node”类型一样;因为类型“Node”和类型“struct Node*”(对于编译器)是等效的

struct queue {
    Node front;
    Node back;
    int num;
    int (*e_func)(Elem,Elem);
    };

移动
typedef结构节点*节点在结构队列
的定义之上,也许?在没有解释的情况下发布代码的可能重复,虽然它可以解决问题,但不是很有帮助。你能简单描述一下你做了哪些改变,以及它们是如何解决这个问题的吗?
struct queue {
    Node front;
    Node back;
    int num;
    int (*e_func)(Elem,Elem);
    };