【问题标题】:In C++, I don't know why my function doesn't return result [duplicate]在 C++ 中,我不知道为什么我的函数不返回结果 [重复]
【发布时间】:2025-12-30 22:00:17
【问题描述】:
#include <fstream>
#include <vector>
#include <iterator>
#include <iostream>
#include <string>
using namespace std;

ifstream fin("1.inp");

class TreeNode {   
private:
    friend class Tree;
    int Keyvalue;
    string Namevalue;
    TreeNode *LeftChild; 
    TreeNode *RightChild;

    TreeNode() { LeftChild = RightChild = 0; };
    TreeNode(int _Keyvalue, string _Namevalue, TreeNode *Lefty, TreeNode *Righty) {
        Keyvalue = _Keyvalue;
        Namevalue = _Namevalue;
        LeftChild = Lefty;
        RightChild = Righty;
    }
};

class Tree {
private:
    TreeNode *root; 
    void insert_to_tree(TreeNode *, int, string);
    void show_tree(TreeNode *);
public:
    Tree() { root = 0; }
    void insert_to_tree(int, string);
    void delete_from_tree(int);
    void show_tree();
    void setup();
};

void Tree::insert_to_tree(int _Keyvalue, string _Namevalue){
    insert_to_tree(root, _Keyvalue, _Namevalue);
}
//this is problem.
void Tree::insert_to_tree(TreeNode *CurrentNode, int _Keyvalue, string _Namevalue){
    if (CurrentNode == 0)
        CurrentNode = new TreeNode(_Keyvalue, _Namevalue, 0, 0);
    else{
        if (CurrentNode->Keyvalue < _Keyvalue)
            insert_to_tree(CurrentNode->RightChild, _Keyvalue, _Namevalue);
        else if (CurrentNode->Keyvalue == _Keyvalue)
            CurrentNode->Namevalue = _Namevalue;
        else
            insert_to_tree(CurrentNode->LeftChild, _Keyvalue, _Namevalue);
    }
}

void Tree::delete_from_tree(int _Keyvalue){
}

void Tree::show_tree(){
    show_tree(root);
}
void Tree::show_tree(TreeNode *CurrentNode){
    if (CurrentNode){
        if (CurrentNode->LeftChild == 0 && CurrentNode->RightChild == 0){
            cout << CurrentNode->Namevalue;
        }
        else{
            show_tree(CurrentNode->LeftChild);
            show_tree(CurrentNode->RightChild);
        }
    }
}

void get_command(Tree &_MyTree){
    int Num_of_command;
    string command;
    fin >> Num_of_command;
    for (int i = 0; i < Num_of_command; i++){
        fin >> command;
        int Keyvalue;   string Namevalue;
        if (command == "ins"){
            fin >> Keyvalue >> Namevalue;
            _MyTree.insert_to_tree(Keyvalue, Namevalue);
        }
        else if (command == "del"){
            fin >> Keyvalue;
            _MyTree.delete_from_tree(Keyvalue);
        }
        else if (command == "leaves")
            _MyTree.show_tree();
    }
}

int main(){
    Tree MyTree;
    get_command(MyTree);
}

当我调用函数时

void Tree::insert_to_tree(int _Keyvalue, string _Namevalue){
    insert_to_tree(root, _Keyvalue, _Namevalue); } 

root 没有被我的函数改变。函数后

void Tree::insert_to_tree(TreeNode *CurrentNode, int _Keyvalue, string _Namevalue)

根始终为 0。

【问题讨论】:

  • 将函数签名改为void Tree::insert_to_tree(TreeNode*&amp; CurrentNode, int _Keyvalue, string _Namevalue)
  • 您可以考虑更改标题。你的函数是void,这将是标题中所述问题的简单答案,但我认为这不是你要找的。​​span>
  • 我想补充一点——当你创建一些节点时,它不会插入到你的树中,只是在内存中创建和丢失它。您应该以 if (CurrentNode->RightChild == NULL) CurrentNode->RightChild = new TreeNode(_Keyvalue, _Namevalue, 0, 0); 的方式创建节点
  • 我认为将 * 和 & 一起使用会被抵消。谢谢你。

标签: c++


【解决方案1】:

您正在通过值传递 root - 这意味着您的函数会看到 root 的副本。无论它对它做什么,都不会影响原件。

考虑以下简单示例:

#include <iostream>

void foo(int x) {
    x = 10;
}

int main() {
   int k = 42;
   foo(k);

   std::cout << "k is now " << k << "\n";

   return 0;
}

如果你运行这段代码,你会看到k保持不变,仍然打印为42。这是因为foo()修改了k的副本,而这并没有触及原来的k。

【讨论】:

    【解决方案2】:

    您创建了一个新的TreeNode,但您从未将它插入到树中或在任何地方返回创建的TreeNode

    您可能的意思是通过引用传递CurrentNode (TreeNode *&amp; CurrentNode),这意味着在函数内部对其所做的任何更改都将在函数外部看到。

    【讨论】: