这两个程序有什么不同
What is the difference in these two program
我正在制作一个二进制树程序,这个程序可以
#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) ;
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- C++std::atomic在程序员级别保证了什么
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 什么是"undetectable means",它们如何更改 C/C++ 程序的对象?
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我的堆栈和库存清单程序的结构有什么问题?
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 谁能告诉我,程序中的错误是什么?该程序仅用于获取文件扩展名
- 指针和程序性能之间有什么关系吗?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 是什么原因导致我的SDL2程序中出现杂散像素
- 我的C++程序的工作目录是什么
- 程序什么时候会创建多个堆
- 我可以编写什么程序来冻结/挂起我的程序来测试看门狗计时器
- Windows如何知道用什么程序打开文件?