как получить доступ к значениям переменных предыдущего вызова из текущего вызова в рекурсии - PullRequest
0 голосов
/ 19 октября 2018

Я делаю рекурсивную функцию для вставки значения в 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 голосов
/ 19 октября 2018

Если вы хотите, чтобы переменная распределялась между вызовами функций, вы должны использовать ключевое слово static.Вы можете прочитать больше об этом здесь .

Сначала инициализируйте его, объявив:

static node *pds_parent = NULL;

Это означает, что первое значениепеременная указателя будет NULL.Перед каждым рекурсивным вызовом установите для него значение текущего посещаемого узла.Кроме того, используйте его, только если это не NULL.

РЕДАКТИРОВАТЬ: Я также добавлю, что я бы предпочел изменить сигнатуру функции на void insertion(node *pds, int item, node *parent) и вызвать его с NULL в первый раз.Конечно, использование NULL не очень приятно, но вы можете обернуть его.Это то, что предложил Киран Бирадар, я полагаю.

...