Die Kombination von zwei separaten ADTs in eine

stimmen
0

Hey Jungs, ich versuche, auf meiner CS Zuordnung (zweites Jahr C-Papier) zu beginnen.

In diesem Kurs haben wir einen binären Suchbaum ADT und auch Red Black Tree ADT erstellt. Wir müssen sie in eine allgemeinere „Baum“ ADT kombinieren, die entweder ein Rot Schwarz Baum oder ein binärer Suchbaum je nach Benutzereingabe sein wählen.

Ich habe durch die Definition einer neuen Aufzählungstyp gestartet; treetype_t die entweder zu RBT oder BST ... meine erste Frage festgelegt werden, wie erkläre ich die Struktur, da ich nicht weiß, welche ADT wird ausgewählt? zB in meiner bst.c Datei ich habe:

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

und in meiner RBT-Datei habe ich:

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

Meine erste Idee war, hat eine if-Anweisung wie

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

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

Allerdings glaube ich nicht, das funktioniert ... Ich kann nicht von einem anderen Ansatz denken - alle Ideen?

Veröffentlicht am 29/09/2011 um 08:46
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Strukturdefinitionen können nicht zur Laufzeit wie in Ihrem Code geändert werden. Sie können sie nur bei der Kompilierung des Präprozessor verwenden ändern # if / # ifdef - Richtlinie, aber das ist noch zu früh , da zu diesem Zeitpunkt Sie noch nicht die Benutzereingabe haben (es sei denn , der Benutzer direkt den Quellcode ändern und neu kompilieren).

Was Sie tun können , ist es, diese Strukturen in einer unter Verwendung des kombinieren Vereinigung Stichwort:

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

Dann nutzen Sie entweder das rbt_node Mitglied der Vereinigung oder das bst_node Mitglied je nach Benutzereingabe.

Stellen Sie sicher, dass Sie genügend Platz für bst_or_rbt_node zuweisen (sicherste wäre mit sizeof (bst_or_rbt_node)).

Auch ich hoffe, RBT und bst sind Zeigertypen.

Es ist nicht notwendig, Gewerkschaften zu verwenden, aber auf Ihrem aktuellen Niveau kann es ein wenig leichter mit ihnen umgehen als mit Zeigern Leere zB Zeiger wirft.

Beantwortet am 29/09/2011 um 09:06
quelle vom benutzer

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