Συνδυάζοντας δύο ξεχωριστά ADTs σε μία

ψήφοι
0

Γεια σου ρε παιδιά Προσπαθώ να ξεκινήσετε την αποστολή μου CS (χαρτί δεύτερη χρονιά C).

Σε αυτό το μάθημα έχουμε δημιουργήσει μια δυαδική αναζήτηση Δέντρο ADT και επίσης ένα κόκκινο μαύρο δέντρο ADT. Πρέπει να τα συνδυάσετε σε ένα γενικότερο «Δέντρο» ADT που είτε θα επιλέξει να είναι ένα κόκκινο μαύρο δέντρο ή ένα δυαδικό Αναζήτηση δέντρο ανάλογα με την είσοδο του χρήστη.

Έχω αρχίσει με τον καθορισμό ενός νέου αριθμητικού τύπου? treetype_t η οποία μπορεί είτε να ρυθμιστεί ώστε να RBT ή BST ... το πρώτο μου ερώτημα είναι πώς μπορώ να κηρύξει την struct δεδομένου ότι δεν ξέρω ποια θα επιλεγεί ADT; π.χ. σε αρχείο bst.c μου έχω:

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

και το αρχείο RBT μου έχω:

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

Η πρώτη μου ιδέα ήταν να έχουμε μια εντολή if, όπως

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

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

Ωστόσο, δεν νομίζω ότι αυτό θα λειτουργήσει ... Δεν μπορώ να σκεφτώ άλλη προσέγγιση - οποιεσδήποτε ιδέες;

Δημοσιεύθηκε 29/09/2011 στις 08:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Ορισμούς δομή δεν μπορεί να αλλάξει κατά το χρόνο εκτέλεσης και τον κωδικό σας. Μπορείτε να τις αλλάξετε μόνο κατά τη μεταγλώττιση χρήση του προεπεξεργαστή του # αν / # ifdef οδηγία, αλλά αυτό είναι πολύ νωρίς δεδομένου ότι εκείνη τη στιγμή δεν έχετε ακόμα την είσοδο του χρήστη (εκτός και αν ο χρήστης μπορεί να τροποποιήσει τον πηγαίο κώδικα άμεσα και ξαναμεταγλωττίσετε αυτό).

Τι μπορείτε να κάνετε είναι να συνδυάσει αυτές τις δομές σε ένα χρησιμοποιώντας την ένωση λέξη-κλειδί:

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

Στη συνέχεια, μπορείτε να χρησιμοποιήσετε είτε το μέλος rbt_node της Ένωσης ή το μέλος bst_node ανάλογα με την είσοδο του χρήστη.

Βεβαιωθείτε ότι έχετε διαθέσει αρκετό χώρο για bst_or_rbt_node (ασφαλέστερο θα ήταν να χρησιμοποιείτε sizeof (bst_or_rbt_node)).

Επίσης, ελπίζω RBT και BST είναι δείκτης τύπων.

Δεν είναι απαραίτητο να χρησιμοποιήσετε τα συνδικάτα, αλλά στο σημερινό επίπεδο σας μπορεί να είναι λίγο πιο εύκολο να ασχοληθεί μαζί τους ό, τι με δείκτες π.χ. σε κενό, δείκτη ρίχνει.

Απαντήθηκε 29/09/2011 στις 09:06
πηγή χρήστη

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