La combinaison de deux ADTs séparés dans une

voix
0

Hé les gars, je suis en train de commencer ma mission CS (deuxième année de papier C).

Dans ce cours, nous avons créé un arbre de recherche binaire ADT et aussi un arbre rouge noir ADT. Nous devons les combiner en une plus générale « Arbre » ADT qui soit choisir d'être un arbre rouge noir ou un binaire Recherche Arbre en fonction de l'entrée utilisateur.

J'ai commencé en définissant un nouveau type énuméré; treetype_t qui peuvent être réglés sur RBT ou BST ... ma première question est de savoir comment puis-je le déclare struct puisque je ne sais pas quelle ADT sera sélectionné? par exemple dans mon fichier bst.c je:

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

et dans mon dossier RBT je:

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

Ma première idée était d'avoir une instruction if telle que

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

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

Cependant, je ne pense pas que cela fonctionnera ... Je ne peux pas penser à une autre approche - des idées?

Créé 29/09/2011 à 08:46
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Définitions structure ne peuvent pas être modifiés lors de l' exécution comme dans votre code. Vous ne pouvez les changer au moment de la compilation en utilisant la de préprocesseur de # si / #ifdef directive, mais c'est trop tôt car à ce moment - là , vous n'avez pas encore l'entrée d'utilisateur ( à moins que l'utilisateur peut modifier le code source directement et recompiler).

Ce que vous pouvez faire est de combiner ces structures en une seule en utilisant le syndicat mot - clé:

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

Ensuite, vous utilisez soit l'élément rbt_node du syndicat ou de l'organe de bst_node en fonction de l'entrée utilisateur.

Assurez-vous d'allouer suffisamment d'espace pour bst_or_rbt_node (le plus sûr serait commande SizeOf (bst_or_rbt_node)).

Aussi, j'espère RBT et sont bst types pointeur.

Il est pas nécessaire d'utiliser les syndicats, mais à votre niveau actuel, il peut être un peu plus facile de traiter avec eux que des pointeurs vers exemple vide, pointeur jette.

Créé 29/09/2011 à 09:06
source utilisateur

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