2013-12-09 48 views
1

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

二叉树结构:

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; 

这里就是foo是tVariable_Prom型的malloc:

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

和由节点密钥(Tstr)搜索二叉树的函数返回地址就成功节点(odkaz3 ):

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

然后我试图分配一个地址的另一个节点,它是由另一个功能,但实际上是问题有:

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 
+0

编译器抱怨一个不完整的类型,因为它没有找到类型定义,而只是一个前向声明。不知何故,您不包括相关类型的标题。 –

+0

我已经编辑了代码,如你所说,但我仍然遇到错误。 – 4yoms5n3

回答

1

您可以使用向前声明。

struct tVariable_Prom; 

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

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

+0

你需要在'tBSTNode'中使用'struct tVariable_Prom',因为你还没有'typedef'。 (另外,他们甚至不必在单独的头文件中!) – Kninnug

+0

感谢您的建议,但是现在当我尝试将指针指向节点时,我遇到了一个问题,我像这样''tVariable_Prom temp' temp.pointer = malloc(2 * sizeof(tBSTNodePtr))'我有一个指针'addr'指向数组被分配的节点,但是如何得到数组的值?我试了这个:'addr-> BSTNodeCont->指针[0] = addr2;'但我得到一个错误:dereferecing指针不完整的类型... – 4yoms5n3

+0

有人有回答我的问题上面? – 4yoms5n3

0

您似乎对对象和指向对象的指针之间的区别感到困惑。你很容易混淆typedef'd tBSTNodePtrtBSTNode(一个对象)相同,而不是指针。调用某个非指针指针肯定会导致混淆。

你说你想在你的tVariable_Prom中有一个指针数组,但是然后你定义一个单独的指针,并将它设置为指向一个对象数组,而不是一个指针数组。你probabaly需要的是

struct tBSTNode **pointers; 

添加到您的tVariable_Prom,并为它分配与

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

那么你也许可以这样做

odkaz3->BSTNodeCont->pointers[0] = odkaz2; 

其中odkaz2odkaz3是点指针到节点。

+0

嗯我认为我注定不会这样做。我试着按照你键入的方式尝试malloc,但未知的'tBSTNode'错误弹出。所以我在tBSTNode之前将名称'struct'添加到malloc。但是最糟糕的错误仍然存​​在,那就是:'解除引用指向不完整类型'但是多亏了所有试图提供帮助的东西。 – 4yoms5n3