Combinând două ADTs separate într-un singur

voturi
0

Hei baieti am încercat pentru a începe misiunea mea CS (C hârtie al doilea an).

În acest curs am creat un binar de căutare copac ADT și, de asemenea, un roșu negru copac ADT. Trebuie să le combine într-un singur mai general „Arborele“ ADT, care va alege fie să fie un negru copac roșu sau un binar de căutare copac în funcție de datele introduse de utilizator.

Am început prin definirea unui nou tip enumerat; treetype_t care poate fi setat la RBT sau BST ... prima mea întrebare este cum declar struct, deoarece nu știu ce ADT va fi selectat? de exemplu, în fișierul meu bst.c am:

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

și în fișierul meu RBT am:

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

Prima mea idee a fost de a avea o declarație, cum ar fi în cazul în care

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

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

Cu toate acestea nu cred că acest lucru va funcționa ... Nu mă pot gândi la o altă abordare - orice idei?

Întrebat 29/09/2011 la 08:46
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Structura definiții nu pot fi schimbate în timpul rulării ca în codul. Le puteți modifica doar în timpul compilării folosind preprocesorul lui # în cazul în care / # ifdef directivă, dar asta e prea devreme , deoarece la acel moment nu au fost încă introduse de utilizator ( cu excepția cazului în utilizatorul poate modifica codul sursă direct și recompilați - l).

Ce puteți face este de a combina aceste structuri într - o singură cu ajutorul uniunii cuvântul cheie:

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

Apoi, utilizați fie membrul rbt_node al Uniunii sau membrul bst_node în funcție de datele introduse de utilizator.

Asigurați-vă că ați aloca suficient spațiu pentru bst_or_rbt_node (cel mai sigur ar fi folosind sizeof (bst_or_rbt_node)).

De asemenea, sper RBT și BST sunt tipuri pointer.

Nu este necesar să se folosească sindicatele, dar la nivelul actual ar putea fi un pic mai ușor de a face cu ei decât cu indicii de exemplu, la vid, indicatorul mulaje.

Publicat 29/09/2011 la 09:06
sursa de către utilizator

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