在C++,这是干什么用的?节点* &头,
in C++ ,what is this for? Node* &head,
我有一个关于这个代码片段的问题。 Node* &head
,在 insert() 函数中,我很难理解它的含义。这是"指向节点结构的指针的引用"吗?
但是为什么在这里getDepth(Node *head)
他使用Node *head
?这是一个好的做法吗?如果可能的话,有什么更好的写法?
谢谢!
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 100;
struct Node{
int key;
Node *lchild, *rchild, *parent;
};
Node *head, *p, node[maxn];
int cnt;
void init(){
head = p = NULL;
memset(node, ' ', sizeof(node));
cnt = 0;
}
void insert(Node* &head, int x){
if(head == NULL){
node[cnt].key = x;
node[cnt].parent = p;
head = &node[cnt++];
return;
}
p = head;
if(x < head->key)
insert(head->lchild, x);
else
insert(head->rchild, x);
}
int d = 0, num = 0, dep[maxn];
void getDepth(Node *head){
if(head == NULL) return;
++d;
getDepth(head->lchild);
if(head->lchild == NULL && head->rchild == NULL)
dep[num++] = d;
getDepth(head->rchild);
--d;
}
bool isBalance(Node *head){
if(head == NULL) return true;
getDepth(head);
int max = dep[0], min = dep[0];
for(int i=0; i<num; ++i){
if(dep[i]>max) max = dep[i];
if(dep[i]<min) min = dep[i];
}
if(max-min > 1) return false;
else return true;
}
int main(){
init();
int a[] = {
5, 3, 8, 1, 4, 7, 10, 2, 6, 9, 11, 12
};
for(int i=0; i<12; ++i)
insert(head, a[i]);
cout<<isBalance(head)<<endl;
return 0;
}
如果您传递 Node *head
而不是 Node* &head
,并且如果更改了 "head",则更改在 main
函数中将不可用。
如果您希望这些更改可用,请return head
或通过Node* &head
或Node **head
。
在getDepth()
中,无需更改"头"指针。所以通过Node *head
工作正常。
这正是它的内容:对指向Node
的指针的引用。它允许您通过引用传入Node*
,以便当您修改函数内部的指针时,修改将在外部看到。
一个涉及引用参数的简单示例:
void inc(int& x) {
x++;
}
如果我有一个变量int y = 0;
,用inc(y)
传递它,然后检查y
的值,它将具有值1
。如果参数不是引用类型,则该值将被0
,因为只有inc
内部的副本会被修改。
你的情况是一样的。通过引用传递Node*
,以便可以修改指针并使其在外部可见。
此构造表示引用类型为 Node * 的变量。问题是,如果您只是将函数插入的参数声明为 Node *,那么在函数内部,此参数将作为局部变量。因此,退出函数后,它的任何更改都将丢失。所以在这种情况下,作为结果,原来的可变头不会被改变。通过引用传递指针可以保证函数内部头部的任何更改都将保留在原始变量中。
您正在查看对指针的引用。
http://en.wikipedia.org/wiki/Reference_(C%2B%2B)
我会避免使用引用,因为它们与调用时按值传递某些内容没有区别。
编写此代码的人是个混蛋,并且编写了不可读的代码。简直太可怕了。
但是,Node* &head 是对指向节点的指针的引用。所以基本上它通过引用将指针传递给头部,因此您可以更改头部 ptr 的值。
例如:
Node *A = NULL;
insert(A,10);
//now A has changed, A != NULL;
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- 引擎节点:未定义的符号:_ZTV6Config
- 为什么"delete"关键字不删除节点?
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限