Ötvözi két különböző ADT egyetlen

szavazat
0

Hé srácok próbálok elindulni az én CS megbízás (második év C papír).

Ebben természetesen hoztunk létre bináris kereső fába ADT és egy piros-fekete fa ADT. Meg kell egyesíteni őket egy sokkal általánosabb „Fa” ADT, amely vagy úgy dönt, hogy egy piros-fekete fa vagy bináris kereső fába felhasználói input.

Elkezdtem meg egy új felsorolt ​​típus; treetype_t amelyet akár állítani RBT vagy BST ... az első kérdés az, hogyan Kijelentem struct, mert én nem tudom, melyik ADT lesz kiválasztva? pl az én bst.c fájl van:

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

és az én RBT fájl van:

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

Első gondolatom az volt, hogy az if, mint

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

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

Azonban nem hiszem, hogy ez működni fog ... nem tudok gondolni egy másik megközelítés - bármilyen ötletet?

A kérdést 29/09/2011 08:46
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Szerkezet definíciók nem változtatható futási időben a kódban. Csak akkor tudja megváltoztatni azokat fordításkor az elpárologtató által # if / # IFDEF irányelv, de ez túl korai, mert abban a pillanatban még nem rendelkezik a felhasználó által megadott (kivéve, ha a felhasználó módosíthatja a forráskódot közvetlenül és újrafordítani azt).

Mit tehetünk kombinálni ezeket a struktúrákat az egyik segítségével a szakszervezet kulcsszó:

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

Akkor használja akár a rbt_node az Unió tagja, vagy a bst_node tag függően felhasználótól.

Győződjön meg róla, hogy fordítsanak elegendő helyet bst_or_rbt_node (legbiztonságosabb lenne használva sizeof (bst_or_rbt_node)).

Azt is remélem, RBT és BST vannak mutató típusokat.

Ez nem szükséges használni a szakszervezetek, de a jelenlegi szinten lehet, hogy egy kicsit könnyebb kezelni őket, mint a mutatókat, például void, mutató vet.

Válaszolt 29/09/2011 09:06
a forrás felhasználó

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