C - 按参考呼叫

tok*_*shi 1 c pointers segmentation-fault data-structures

我写了一个简单的程序来逐个对数字进行重复排序,然后将它们逐个插入到树中.我的问题是,我无法插入root的子节点,因为我无法将下面的函数更改为call-by-reference类型.

以下q参数需要保持root的地址值.

void insertNode(int data, node *q, node *parent){
    if(q == NULL){
        node *p = createNode(data);
        p -> parent = parent;
        p -> key = generateKey(p);
        int i;
        for(i = 0;table[i][1] != 0;i++);
        table[i][1] = p -> data;
        table[i][0] = p -> key;
        q = p;
    }
    else if(q -> left > q -> right || q -> left == q -> right){
        q -> right++;
        insertNode(data, q -> rightChild, q);
    }
    else if(q -> right > q -> left){
        q -> left++;
        insertNode(data, q -> leftChild, q);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 7

在C中没有"通过引用传递"这样的东西.如果你需要为传递给函数的指针赋予一个新值(不仅仅是改变指针指向的指针),你需要传递一个指向指针的指针,即

void insertNode(int data, node **q, node *parent){
    /* code */
    *q = p;
}
Run Code Online (Sandbox Code Playgroud)

当您在C中传递指针(或其他任何内容)时,您将传递指针的副本.因此,您的函数的调用者可以看到这种类型的更改:

q->someVal = someOtherVal;
Run Code Online (Sandbox Code Playgroud)

但这不是因为您只修改传递给函数的副本:

q = p;
Run Code Online (Sandbox Code Playgroud)

您需要添加另一个间接级别,以便修改参数本身,以便更改在函数外部可见.