Combinando due ADT separate in un'unica

voti
0

Hey ragazzi che sto cercando di iniziare il mio incarico CS (carta secondo anno C).

In questo corso abbiamo creato un binario di ricerca albero ADT e anche un albero di ADT Rosso Nero. Dobbiamo riunire in una più generale ADT Albero, che sarà o scegliere di essere un albero Nero Rosso o A Binary Search Albero in base all'input dell'utente.

Ho iniziato con la definizione di un nuovo tipo enumerato; treetype_t, che può essere impostato su RBT o BST ... la mia prima domanda è come faccio io dichiaro la struct dato che non so quale sarà selezionata ADT? ad esempio, nel mio file bst.c ho:

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

e nel mio file RBT ho:

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

La mia prima idea era di avere un'istruzione if, come

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

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

Tuttavia non credo che questo lavoro ... non riesco a pensare ad un altro approccio - tutte le idee?

È pubblicato 29/09/2011 alle 08:46
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Definizioni di strutture non possono essere modificati a run-time, come nel codice. È possibile modificare solo al momento della compilazione usando del preprocessore # if / # ifdef direttiva, ma che è troppo presto dal momento che in quel momento non si dispone ancora di l'input dell'utente (a meno che l'utente può modificare il codice sorgente direttamente e ricompilarlo).

Che cosa si può fare è combinare queste strutture in un unico usando il sindacato parola chiave:

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

Poi si utilizza il membro rbt_node del sindacato o il membro bst_node seconda l'input dell'utente.

Assicurati di allocare spazio sufficiente per bst_or_rbt_node (più sicuro sarebbe utilizzando sizeof (bst_or_rbt_node)).

Inoltre, spero che RBT e BST sono tipi di puntatore.

Non è necessario usare i sindacati, ma al vostro livello attuale può essere un po 'più facile da trattare con loro che con i puntatori, ad esempio, vuoto, puntatore getta.

Risposto il 29/09/2011 a 09:06
fonte dall'utente

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