У меня есть функция get_trees(), которая работает на сложной древовидной структуре T и возвращает две структурные древовидные структуры A и B. Единственный способ, которым я смог заставить это работать заключается в создании новой структуры с с указателями на а и в, который затем передается в качестве параметра функции, а также является возвращаемое значение:Возвращение и использование нескольких древовидных структур в рекурсивной функции
typedef struct Composite {
itree *A;
itree *B;
} composite;
composite *get_trees(complextree *T, itree *A, itree *B, composite *C);
Корневые узлы деревьев & B инициализируются в другой функции :
itree *A = new_itree(0);
itree *B = new_itree(0);
A->n = T->a;
B->n = T->b;
composite *C;
C = get_trees(T, A, B, C);
ge t_trees() перемещается по ветвям дополнения T, выделяет и заполняет узлы A и B и рекурсивно вызывает себя в субодах. Упрощенный код:
//code for allocating subnodes of A and B
if (T->nodes != NULL){
for (i=0; i< T->nn; i++){
//code for computing p & q
C = get_trees(T->nodes[i], A->nodes[p], B->nodes[q]);
}
}
Код работает нормально. Однако это кажется очень уродливым.
(1) C не имеет внутреннего значения и, т. Е. Используется для возврата нескольких значений. Есть ли альтернатива? Что-то по следующим направлениям:
(2) Можно ли написать рекурсивную функцию со следующей подписью:
void get_trees(T, A, B);
Is кажется, что если я прохожу корневые узлы А & В качестве параметров и подузлами выделяются внутри рекурсивной функции, тогда есть так называемая непрерывная цепочка команд, и все дерево должно быть доступно, когда завершается рекурсивный вызов. Это не сработало для меня, поэтому его нельзя допускать. Я был бы признателен, если бы кто-нибудь мог объяснить, почему это так, или если возможно более элегантное решение?
Спасибо и счастливые праздники. ~ RT
Спасибо за мгновенный отклик. Очевидно, это выглядит намного чище. Я все еще не уверен, как бы я связал ** AOut с * A, на каждом рекурсивном шаге? Вы можете указать конкретное описание? Это прояснит кучу ошибочных предположений с моей стороны. спасибо, RT – user151410
Хотел бы я помочь, но неясно, как вы сейчас используете композицию, поэтому я не знаю, как ее заменить. 'C = get_trees (T-> узлы [i], A-> узлы [p], B-> узлы [q]);' отсутствует аргумент arg, как вы возвращаете возвращаемое значение обратно в рекурсивную функцию? –
Добавьте новый «ответ» для дополнительного места. RT – user151410