Kombinací dvou samostatných ADTS do jednoho

hlasů
0

Ahoj kluci Snažím se začít pracovat na svém úkolu CS (druhý ročník C papír).

V tomto kurzu jsme vytvořili binární vyhledávací strom ADT a také červeno-černý strom ADT. Musíme je spojit do jednoho obecnější „stromu“ ADT, která bude buď rozhodnout, že je Red Black Tree nebo binární vyhledávací strom v závislosti na vstup uživatele.

Začal jsem tím, že definuje nový výčtového typu; treetype_t které lze nastavit buď na RBT nebo BST ... moje první otázka je, jak mohu prohlásit, že struct, protože nevím, která bude zvolena ADT? například v mém bst.c souboru mám:

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

a podle mého RBT souboru mám:

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

Moje první myšlenka byla, že má-li příkaz jako je

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

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

Ale já si nemyslím, že to bude fungovat ... Nemůžu myslet na jiný přístup - Nějaké nápady?

Položena 29/09/2011 v 08:46
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Definice struktury nelze měnit za běhu, jak ve svém kódu. Můžete změnit pouze je při kompilaci pomocí preprocesoru v # if / # IFDEF směrnice, ale to je příliš brzy, protože v tu chvíli jste dosud nemají vstup uživatele (pokud si uživatel může změnit zdrojový kód přímo a překompilovat ji).

Co můžete udělat, je spojit tyto struktury do jedné pomocí sjednocovací klíčového slova:

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;
};

Pak můžete použít buď rbt_node člena unie nebo členských bst_node v závislosti na vstupu uživatele.

Ujistěte se, že přidělit dostatek místa pro bst_or_rbt_node (nejbezpečnější by bylo použití sizeof (bst_or_rbt_node)).

Také doufám, že RBT a BST se ukazatel typy.

To není nutné používat odbory, ale v aktuální úrovni to může být o něco jednodušší se s nimi vypořádat, než s ukazateli na např void, ukazatel vrhá.

Odpovězeno 29/09/2011 v 09:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more