2009-12-27 57 views
0

我有一個函數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); 

根節點在另一個函數被初始化:

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()遍歷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); 

是看來,如果我通過& B的根節點作爲參數和子節點被分配在遞歸函數中,那麼可以說有一個連續的命令鏈,並且當遞歸調用完成時整個樹應該可用。它不適合我,所以它不能被允許。我很感激,如果有人能解釋爲什麼是這樣的話,或者如果一個更優雅的解決方案是可能的?

感恩節快樂。 〜RT

回答

1

您所做的是將多個指針值作爲函數的返回值返回的唯一方法。但它不被認爲是好的形式。

好的形式是聲明你的函數有參數和參數,並使用返回值來表示成功或失敗。像這樣

bool get_trees(complextree *T, itree *A, itree *B, composite *C, itree ** AOut, itree** BOut); 
+0

感謝您的即時響應。這顯然看起來更清潔。我仍然不確定,在每個遞歸步驟中,我如何將* AOut與* A綁定在一起?請給我一個具體的描述嗎?這將澄清我的一些錯誤假設。 謝謝,RT – user151410 2009-12-27 01:47:43

+0

我希望我能幫忙,但目前還不清楚你如何使用複合材料,所以我不知道如何替代。 'C = get_trees(T-> nodes [i],A-> nodes [p],B-> nodes [q]);'缺少一個arg,你如何將返回值反饋回遞歸函數? – 2009-12-27 02:00:01

+0

爲額外的空間添加一個新的「答案」.RT – user151410 2009-12-27 14:28:17

0

是傳遞一個指向調用者複合的指針會讓函數使用它來存儲結果。當然,這是至關重要的,首先創建複合對象,堆棧或堆在...

composite c; 
    get_trees(&c); 

    composite *c = malloc... 
    get_trees(c) 

當然的功能實際上可以返回,將被複制到調用者一個結構,但我只會使用風格有限的情況...

0

這是一個簡單的問題版本。假設我們有一個節點:

typedef struct Node { 
    int n; // number of sub-nodes 
    int i; // data 
    node **nodes;//subnodes 
} node; 

現在下面的代碼克隆的樹結構數據值加倍(沒有任何錯誤檢查)。

node *double_tree(node *A, node *B) { 
    if (B == NULL) { 
    B = (node*) calloc(1, sizeof (node)); 
    } 
    B->i = 2 * A->i; 
    B->n = A->n; 
    if (A->nodes != NULL) { 
    B->nodes = (node **) calloc(1, A->n * sizeof (node*)); 
    int ii; 
    for (ii = 0; ii < A->n; ii++) { 
     B->nodes[ii] = double_tree(A->nodes[ii], B->nodes[ii]); 
    } 
    } 
    return B; 
} 

我原來的問題涉及兩個變化:

(一)有多個返回樹(比如double_tree,square_tree)。

(b)返回樹的結構與輸入樹不同。

看來,核心問題是「在函數內部分配的結構必須作爲函數輸出返回爲指針」,只是將指針作爲參數傳遞並不能實現。我希望我錯了,並且有更好的方法來做到這一點。

再次感謝您的協助,拉斯