【问题标题】:Combining two separate ADTs into one将两个独立的 ADT 合并为一个
【发布时间】:2011-09-29 07:46:29
【问题描述】:

大家好,我正在尝试开始我的 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;
    };
}

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 2021-10-23
      • 2019-07-25
      • 2012-07-21
      • 2014-06-25
      • 2014-06-08
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多