【问题标题】:Function not writing nodes to tree when using recursion使用递归时函数不将节点写入树
【发布时间】:2018-12-02 00:08:53
【问题描述】:

我是一名学生,正在为一个项目在 cpp 中制作树形结构。该程序应该从输入中获取一个字符串并将其输入到树中。树由每个节点组织,每个节点都有指向它的下一个兄弟(称为兄弟)和它的第一个子节点(称为子节点)的指针。但是,当我尝试创建一个递归地将成员添加到树的函数时,该函数不起作用。所有必要的步骤都已完成,但由于某种原因,节点未链接。请看一下我的代码,感谢您的阅读。

#include <iostream>
#include <string>
struct node{
    char data;
    node *sibling = nullptr;
    node *child = nullptr;
};
struct node* newNode(char data, unsigned int m)
{
    if(m!=0) {
        struct node *node = (struct node *) malloc(sizeof(struct node));
        // std::cout << "node write" << std::endl;

        node->data = data;
        node->sibling = newNode(124,m-1);
        node->child = newNode(124,m-1);
        return (node);
    }
}
char TreeOutput(node *n){
    return *(char *)n;
}

void nodeAdd(node *currentNode, std::string str, int m ){
    int n = str.length();
    if(m<n){
        if(TreeOutput(currentNode) == str[m]){
            std::cout << m << "1..1" << std::endl;

            nodeAdd(currentNode->child,str,m+1);
        }
        else if(TreeOutput(currentNode) == 124){
            std::cout << m <<  "2..2" << std::endl;

            currentNode = newNode(str[m],2);
            nodeAdd(currentNode->child,str,m+1);
        }
        else{
            std::cout << m << "3..3" << std::endl;

            nodeAdd(currentNode->sibling,str,m+1);
        }
    }
}
int main() {
    struct node *root = newNode('X',6);
    std::cout << root->data << std::endl;

    nodeAdd(root->child,"APE",0);
    std::cout << root << std::endl;
    return 0;
}

【问题讨论】:

  • 这是一个比 c++ 更多的 c 问题。在 C++ 中,您通常使用类而不是结构。
  • 我对类不太熟悉,但是如何使用它们来改进这个程序?
  • @Jayylmao C++ 中的结构和类除了默认访问之外完全相同。默认情况下,类是私有的,结构是公共的。出于这个原因,我专门使用结构。
  • @SeanMcAllister 如果愿意,您可以始终使用“public”,但这不是 OOP 思维。 OOP 让您可以选择为代码中的每个对象授予不同的访问权限,以帮助您以正确的方式处理代码。没错,您可以在 c++ 中向结构添加函数,但代码中的所有对象仍然可以访问所有这些函数。还有一件事,在类中所有默认函数都存在,而在结构中则不存在。
  • 总的来说,它用 C 风格写的肯定比用 C++ 风格写的多,但这与 structs 与 classes 没有太大关系。然而,许多细节是特定于 C++ 的。没有符合标准的 C 编译器会接受它。由于 C 和 C++ 在几个方面有不同的语法和语义,那么,这只能解释为一个 C++ 问题。

标签: c++ recursion tree nodes


【解决方案1】:

他们没有在这一行链接的原因:

currentNode = newNode(str[m],2);

是因为您将一个节点* 传递给函数,然后为 函数内部的指针 分配一个新值。因此,您在函数内部更改 currentNode 的值,而不是在其父级中。您需要引用指针或双指针才能使其正常工作:

void nodeAdd(node*& currentNode, std::string str, int m )

如果我们删除指针的语法糖可能更有意义。想象一下,如果我们写了一个指向节点的指针Ptr&lt;node&gt;

void nodeAdd(Ptr<node> currentNode, std::string str, int m )

很明显,我们正在按值获取 指针,因此它现在位于函数内的变量中。如果我们通过引用来获取它,我们可以在函数之外更改它的值:

void nodeAdd(Ptr<node>& currentNode, std::string str, int m )

切线,你的节点结构中有 char 数据,我想你也想要一个指针(或数组)。

就一般风格而言,如果您尝试编写 C++,通常 newNode 的内容将进入构造函数,因此您只需编写 new node(args...) 即可创建一个新实例。 在这种情况下,TreeOutput 函数将起作用,因为节点的布局很简单,但一般来说,强制转换为结构的第一个成员并不一定起作用(特别是在继承或虚拟方法),所以我至少可以直接访问成员return node-&gt;data;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2021-08-03
    • 2023-04-01
    • 2018-10-31
    • 2015-10-14
    相关资源
    最近更新 更多