在C++,这是干什么用的?节点* &头,

in C++ ,what is this for? Node* &head,

本文关键字:节点 C++ 干什么      更新时间:2023-10-16

我有一个关于这个代码片段的问题。 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* &headNode **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;