2011-09-29 32 views
0

嘿,我正試圖開始我的CS作業(第二年C論文)。將兩個單獨的ADT合併爲一個

在本課程中,我們創建了一個二進制搜索樹ADT和一個紅黑樹ADT。我們必須將它們組合成一個更一般的「樹」ADT,它將根據用戶輸入選擇是紅黑樹還是二元搜索樹。

我已經開始定義一個新的枚舉類型; treetype_t可以設置爲RBT或BST ...我的第一個問題是我如何聲明結構,因爲我不知道哪個ADT將被選中?例如在我bst.c文件我有:

struct bstnode { 
    char *key; 
    bst left; 
    bst right; 
}; 

,在我的彩鈴文件我有:

struct rbtnode { 
    char *key; 
    colour_t colour; 
    rbt left; 
    rbt right; 
}; 

我的第一個想法是有一個if語句,如

if (treetype_t == RBT){ 
      struct rbtnode { 
     char *key; 
     colour_t colour; 
     rbt left; 
     rbt right; 
    }; 
    } 
    else{ 

     struct bstnode { 
     char *key; 
     bst left; 
     bst right; 
    }; 
} 

然而我不認爲這會起作用......我想不出另一種方法 - 任何想法?

回答

0

結構定義不能像運行時那樣在運行時更改。您只能在編譯時使用預處理器的#if /#ifdef指令來更改它們,但這樣做還爲時過早,因爲那時您還沒有用戶輸入(除非用戶可以直接修改源代碼並重新編譯它)。

你可以做的是通過使用工會關鍵字組合的結構爲一:

struct rbtnode { 
    char *key; 
    colour_t colour; 
    rbt left; 
    rbt right; 
}; 

struct bstnode { 
    char *key; 
    bst left; 
    bst right; 
}; 

union bst_or_rbt_node { 
    struct bstnode bst_node; 
    struct rbtnode rbt_node; 
}; 

然後您使用該聯盟的成員rbt_node或者根據用戶輸入的bst_node成員。

確保爲bst_or_rbt_node分配了足夠的空間(最安全的是使用sizeof(bst_or_rbt_node))。

此外,我希望rbt和bst是指針類型。

沒有必要使用聯合,但在目前的級別上,處理它們可能比指向例如無效,指針轉換。