Объединение двух отдельных АТД в одно,

голоса
0

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

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

Я начал с определения нового перечисляемого типа; 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 (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