【发布时间】:2015-11-27 20:52:49
【问题描述】:
我目前在尝试创建树类时遇到问题。基本上它归结为:我有一个根节点和一个当前节点。两者都是指针。我将根节点设置为等于当前节点,但是当我修改当前节点时,我现在也在修改根节点。
如果我使根节点不是指针,那么它的“下一个节点”值不会更新...
我尝试将“下一个节点”设为指针,以便在两者中都进行更改,但这似乎也不起作用...
我觉得应该有一个我缺少的简单或明显的解决方案,但由于某种原因找不到它。这是我的代码:
【问题讨论】:
我目前在尝试创建树类时遇到问题。基本上它归结为:我有一个根节点和一个当前节点。两者都是指针。我将根节点设置为等于当前节点,但是当我修改当前节点时,我现在也在修改根节点。
如果我使根节点不是指针,那么它的“下一个节点”值不会更新...
我尝试将“下一个节点”设为指针,以便在两者中都进行更改,但这似乎也不起作用...
我觉得应该有一个我缺少的简单或明显的解决方案,但由于某种原因找不到它。这是我的代码:
【问题讨论】:
你为什么称它为只有一个链接的“树”类?
在链表设计中,有一个设计时选择是否在根处有一个虚拟节点。您是否为了简化某些边界情况而浪费了一个节点?我总是不喜欢。在没有虚拟节点的情况下,避免链表中所有边界问题的最简单方法是将当前位置保持为node**,而不是node*。
所以从current=&root 开始,然后以current=&(*current)->nxt 或更方便的方式前进:
node* tmp = *current;
// do other things with tmp
current = &( tmp-<nxt );
如果您真的在使用树结构,同样的想法(使用 node** 而不是 node* 可以解决更广泛的问题并避免需要大量重复代码。
【讨论】:
我认为这里的根本问题是你对什么是树的理解。
这个:
struct node
{
std::string value;
std::string dst;
std::string src1;
std::string src2;
node *nxt;
};
只是链表中的一个节点。一棵树需要一个节点才能拥有多个子节点,因此至少从结构中的节点指针列表重新开始。我还推荐引用而不是指针。你可能想要一个包含节点的树类,而不仅仅是节点,所以你可以编写引用树的代码。类似的东西
class Tree
{
Node Root;
...
}
【讨论】:
在添加新节点后,我看不到您将当前指针移动到另一个位置的位置,您应该保持在与以前相同的位置,除非您在每次添加新节点后调用 getNext。也许这可能是个问题。 此外,您正在使用的结构称为链表。每个树节点都应该有多个后继节点。 (链表是一棵树,每个节点都有一个后继)
【讨论】: