我正在尝试创建一个使用递归创建树的函数,但每次尝试时我都会遇到分段错误。我创建了以下功能。你能帮我理解出了什么问题以及如何解决它吗?数据从1及以上存储在data [i]数组中。
void create_tree(nary_node* root, data *data)
{
if(root == NULL) return;
int i;
static int datacount;
for(i=0; i<root->data.n; i++) { // For each child in the root
append_child(root, data[datacount]);
create_tree(root->child[i], data);
}
}
它取决于辅助函数append_child():
void append_child(nary_node *root, data data)
{
int i = 0;
while (root->child[i] != NULL) i++;
root->child[i] = create_node(data.n, data);
}
手动树构造如下:
append_child(root, data[1]);
append_child(root, data[2]);
append_child(root->child[0], data[3]);
append_child(root->child[0], data[4]);
append_child(root->child[1], data[5]);
append_child(root->child[1], data[6]);
这将创建一个树,其中包含两个来自root的节点,每个节点有两个子节点。 它手动工作正常,但我遇到了递归部分的问题。
如果需要,只需为上下文添加结构和解释:
/*
Data contains all possible data for each node
*/
typedef struct
{
int n; // Number of children
} data;
/*
nary_node contains each nodes data and an array of pointers
to it's children. An arbitrary max-value was set to 10-children.
*/
typedef struct s_nary_node
{
data data;
struct s_nary_node* child[10];
} nary_node;
在main()中:
int main(void) {
data data[99];
nary_node *root = create_node(data[0].n, data[0]);
create_tree(root, data);
}
create_node()中的:
nary_node *create_node(int children, data data)
{
int i = 0;
nary_node *node = (nary_node*)malloc(sizeof(nary_node));
for (i = 0; i < 10; i++)
node->child[i] = NULL;
node->data = data;
node->data.n = children;
return node;
}
答案 0 :(得分:1)
如果您遵循递归调用,您会注意到它扩展如下:
append_child(root, data[0]);
append_child(root->child[0], data[0]);
append_child(root->child[0]->child[0], data[0]);
append_child(root->child[0]->child[0]->child[0], data[0]);
[...]
append_child(root->child[0]->[...]->child[0]->child[0], data[0]);
因为你永远不会增加datacount
,显然在你的例子中data[0].n == 2
虽然简单的后期增量不会给你预期的结果,因为它会扩展为:
append_child(root, data[1]);
append_child(root->child[0], data[2]);
append_child(root->child[0]->child[0], data[3]);
append_child(root->child[0]->child[0]->child[0], data[4]);
[...]
append_child(root->child[0]->[...]->child[0]->child[0], data[?]);
而是试试这个:
void create_tree(nary_node* root, data *data)
{
if(root == NULL) return;
int i;
static int datacount = 1;
for(i=0; i<root->data.n; i++) { // For each child in the root
append_child(root, data[datacount++]);
}
for(i=0; i<root->data.n; i++) {
create_tree(root->child[i], data);
}
}
不那么优雅,但应该为您提供与预期手册相同的结果&#39;创作&#39;。