Объединение двух отдельных ADT в один - PullRequest
0 голосов
/ 29 сентября 2011

Эй, ребята, я пытаюсь начать работу над моим заданием по CS (второй курс C).

В этом курсе мы создали ADT бинарного дерева поиска, а также ADT красного черного дерева. Мы должны объединить их в еще один общий «древовидный» ADT, который выберет либо красное черное дерево, либо дерево двоичного поиска в зависимости от ввода пользователя.

Я начал с определения нового перечислимого типа; treetype_t, который может быть установлен как RBT или BST ... мой первый вопрос: как мне объявить структуру, так как я не знаю, какой 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;
    };
}

Однако я не думаю, что это сработает ... Я не могу придумать другой подход - есть идеи?

1 Ответ

0 голосов
/ 29 сентября 2011

Определения структуры не могут быть изменены во время выполнения, как в вашем коде. Вы можете изменить их только во время компиляции, используя директиву препроцессора # if / # ifdef , но это слишком рано, поскольку в этот момент у вас еще нет ввода пользователя (если пользователь не может изменить исходный код и перекомпилируйте его).

Что вы можете сделать, это объединить эти структуры в одну, используя ключевое слово union :

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 являются типами указателей.

Нет необходимости использовать союзы, но на вашем текущем уровне с ними может быть немного легче иметь дело, чем с указателями, например, на. пустота, указатель наведен.

...