Łącząc dwa oddzielne ADTS w jednym

głosy
0

Hey guys Próbuję zacząć na moim przypisania CS (drugi rok papieru C).

W tym kursie stworzyliśmy binarne drzewo poszukiwań ADT, a także drzewo czerwono-czarne ADT. Musimy połączyć je w jeden bardziej ogólnego „drzewo” ADT, który będzie albo wybrać się drzewo czerwono-czarne lub A binarne drzewo poszukiwań w zależności od danych wejściowych użytkownika.

Zacząłem od zdefiniowania nowego typu wyliczany; treetype_t które mogą być albo ustawiony RBT lub BST ... moje pierwsze pytanie brzmi jak mogę zadeklarować struct ponieważ nie wiem, który zostanie wybrany ADT? np w moim pliku bst.c mam:

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

w moim pliku RBT mam:

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

Moim pierwszym pomysłem było mieć jeśli oświadczenie takie jak

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

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

Jednak nie sądzę, to będzie działać ... Nie mogę myśleć o innym podejściu - jakieś pomysły?

Utwórz 29/09/2011 o 08:46
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Definicje struktury nie mogą być zmieniane w czasie wykonywania jak w kodzie. Można jedynie zmienić je w czasie kompilacji za pomocą preprocesora za # if / # ifdef dyrektywa, ale to zbyt wcześnie, ponieważ w tym momencie jeszcze nie ma danych wprowadzonych przez użytkownika (chyba że użytkownik może modyfikować kod źródłowy bezpośrednio i skompilować go).

Co można zrobić, to połączyć tych struktur w jedną za pomocą unii słowa kluczowego:

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

Następnie należy użyć elementu rbt_node unii lub państw bst_node w zależności od danych wejściowych użytkownika.

Upewnij się przeznaczyć wystarczającą przestrzeń dla bst_or_rbt_node (najbezpieczniej będzie za pomocą sizeof (bst_or_rbt_node)).

Również mam nadzieję RBT i BST są wskaźnik typy.

Nie jest konieczne stosowanie związków, ale przy obecnym poziomie może być nieco łatwiej radzić sobie z nimi niż z wskazówki do np nieważne, wskaźnik rzuca.

Odpowiedział 29/09/2011 o 09:06
źródło użytkownik

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