2013-12-09 47 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