【发布时间】: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++ 问题。