【问题标题】:Implementing General Tree using the Linked List data structure使用链表数据结构实现通用树
【发布时间】:2011-06-14 19:55:49
【问题描述】:

我正在尝试生成以下通用树:

             root
              |
       ---------------- 
       |              |       
     child          child    
                      |                      
                   ----       
                  |           
               child   
                 |
            -------------
           |     |      |
         child child  child

我打算使用两个类,一个存储父节点元素(树类),另一个实现用于存储子节点的链表(Single_linked_list)。

我对 Tree 类的定义是:

template <class Object>
class Tree 
{
    private:
          Object node_val;  // this is stored in node of tree
          Single_linked_list< Tree<Object> * > children;

    public:
    // accessors and mutators

    ...
}

我只是想确认Single_linked_list&lt; Tree&lt;Object&gt; * &gt; children; 应该在其中包含*,因为在c++ 中这是指定它是一个指针的方式,指向所有孩子的linked_list 的开始?

如果我对那行代码的解释正确,请告诉我。

【问题讨论】:

  • 应该没问题。我可能将类本身称为“节点”而不是“树”,因为每个对象实际上都是一个节点,而树是所有节点的集合。还可以考虑存储shared_ptrs 的节点而不是原始指针,因为当您实现任何类型的树操作时,您将为自己节省一个痛苦的世界。最后,单链表在 C++0x 中可用 &lt;forward_list&gt;s。

标签: c++ class templates pointers tree


【解决方案1】:

如果我理解您的问题,您想知道 Single_linked_list 类模板参数的含义。

您的陈述:

在c++中[*]是指定它是一个指针的方式,指向所有子链表的开始

值得讨论。 Single_linked_list 模板类管理作为模板参数给出的类型的实例。模板参数不会改变列表的使用方式。由模板参数标识的托管类型可以是内置的(如指针),也可以是类。无论模板参数是什么,我都假设通过调用children 上的方法来访问链接列表的开头和遍历列表的函数,例如

Single_linked_list< SomeClassOrType > my_list;
putThingsOnList( &my_list );

my_list.goToFirst();
while( !my_list.hasNext() )
{
  SomeClassOrType &o = children.getCurrent();
  children.goToNext();
}

上面引用的语句的第一部分是正确的:* 指定了一个指针类型。您陈述的第二部分是我不同意的地方:模板参数与linked_list开始的想法无关。

我希望你觉得我的回答很有价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多