我正在尝试为我们的组项目实现二叉树。首先是一些代码。
二叉树结构:
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
答案 0 :(得分:1)
您可以使用转发声明。
struct tVariable_Prom;
typedef struct tBSTNode
{
string *Key;
tVariable_Prom *BSTNodeCont;
struct tBSTNode * LPtr;
struct tBSTNode * RPtr;
} tBSTNodePtr;
反之亦然。并且(可选)将它们放在两个不同的标题中。
答案 1 :(得分:0)
您似乎对对象和指向对象的指针之间的区别感到困惑。您混淆typedef
'd tBSTNodePtr
与tBSTNode
(对象)相同而不是指针。将一些非指针称为指针肯定会导致混淆。
你说你想在你的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;
其中odkaz2
和odkaz3
是指向节点的点指针。