这两个程序有什么不同

What is the difference in these two program

本文关键字:什么 程序 两个      更新时间:2023-10-16

我正在制作一个二进制树程序,这个程序可以

#include <iostream>
using namespace std;
struct node{
    int data;
    node *left;
    node *right;
};

void insert( node **rootnode , int value) {
    node* newnode = *rootnode;
    if ( newnode == NULL ) {
        newnode = new node;
        newnode->left = NULL;
        newnode->right = NULL;
        newnode->data  = value;
        *rootnode = newnode; // this was missing!
    }
    else if ( value < newnode->data ){
        insert( &newnode->left , value );
    }
    else if ( value > newnode->data  ){
        insert ( &newnode->right , value );
    }

}
void inorder ( node *root ){
    if ( root == NULL ){
        return;
    }
    else{
        inorder( root->left );
        cout << root->data << endl;
        inorder( root->right );
    }
}


int main(){
    node* root = NULL;
    insert ( &root , 4);
    insert ( &root , 5);
    insert ( &root , 2 );
    insert( &root , 10 );
    insert( &root , 1 );
    //cout << root->data << endl;
    inorder( root );
}

现在我尝试在不传递根节点引用的情况下进行此操作。。。但它不起作用。。。我找不到原因。。

#include <iostream>
using namespace std;
struct node{
    int data;
    node *left;
    node *right;
};

void insert( node *rootnode , int value) {
    node* newnode = rootnode;
    if ( newnode == NULL ) {
        newnode = new node;
        newnode->left = NULL;
        newnode->right = NULL;
        newnode->data  = value;
        rootnode = newnode; // this was missing!
    }
    else if ( value < newnode->data ){
        insert( newnode->left , value );
    }
    else if ( value > newnode->data  ){
        insert ( newnode->right , value );
    }

}
void inorder ( node *root ){
    if ( root == NULL ){
        return;
    }
    else{
        inorder( root->left );
        cout << root->data << endl;
        inorder( root->right );
    }
}


int main(){
    node* root = NULL;
    insert ( root , 4);
    insert ( root , 5);
    insert ( root , 2 );
    insert( root , 10 );
    insert( root , 1 );
    //cout << root->data << endl;
    inorder( root );
}

第二个程序只是给出了空白输出。。。我认为根节点没有更新。。但我不知道为什么。。。。

函数参数是函数的局部变量。它们获取相应参数的值的副本。

您可以想象以下函数声明

void insert( node *rootnode , int value);

及其调用

insert ( root , 4);

以下方式

void insert( /*node *rootnode , int value*/)
{
    node *rootnode = root;
    int value = 4;
    //...

退出函数后,这些局部变量将被销毁。变量root的原始值不会更改,因为函数处理root的副本。

因此,如果你想更改函数中传递给函数的任何对象,你需要通过C或C++意义上的引用来传递它。

也就是说,在C中,您传递一个指向对象的指针。在C++中,您可以使用相同的方法或声明相应的参数作为引用。

因此,在C中,函数声明可以看起来像

void insert( node **rootnode , int value) ;

而在C++中,它可以看起来像上面或下面的

void insert( node * &rootnode , int value) ;