La combinación de dos ADTs separadas en uno

votos
0

Hola chicos estoy tratando de empezar a trabajar en mi tarea de CS (papel de segundo año C).

En este curso hemos creado un árbol de búsqueda binaria ADT y también un árbol ADT Negro Rojo. Tenemos que combinarlos en un solo ADT más general árbol que, o bien optar por ser un árbol Negro Rojo o un árbol de búsqueda binaria en función de la entrada del usuario.

He comenzado mediante la definición de un nuevo tipo enumerado; treetype_t que pueden estar ajustados en RBT o BST ... mi primera pregunta es ¿cómo Declaro la estructura ya no sé lo que será seleccionado ADT? por ejemplo, en mi archivo bst.c que tengo:

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

y en mi archivo RBT que tengo:

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

Mi primera idea era tener una sentencia if como

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

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

Sin embargo no creo que esto va a funcionar ... No puedo pensar en otro enfoque - cualquier idea?

Publicado el 29/09/2011 a las 08:46
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Definiciones de la estructura no se pueden cambiar en tiempo de ejecución como en su código. Sólo se puede cambiar en tiempo de compilación usando el preprocesador # si / #ifdef Directiva, pero eso es demasiado pronto ya que en ese momento aún no tiene la entrada del usuario (a menos que el usuario puede modificar el código fuente directamente y volver a compilar).

Lo que puede hacer es combinar esas estructuras en una sola mediante el uso de la unión de palabras clave:

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

A continuación, se utiliza ya sea el miembro rbt_node de la Unión o el miembro bst_node dependiendo de la entrada del usuario.

Asegúrese de asignar espacio suficiente para bst_or_rbt_node (más segura sería utilizar sizeof (bst_or_rbt_node)).

También, espero RBT y BST son los tipos de puntero.

No es necesario el uso de los sindicatos, pero en su nivel actual, puede ser un poco más fácil tratar con ellos que con los punteros a, por ejemplo vacío, arroja puntero.

Respondida el 29/09/2011 a las 09:06
fuente por usuario

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