Ved å kombinere to separate rammestyrte dumpere i ett

stemmer
0

Hei folkens Jeg prøver å komme i gang på min CS oppdrag (andre året C papir).

I dette kurset har vi skapt et binært søketre ADT og også en Red Black Tree ADT. Vi må kombinere dem til en mer generell Tree ADT som enten velge å være en Red Black Tree eller et binært søketre avhengig av brukerens input.

Jeg har startet med å definere en ny nummerert type; treetype_t som enten kan settes til RBT eller BST ... mitt første spørsmål er hvordan kan jeg erklære struct siden jeg ikke vet hvilken ADT vil bli valgt? for eksempel i min bst.c fil jeg har:

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

og i min RBT fil jeg har:

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

Min første idé var å ha en if setning som

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

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

Men jeg tror ikke dette vil fungere ... Jeg kan ikke tenke på en annen måte - noen ideer?

Publisert på 29/09/2011 klokken 07:46
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Struktur definisjoner kan ikke endres ved kjøring som i koden. Du kan bare endre dem ved kompilering bruke preprosessor s # hvis / # ifdef direktiv, men det er altfor tidlig siden i det øyeblikket du ennå ikke har brukerundersøkelser (med mindre brukeren kan endre kildekoden direkte og rekompilere det).

Det du kan gjøre er å kombinere disse strukturene i en ved å bruke union søkeord:

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

Deretter kan du bruke enten rbt_node medlem av unionen eller bst_node medlem avhengig av brukerens input.

Pass på at du tildele nok plass for bst_or_rbt_node (sikreste ville være å bruke sizeof (bst_or_rbt_node)).

Også håper jeg RBT og bst er pekertyper.

Det er ikke nødvendig å bruke fagforeninger, men på dagens nivå kan det være litt lettere å forholde seg til dem enn med pekere til for eksempel tomrom, kaster pekeren.

Svarte 29/09/2011 kl. 08:06
kilden bruker

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