将两个独立的ADT合二为一

时间:2011-09-29 07:46:29

标签: java c binary-search-tree abstract-data-type

嘿伙计们,我正在尝试开始我的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 :(得分:0)

结构定义不能像在代码中那样在运行时更改。您只能在编译时使用预处理器的 #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;
};

然后根据用户输入使用union的rbt_node成员或bst_node成员。

确保为bst_or_rbt_node分配足够的空间(最安全的是使用sizeof(bst_or_rbt_node))。

另外,我希望rbt和bst是指针类型。

没有必要使用联合会,但是在你目前的水平上处理它们可能比指向联盟更容易。 void,指针演员。