结构定义发生碰撞

时间:2013-12-09 13:55:43

标签: c data-structures

我正在尝试为我们的组项目实现二叉树。首先是一些代码。

二叉树结构:

typedef struct tBSTNode 
{
    string *Key;        
    tVariable_Prom *BSTNodeCont;    
    struct tBSTNode * LPtr;         
    struct tBSTNode * RPtr;         
} tBSTNodePtr;

树的数据(* BSTNodeCont)如下所示:

typedef struct Variable_Prom {
    int TYPE;
    double DOUBLE;
    int INTEGER;
    bool BOOL;
    string *StringProm;
} tVariable_Prom;

但是我还需要在一些特殊情况下存储一些二进制树节点的指针数组......

所以我想到将这一行添加到我的数据结构中:

tBSNodePtr *pointer;

然后将其malloc到自定义数组大小。但是在这里我遇到了一个问题,因为我的第一个结构需要在当时定义第二个结构,但是我的第二个结构需要首先定义第一个结构(因为它正在使用它)。

是否有一些关于函数的结构头?或者我的问题有一个简单的解决方案,我没有看到?

编辑:以下问题的信息。 我在我的.c文件中包含了一个头文件,其中包含另一个头文件,其中这个定义似乎有效。

struct tVariable_Prom;


typedef struct tBSTNode 
{
    string*Key;                                                               
    struct tVariable_Prom *BSTNodeCont;                                       
    struct tBSTNode * LPtr;                                    
    struct tBSTNode * RPtr;                                  
} tBSTNodePtr;

typedef struct Variable_Prom {
    int Typ;
    double DoUbLe;
    int InTeGer;
    bool BoOl;
    string *StringProm;
    struct tBSTNode *pointer;
} tVariable_Prom;

这是malloc,其中foo的类型为tVariable_Prom

foo.pointer = malloc(2 * sizeof(tBSTNodePtr));

一个函数,它通过Node键(Tstr)搜索二叉树,并在成功时将地址返回给节点(odkaz3):

BSTSearch(&odkaz3, *strom, &Tstr);

然后我试图分配另一个Node的地址,它是由另一个功能完成但实际上问题就在那里:

odkaz3->BSTNodeCont->pointer[0] = *odkaz2;

EDIT2:好的,我重新开始读你对我说的话,现在我有2个头文件 tVariable_Prom.h:

struct tBSTNodePtr;

typedef struct Variable_Prom {
    int Typ;
    double DoUbLe;
    int InTeGer;
    bool BoOl;
    string *StringProm;
    tBSTNodePtr *pointer;
} tVariable_Prom;

tBSTNodePtr.h:

struct tVariable_Prom;

typedef struct tBSTNode {
    string *Key;                                     
    tVariable_Prom *BSTNodeCont;                             
    struct tBSTNode * LPtr;                                  
    struct tBSTNode * RPtr;                                  
} tBSTNodePtr;

我有两个头文件包含在parser.h中,它包含在parser.c中,但我现在确实收到了这些错误:

tBSTNodePtr.h:5:2: error: unknown type name tVariable_Prom

odkaz4->BSTNodeCont->pointer[1] = *odkaz3;

一致
parser.c request for member 'pointer' in something not a structure or union

2 个答案:

答案 0 :(得分:1)

您可以使用转发声明。

struct tVariable_Prom;

typedef struct tBSTNode 
{
    string *Key;        
    tVariable_Prom *BSTNodeCont;    
    struct tBSTNode * LPtr;         
    struct tBSTNode * RPtr;         
} tBSTNodePtr;

反之亦然。并且(可选)将它们放在两个不同的标题中。

答案 1 :(得分:0)

您似乎对对象和指向对象的指针之间的区别感到困惑。您混淆typedef'd tBSTNodePtrtBSTNode(对象)相同而不是指针。将一些非指针称为指针肯定会导致混淆。

你说你想在你的tVariable_Prom中有一个指针数组,但是你定义了一个指针并将其设置为指向一个对象数组,而不是一个指针数组。你可能想要的是添加

struct tBSTNode **pointers;

到你的tVariable_Prom,并用

分配
foo.pointers = malloc(2 * sizeof(struct tBSTNode *));   // make an array of 2 pointers

然后你可能会做类似

的事情
odkaz3->BSTNodeCont->pointers[0] = odkaz2;

其中odkaz2odkaz3是指向节点的点指针。