繁体   English   中英

将两个单独的ADT合并为一个

[英]Combining two separate ADTs into one

大家好,我想开始我的CS任务(第二年C论文)。

在本课程中,我们创建了二进制搜索树ADT和红色黑树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;
    };
}

但是我认为这行不通...我想不出另一种方法-有什么想法吗?

不能像在代码中那样在运行时更改结构定义。 您只能在编译时使用预处理程序的#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是指针类型。

并不一定要使用联合,但是在您当前的水平上,处理它们可能比使用指向void,指针强制转换的指针要容易一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM