结构互相引用

时间:2016-12-03 10:44:15

标签: c pointers struct

我已经看过有关相互指针的结构的问题,我尝试了很多东西,但我无法解决我的问题。我的大脑正好燃烧!

我有两种不同的结构/类型:set_tnode_t

#ifndef _SETH_
#define _SETH_    
#include "node.h"
#include "list.h"

typedef struct {
    list_t* list;

}set_t;

set_t* createSet(node_t*);
set_t* findSet(node_t*);
set_t* unionSet(node_t*, node_t*);

#endif

我的set_t结构中没有任何node_t,但是我使用node_t作为参数,所以我可以看到node.h。 List是节点的链接列表,但是现在这与我的问题无关。

#ifndef _NODEH_    
#define _NODEH_

//?? #include "set.h"
typedef struct set_t s;

typedef struct  node_t{
    int color;
    int dist;
    int key;
    int date;
    int end;
    s* set;
    struct node_t* father;
}node_t;

node_t* createNode(int);
#endif

在beggining中,我使用在node.h中包含set.h,因为我在我的节点struct中使用了一个set。但我对包含有某种“循环”。 所以我试着用这个指令:

typedef struct set_t s;

以避免循环问题。

但这次我有另一个问题/警告,我想我明白了: 当我做类似的事情时(让我们假设我们有一个node_t * n):

    set_t* s = (set_t*)malloc(sizeof(set_t));
    n->set= s;

我有一个不兼容的指针类型警告,可能是因为s是一个set_t *但是n-> set是一个s * ...

我做错了什么?当你想在x.h中包含x.h和在x.h中包含y.h时,我真的想了解它是如何工作的... 同样的事情,如果y.h需要x.h,z.h需要y.h,x.h需要z.h .. 我真的希望我能够清楚地帮助你们。

1 个答案:

答案 0 :(得分:1)

编译器将类型set_t视为与typedef struct { list_t * list; } set_t; 类型不同的东西。

要对齐此操作,请执行以下操作:

在set.h中更改

typedef struct Set {
  list_t* list;
} set_t;

typedef struct set_t s;

在node.h中更改

typedef struct Set set_t;  // True forward declaration of set_t.

  s * set;

  set_t * set;

typedef

更新

放弃所有那些无用的#ifndef _SETH_ #define _SETH_ #include "node.h" #include "list.h" // define type "struct Set" struct Set { struct List * list; // defintion of struct List to be adjusted in list.h }; struct Set * createSet(struct Node*); struct Set * findSet(struct Node*); struct Set * unionSet(struct Node*, struct Node*); #endif 或许会让事情变得更清晰。您的代码将如下所示:

set.h

#ifndef _NODEH_    
#define _NODEH_

// declare forward type "struct Set"
struct Set;

// define type "struct Node"
struct Node {
    int color;
    int dist;
    int key;
    int date;
    int end;
    struct Set * set;
    struct Node* father;
};

struct Node * createNode(int);


#endif

node.h

table name also permission