0
我有一個樹形結構 node {node * left,node * right}。 我用這種方式填充它: 讓我們說A是根。 A1和A2的孩子。 然後是A11和A12,並且是A11的子女。 ,最後A12(= A21)和A22是A22的孩子。 所以A11和A12有一個共同的孩子,我沒有複製孩子,我們只有A12 = A21(地址方面)。但是爲了釋放樹,唯一的方法是使用recursif函數: 釋放樹T(它由一個指針節點*表示),釋放子子節點(如果它們存在的話)(即不是NULL),然後使用免費(T)。 問題是,當recursif調用在A21上時,指針將會被釋放(因爲A21 = A12,並且A12上的recursif調用是在之前產生的),這會導致問題。 我該如何解決它? 謝謝。在堆上釋放內存,特殊樹
編輯。 我試圖通過在代表正確兄弟 的結構中添加一個新字段來解決此問題,並且它可能起作用,因爲valgrind沒有注意到任何內存丟失:D。
#include <stdio.h>
#include <stdlib.h>
struct node{
struct node *lc, *rc, *bro; // left child, right child, brother
};
typedef struct node node;
void release(node *n)
{
if(n->lc)
release(n->lc);
if(n->rc){
if(n->bro) // in that case, n and n->bro have a common node
n->bro->lc = NULL; // so i set it to NULL because it must be released only once
release(n->rc);
}
free(n);
}
int main()
{
node *A22 = malloc(sizeof *A22);
A22->lc = A22->rc = A22->bro = NULL;
node *A21 = malloc(sizeof *A21);
A21->lc = A21->rc = NULL;
A21->bro = A22;
node *A2 = malloc(sizeof *A2);
A2->lc = A21;
A2->rc = A22;
A2->bro = NULL;
node *A11 = malloc(sizeof *A11);
A11->lc = A11->rc = NULL;
A11->bro = A11;
node *A12 = A21; // the duplicated node
node *A1 = malloc(sizeof *A1);
A1->lc = A11;
A1->rc = A12;
A1->bro = A2;
node *A = malloc(sizeof *A); // root
A->lc = A1;
A->rc = A2;
A->bro = NULL;
release(A);
return 0;
}
任何代碼/代碼片段? – Samer 2014-09-22 17:56:28
目前尚不清楚您如何決定何時「重複使用」兒童。 – 2014-09-22 17:56:47