я в настоящее время имеет дело с родовым Деревом с этой структурой:Как освободить память, занятую деревом, C?
typedef struct NODE {
//node's keys
unsigned short *transboard;
int depth;
unsigned int i;
unsigned int j;
int player;
int value;
struct NODE *leftchild; //points to the first child from the left
struct NODE *rightbrothers; //linked list of brothers from the current node
}NODE;
static NODE *GameTree = NULL;
В то время как функция, которая выделяет различные узлы есть (не беспокойтесь слишком много значений клавиши, в основном выделяют ребенок-узлы . Если нет какой-либо новый ребенок идет в LeftChild, в противном случае он идет в конце списка «node-> leftchild-> rightbrothers»):
static int AllocateChildren(NODE **T, int depth, unsigned int i, unsigned int j, int player, unsigned short *transboard) {
NODE *tmp = NULL;
if ((*T)->leftchild == NULL) {
if( (tmp = (NODE*)malloc(sizeof(NODE)) )== NULL) return 0;
else {
tmp->i = i;
tmp->j = j;
tmp->depth = depth;
(player == MAX) ? (tmp->value = 2): (tmp->value = -2);
tmp->player = player;
tmp->transboard = transboard;
tmp->leftchild = NULL;
tmp->rightbrothers = NULL;
(*T)->leftchild = tmp;
}
}
else {
NODE *scorri = (*T)->leftchild;
while (scorri->rightbrothers != NULL)
scorri = scorri->rightbrothers;
if((tmp = (NODE*)malloc(sizeof(NODE)))== NULL) return 0;
else {
tmp->i = i;
tmp->j = j;
tmp->depth = depth;
(player == MAX) ? (tmp->value = 2) : (tmp->value = -2);
tmp->player = player;
tmp->transboard = transboard;
tmp->leftchild = NULL;
tmp->rightbrothers = NULL;
}
scorri->rightbrothers = tmp;
}
return 1;
}
мне нужно придумать функцию, возможно рекурсивный, который отменяет все дерево, до сих пор я придумал это:
void DeleteTree(NODE **T) {
if((*T) != NULL) {
NODE *tmp;
for(tmp = (*T)->children; tmp->brother != NULL; tmp = tmp->brother) {
DeleteTree(&tmp);
}
free(*T);
}
}
Но он не работает, он даже не освобождает один узел памяти. Любые идеи о том, где я ошибаюсь или как это можно реализовать? P.s. Я получил идею рекурсивной функции от этого псевдокода от моего учителя. Однако я не уверен, что правильно перевел его на C с помощью своего дерева. псевдокод:
1: function DeleteTree(T)
2: if T != NULL then
3: for c ∈ Children(T) do
4: DeleteTree(c)
5: end for
6: Delete(T)
7: end if
8: end function