【问题标题】:Pointer issues with tree class树类的指针问题
【发布时间】:2015-11-27 20:52:49
【问题描述】:

我目前在尝试创建树类时遇到问题。基本上它归结为:我有一个根节点和一个当前节点。两者都是指针。我将根节点设置为等于当前节点,但是当我修改当前节点时,我现在也在修改根节点。

如果我使根节点不是指针,那么它的“下一个节点”值不会更新...

我尝试将“下一个节点”设为指针,以便在两者中都进行更改,但这似乎也不起作用...

我觉得应该有一个我缺少的简单或明显的解决方案,但由于某种原因找不到它。这是我的代码:

AST.cpp

node.h

【问题讨论】:

    标签: c++ pointers tree


    【解决方案1】:

    你为什么称它为只有一个链接的“树”类?

    在链表设计中,有一个设计时选择是否在根处有一个虚拟节点。您是否为了简化某些边界情况而浪费了一个节点?我总是不喜欢。在没有虚拟节点的情况下,避免链表中所有边界问题的最简单方法是将当前位置保持为node**,而不是node*

    所以从current=&root 开始,然后以current=&(*current)->nxt 或更方便的方式前进:

    node* tmp = *current;
    // do other things with tmp
    current = &( tmp-<nxt );
    

    如果您真的在使用树结构,同样的想法(使用 node** 而不是 node* 可以解决更广泛的问题并避免需要大量重复代码。

    【讨论】:

      【解决方案2】:

      我认为这里的根本问题是你对什么是树的理解。

      这个:

      struct node
      {
              std::string value;
              std::string dst;
              std::string src1;
              std::string src2;
              node *nxt;
      };
      

      只是链表中的一个节点。一棵树需要一个节点才能拥有多个子节点,因此至少从结构中的节点指针列表重新开始。我还推荐引用而不是指针。你可能想要一个包含节点的树类,而不仅仅是节点,所以你可以编写引用树的代码。类似的东西

      class Tree
      {
         Node Root;
          ...
      }
      

      【讨论】:

        【解决方案3】:

        在添加新节点后,我看不到您将当前指针移动到另一个位置的位置,您应该保持在与以前相同的位置,除非您在每次添加新节点后调用 getNext。也许这可能是个问题。 此外,您正在使用的结构称为链表。每个树节点都应该有多个后继节点。 (链表是一棵树,每个节点都有一个后继)

        【讨论】:

        • 我的意思是当你的 root 和 current 不为 NULL 时添加。
        猜你喜欢
        • 1970-01-01
        • 2020-03-18
        • 2010-12-16
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多