我有一个函数 get_trees() 对复杂的树结构 T 进行操作并返回两个组件树结构 A 和 B。我能够让它工作的唯一方法是创建一个带有指向 A 和 B 的指针的新结构 C , 然后作为参数传递给函数,也是返回值:
typedef struct Composite {
itree *A;
itree *B;
} composite;
composite *get_trees(complextree *T, itree *A, itree *B, composite *C);
树 A 和 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);
get_trees() 遍历 complextree 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);
似乎如果我将 A 和 B 的根节点作为参数传递,并且在递归函数中分配子节点,那么可以说有一个连续的命令链,当递归调用完成时,整个树应该可用。它对我不起作用,所以绝对不允许。如果有人能解释为什么会这样,或者是否有可能有更优雅的解决方案,我将不胜感激?
谢谢,节日快乐。~RT