如何在 c 中创建 n-ary 树
how to create a n-ary tree in c
#include <stdio.h>
#include <stdlib.h>
struct node{
char *word;
int depth, children;
struct node **child;
};
typedef struct node node;
node *createTree();
node *createNode(char *word,int depth);
int main(int argv,char *argc[]){
node *root,*current_node;
root=createNode("root",0);
char *array[]={"string1","string2","string3"};
current_node=root;
printf("root has been created with word: %s \n",current_node->word);
int i;
for (i=0; i<3; i++){
current_node->child[i]=createNode(array[i],(current_node->depth)+1);
current_node->children++;
printf("%s has been inserted to the tree\n",current_node->word);
}
}
node *createTree(){
printf("root has been created\n");
return createNode("",0); /*creates the first node*/
}
node *createNode(char *word,int depth){
node *new_node;
new_node=malloc(sizeof(node));
new_node->word=word;
new_node->depth=depth;
new_node->children=0;
new_node->child=NULL;
}
所以我在这里要做的是构建一棵 n-ary 树。我使用 createNode 函数来创建根的 children,但是当我尝试 link 一个新节点的地址到 child 时,程序因分段错误而崩溃。我知道我的错误可能是,我尝试创建 children 的方式,但我找不到。帮助任何人?
在使用之前为 child
结构成员分配内存:
current_node->child = malloc(3 * sizeof(node *));
for (i=0; i<3; i++) {
current_node->child[i] = createNode(array[i],(current_node->depth)+1);
current_node->children++;
printf("%s has been inserted to the tree\n",current_node->word);
}
您定义的结构意味着您必须将每个级别作为一个节点数组进行管理,其中的元素数量可能是动态的。在 C 中用于 n 元树表示的更常见的结构是:
struct node {
char *word;
int depth, children; // Reconsider if you need these
// for maintenance effort versus benefit
struct node *child; // point to children of this node
struct node *next; // point to next node at same level
};
因此结构如下所示:
Root -> NULL
|
V
Child-1.1 -> Child-1.2 -> ... -> Child-1.n -> NULL
| | |
| V V
| ... Child-1.n.1 -> ... -> NULL
V
Child-1.1.1 -> Child-1.1.2 -> ... -> NULL
|
... etc
然后您需要修改 createNode
并相应地编写其他树木管理例程。它们可能看起来的部分且非常简洁的示例(不一定包含所有正确的有效性检查或节点 removal/deallocations):
struct node {
int data;
struct node *next;
struct node *child;
};
typedef struct node node;
node * new_node(int);
node * add_sibling(node *, int);
node * add_child(node *, int);
int main(int argc, char *argv[])
{
int i;
node *root = new_node(0);
for ( i = 1; i <= 3; i++ )
add_child(root, i);
}
node * new_node(int data)
{
node *new_node = malloc(sizeof(node));
if ( new_node ) {
new_node->next = NULL;
new_node->child = NULL;
new_node->data = data;
}
return new_node;
}
node * add_sibling(node * n, int data)
{
if ( n == NULL )
return NULL;
while (n->next)
n = n->next;
return (n->next = new_node(data));
}
node * add_child(node * n, int data)
{
if ( n == NULL )
return NULL;
if ( n->child )
return add_sibling(n->child, data);
else
return (n->child = new_node(data));
}
一些可能有用的附加功能
void remove_node(node* node, node* new_root)
{
if(node->parent != NULL)
remove_node(node->parent, new_root)
if(node->next != NULL)
remove_node(node->next, new_root)
if((node->child != NULL) && (node->child != new_root))
remove_node(node->child, new_root)
free(node)
}
// new root must be element of the tree
void new_root_tree(node **root, node *new_root) {
*root = new_root
remove_node(new_root->parent);
remove_node(new_root->next);
}
#include <stdio.h>
#include <stdlib.h>
struct node{
char *word;
int depth, children;
struct node **child;
};
typedef struct node node;
node *createTree();
node *createNode(char *word,int depth);
int main(int argv,char *argc[]){
node *root,*current_node;
root=createNode("root",0);
char *array[]={"string1","string2","string3"};
current_node=root;
printf("root has been created with word: %s \n",current_node->word);
int i;
for (i=0; i<3; i++){
current_node->child[i]=createNode(array[i],(current_node->depth)+1);
current_node->children++;
printf("%s has been inserted to the tree\n",current_node->word);
}
}
node *createTree(){
printf("root has been created\n");
return createNode("",0); /*creates the first node*/
}
node *createNode(char *word,int depth){
node *new_node;
new_node=malloc(sizeof(node));
new_node->word=word;
new_node->depth=depth;
new_node->children=0;
new_node->child=NULL;
}
所以我在这里要做的是构建一棵 n-ary 树。我使用 createNode 函数来创建根的 children,但是当我尝试 link 一个新节点的地址到 child 时,程序因分段错误而崩溃。我知道我的错误可能是,我尝试创建 children 的方式,但我找不到。帮助任何人?
在使用之前为 child
结构成员分配内存:
current_node->child = malloc(3 * sizeof(node *));
for (i=0; i<3; i++) {
current_node->child[i] = createNode(array[i],(current_node->depth)+1);
current_node->children++;
printf("%s has been inserted to the tree\n",current_node->word);
}
您定义的结构意味着您必须将每个级别作为一个节点数组进行管理,其中的元素数量可能是动态的。在 C 中用于 n 元树表示的更常见的结构是:
struct node {
char *word;
int depth, children; // Reconsider if you need these
// for maintenance effort versus benefit
struct node *child; // point to children of this node
struct node *next; // point to next node at same level
};
因此结构如下所示:
Root -> NULL
|
V
Child-1.1 -> Child-1.2 -> ... -> Child-1.n -> NULL
| | |
| V V
| ... Child-1.n.1 -> ... -> NULL
V
Child-1.1.1 -> Child-1.1.2 -> ... -> NULL
|
... etc
然后您需要修改 createNode
并相应地编写其他树木管理例程。它们可能看起来的部分且非常简洁的示例(不一定包含所有正确的有效性检查或节点 removal/deallocations):
struct node {
int data;
struct node *next;
struct node *child;
};
typedef struct node node;
node * new_node(int);
node * add_sibling(node *, int);
node * add_child(node *, int);
int main(int argc, char *argv[])
{
int i;
node *root = new_node(0);
for ( i = 1; i <= 3; i++ )
add_child(root, i);
}
node * new_node(int data)
{
node *new_node = malloc(sizeof(node));
if ( new_node ) {
new_node->next = NULL;
new_node->child = NULL;
new_node->data = data;
}
return new_node;
}
node * add_sibling(node * n, int data)
{
if ( n == NULL )
return NULL;
while (n->next)
n = n->next;
return (n->next = new_node(data));
}
node * add_child(node * n, int data)
{
if ( n == NULL )
return NULL;
if ( n->child )
return add_sibling(n->child, data);
else
return (n->child = new_node(data));
}
一些可能有用的附加功能
void remove_node(node* node, node* new_root)
{
if(node->parent != NULL)
remove_node(node->parent, new_root)
if(node->next != NULL)
remove_node(node->next, new_root)
if((node->child != NULL) && (node->child != new_root))
remove_node(node->child, new_root)
free(node)
}
// new root must be element of the tree
void new_root_tree(node **root, node *new_root) {
*root = new_root
remove_node(new_root->parent);
remove_node(new_root->next);
}