如何递归地从当前调用中访问先前调用的变量值

时间:2018-10-19 11:11:49

标签: c recursion data-structures b-tree

我正在使用递归函数在btree中插入值。在移至下一个节点之前,我保存了该节点的地址(pds_parent),以便始终有一个指向父节点的指针。

但是pds_parent每次都会初始化(node *pds_parent;),因此我无法访问节点的父级,在递归时如何访问节点的父级,即访问子节点并进入递归即移回父级。

void insertion(node *pds, int item){
    node *pds_parent;
    if(pds[0]->limit==0)
    {
        pds[1]->value=item;
        pds[0]->limit++;
        return 1;
    }
    int loc=b_search(pds,item,1,limit)
    if(pds[0]->is_leaf)
    {
        if(pds[0]->limit==2)
        {
            if(loc==0)
            {
                int value=pds[1]->value;
            }
            else if(loc==1)
            {
                int value=item
            }
            else
            {

                int value=pds[2]->value;
            }
            splitting(pds_parent,value,pds);
        }
        else
        {

            pds[(pds[0]->limit+1)]->value=item;
            if(loc==limit)
            {
               pds[(pds[0]->limit+1)].nextIndex=-1;
               pds[loc].nextIndex=limit+1;
            }
            else
            {
               pds[(pds[0]->limit+1)].nextIndex=loc+1;
               pds[loc].nextIndex=limit+1;
            }
            pds[0]->limit++;
            return 1;
        }
    }
    else
    {
        pds_parent=pds;
        insertion(pds[loc]->c,int item);
    }
}

1 个答案:

答案 0 :(得分:2)

如果要在函数调用之间共享变量,则应使用static关键字。您可以详细了解here

首先,在声明时对其进行初始化:

static node *pds_parent = NULL;

这意味着指针变量的第一个值将为NULL。 在每个递归调用之前,将其设置为要访问的当前节点的值。 另外,仅当它不是NULL时才使用它。

编辑:我还要补充一点,我宁愿将函数签名更改为void insertion(node *pds, int item, node *parent)并在第一次使用NULL进行调用。当然,必须使用NULL并不漂亮,但是您可以将其包装起来。我想这就是基兰·比拉达尔(kiran Biradar)的建议。