我做了一个只有根的树结构。然后由用户创建节点并将它们作为子节点添加到根节点或其他现有节点。以下是结构的外观:
#define MAXCHILDREN 5 //max children a node can have
typedef struct node{
unsigned int id;
struct node* parent;
struct node* children[MAXCHILDREN];
}node;
typedef struct spantree{
node root;
}spantree;
现在我想要实现的是说出4个节点并将它们作为子节点添加到根节点。以下是我所做的不能正常工作的内容:
for (i=0; i<4; i++){
node newNode;
newNode.id=i;
addChild(&newNode, &Root);
}
这不像我跑
那样有用showChildId(0,&amp; root); //其中第一个数字表示第一个孩子,第二个孩子等。
showChildId(1,&amp; root);
等
我得到相同的ID,这意味着只添加了一个孩子。那么我如何继续制作4个不同的节点并在循环中将它们添加到父节点(在本例中为root)?
答案 0 :(得分:3)
您正在向子列表添加临时值:
node newNode;
这会在堆栈上创建一个valus,它只存在于以下'}'之前。下一次迭代很可能会为新对象重用相同的内存块。您需要动态创建对象而不是堆栈分配它:
node *newNode = malloc sizeof (node);
newNode->id = i;
addChild (newNode, &Root);
您确实需要确保正确释放节点,否则会泄漏内存。释放节点内存的函数应该为每个子节点递归调用自身。
答案 1 :(得分:1)
这看起来像是家庭作业,所以我会尝试提供指导而不是明确的答案。
在这个循环中:
for (i=0; i<4; i++){
node newNode; // <-- newNode is created on the stack here .
newNode.id=i;
addChild(&newNode, &Root);
// <-- and is removed from the stack here.
}
每次循环迭代都会在堆栈上创建 newNode
,它只在迭代结束时才有效。
为了延长它的寿命,你需要在堆上为它分配一些内存。请查看malloc()
和free()
。
答案 2 :(得分:1)
与Alexis不同,我在这个级别的算法中没有看到任何内容,但我不确定你是在跳过细节还是混淆。
for (i=0; i<4; i++){ // I think you mean 5 here -- or rather MAXCHILDREN.
node newNode; // This is a temporary on the stack.
newNode.id=i;
addChild(&newNode, &Root); // &newNode is a pointer to that temporary.
}
因此addChild每次都会获得一个指向临时newNode的指针。它恰好位于堆栈上的相同地址,因此它们都指向同一个地方。所以他们都有相同的ID。那时堆栈位置可能已被覆盖,因此它可能是一些完全随机的值。
for (i=0; i<MAXCHILDREN; i++){
node *newNode = new node(); // C++, or use malloc if you're stuck in C
newNode->id=i;
addChild(newNode, &Root);
}
应该让你更接近你想做的事情。