链表树执行过程中出现错误
An error occurs during the implementation of the linked list tree
enter code here
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int data;
struct _node* rightChild;
struct _node* leftChild;
}Node;
Node* create(int data) { // create node function
Node* node = (Node*)malloc(sizeof(node));
node->rightChild = NULL;
node->leftChild = NULL;
node->data = data;
return node;
}
void Inorder(Node* ptr) { // travel
if (ptr)
{
printf("%c ", ptr->data);
Inorder(ptr->leftChild);
Inorder(ptr->rightChild);
}
}
int main(void)
{
Node* node[300];
for (int i = 1; i < 300; i++) {
if (i == 1) {
node[i] = create(i);
}
else {
if (i % 2 == 0) {
node[i / 2]->leftChild = create(i);
}
else {
node[i / 2]->rightChild = create(i);
}
}
}
Inorder(node[10]);
}
我想使用 Node* 数组实现二叉树,而不是一个一个地输入变量。但我在那个领域不断出错。感谢 advice.Which 部分 我需要修改以使该部分通过 for 语句实现吗?据我了解,node数组左右两部分都传值了,为什么会报错?
您分配给的唯一 node[i]
是 node[1]
。所有其他节点都通过 leftChild
或 rightChild
字段链接。
您可以通过以下方式解决此问题,例如:
node[i] = create(i);
node[i / 2]->leftChild = node[i];
但我觉得这有点迂回,因为您现在在两个不同的地方拥有相同的数据——节点的句柄。
我猜你真正想要的是一个简单的节点结构数组,然后通过指针链接到数组中:
Node node[300] = {{0}};
node[1].data = 1;
for (int i = 2; i < 300; i++) {
node[i].data = i;
if (i % 2 == 0) {
node[i / 2].leftChild = &node[i];
} else {
node[i / 2].rightChild = &node[i];
}
}
这将创建一个平面节点数组,其中节点像二叉树一样链接在一起。例如,node[1].leftChild
是指向 node[2]
的指针。您可以通过将 &node[1]
作为 head:
传递来使用常规树函数
Inorder(&node[1]);
(你说的Inorder
其实就是pre-order遍历。)
优点是您不需要 create
和分配任何东西。当main
结束时,整棵树都消失了,不需要free
。 (它还消除了 create
中的错误,您只为指针分配 space,而不是为节点;它应该是 node = malloc(sizeof(*node));
。)
也许这不是您想要的,但您代码中的错误来自于在未设置时访问 node[2]
。
enter code here
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int data;
struct _node* rightChild;
struct _node* leftChild;
}Node;
Node* create(int data) { // create node function
Node* node = (Node*)malloc(sizeof(node));
node->rightChild = NULL;
node->leftChild = NULL;
node->data = data;
return node;
}
void Inorder(Node* ptr) { // travel
if (ptr)
{
printf("%c ", ptr->data);
Inorder(ptr->leftChild);
Inorder(ptr->rightChild);
}
}
int main(void)
{
Node* node[300];
for (int i = 1; i < 300; i++) {
if (i == 1) {
node[i] = create(i);
}
else {
if (i % 2 == 0) {
node[i / 2]->leftChild = create(i);
}
else {
node[i / 2]->rightChild = create(i);
}
}
}
Inorder(node[10]);
}
我想使用 Node* 数组实现二叉树,而不是一个一个地输入变量。但我在那个领域不断出错。感谢 advice.Which 部分 我需要修改以使该部分通过 for 语句实现吗?据我了解,node数组左右两部分都传值了,为什么会报错?
您分配给的唯一 node[i]
是 node[1]
。所有其他节点都通过 leftChild
或 rightChild
字段链接。
您可以通过以下方式解决此问题,例如:
node[i] = create(i);
node[i / 2]->leftChild = node[i];
但我觉得这有点迂回,因为您现在在两个不同的地方拥有相同的数据——节点的句柄。
我猜你真正想要的是一个简单的节点结构数组,然后通过指针链接到数组中:
Node node[300] = {{0}};
node[1].data = 1;
for (int i = 2; i < 300; i++) {
node[i].data = i;
if (i % 2 == 0) {
node[i / 2].leftChild = &node[i];
} else {
node[i / 2].rightChild = &node[i];
}
}
这将创建一个平面节点数组,其中节点像二叉树一样链接在一起。例如,node[1].leftChild
是指向 node[2]
的指针。您可以通过将 &node[1]
作为 head:
Inorder(&node[1]);
(你说的Inorder
其实就是pre-order遍历。)
优点是您不需要 create
和分配任何东西。当main
结束时,整棵树都消失了,不需要free
。 (它还消除了 create
中的错误,您只为指针分配 space,而不是为节点;它应该是 node = malloc(sizeof(*node));
。)
也许这不是您想要的,但您代码中的错误来自于在未设置时访问 node[2]
。