Это довольно хорошее решение.Вы используете рекурсию для детей (которая не будет слишком глубокой), но итерацию для братьев и сестер (которая будет углубляться, если вы используете рекурсию).Ваш код, безусловно, может быть более элегантным в качестве рекурсивного решения (вызов tree_free
для child
и next
), но риск переполнения стека будет значительно увеличен, поэтому я думаю, что вы сделали правильный выбор там.
Сказав это, вам вообще не понадобится child
, если вы измените порядок своих операций:
unsigned int tree_free (struct tree *root) {
struct tree *current = NULL, *next = NULL;
unsigned int freecnt = 0;
current = root;
while(current != NULL)
{
freecnt += tree_free (current->child) + 1;
next = current->next;
xfree (current);
current = next;
}
return freecnt;
}
Если вы считаете, что длина вашего списка братьев и сестер не будетнастолько большой, что вы могли бы попробовать элегантное решение:
unsigned int tree_free (struct tree *root) {
unsigned int freecnt;
if (root == NULL) return 0;
freecnt = tree_free (root->child) + tree_free (root->next);
xfree (root);
return freecnt + 1;
}
Это не проверено, поэтому я не даю никаких гарантий или соответствия назначению, тем более что это, вероятно, опасно для вашего конкретного случаябольшое количество родственных ссылок.Я включил это больше как показатель того, что возможно с рекурсией.Мой совет - использовать первый.