이 코드는 깊이를 기준으로 트리를 채 웁니다. 그러나 트리를 탐색 할 때 부모 노드를 반복하지 않고 실제 자식 수를 결정할 수는 없습니다. 서브 리프가 현재 노드 아래의 노드에 저장되기 때문에 이것은 필요합니다. 어떤 개념적인 변경이 현재 노드 내에 직접 leafs를 저장하는데 필요합니까? 당신이 "realloc을"노드 목록, 실제로 메모리에 노드 객체를 이동하면구조적 트리 구조 리프팅
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef NULL
#define NULL ((void *) 0)
#endif
// ----
typedef struct _Tree_Node {
// data ptr
void *p;
// number of nodes
int cnt;
struct _Tree_Node **nodes;
// parent nodes
struct _Tree_Node *parent;
} Tree_Node;
typedef struct {
Tree_Node root;
} Tree;
void Tree_Init(Tree *this) {
this->root.p = NULL;
this->root.cnt = 0;
this->root.nodes = NULL;
this->root.parent = NULL;
}
Tree_Node* Tree_AddNode(Tree_Node *node) {
if (node->cnt == 0) {
node->nodes = malloc(sizeof(Tree_Node *));
} else {
node->nodes = realloc(
node->nodes,
(node->cnt + 1) * sizeof(Tree_Node *)
);
}
Tree_Node *res
= node->nodes[node->cnt]
= malloc(sizeof(Tree_Node));
res->p = NULL;
res->cnt = 0;
res->nodes = NULL;
res->parent = node;
node->cnt++;
return res;
}
// ----
void handleNode(Tree_Node *node, int depth) {
int j = depth;
printf("\n");
while (j--) {
printf(" ");
}
printf("depth=%d ", depth);
if (node->p == NULL) {
goto out;
}
int cnt = 0;
for (int i = 0; i < node->parent->cnt - 1; i++) {
if (node->parent->nodes[i] == node) {
cnt = node->parent->nodes[i + 1]->cnt;
}
}
printf("value=%s cnt=%i", node->p, cnt);
out:
for (int i = 0; i < node->cnt; i++) {
handleNode(node->nodes[i], depth + 1);
}
}
Tree tree;
int curdepth;
Tree_Node *curnode;
void add(int depth, char *s) {
printf("%s: depth (%d) > curdepth (%d): %d\n", s, depth, curdepth, depth > curdepth);
if (depth > curdepth) {
curnode = Tree_AddNode(curnode);
Tree_Node *node = Tree_AddNode(curnode);
node->p = malloc(strlen(s) + 1);
memcpy(node->p, s, strlen(s) + 1);
curdepth++;
} else {
while (curdepth - depth > 0) {
if (curnode->parent == NULL) {
printf("Illegal nesting\n");
return;
}
curnode = curnode->parent;
curdepth--;
}
Tree_Node *node = Tree_AddNode(curnode);
node->p = malloc(strlen(s) + 1);
memcpy(node->p, s, strlen(s) + 1);
}
}
void main(void) {
Tree_Init(&tree);
curnode = &tree.root;
curdepth = 0;
add(0, "1");
add(1, "1.1");
add(2, "1.1.1");
add(3, "1.1.1.1");
add(4, "1.1.1.1.1");
add(4, "1.1.1.1.2");
add(4, "1.1.1.1.3");
add(4, "1.1.1.1.4");
add(2, "1.1.2");
add(0, "2");
handleNode(&tree.root, 0);
}
달성하려는 목표가 명확하지 않습니다. 제발 정교하게 예를 들어주세요 –
미안 해요, 나는 그것이 내가 의미했던 것이 아주 분명하다고 생각했습니다. 문제는 handleNode()에서 현재 리프가 가진 (부모) 노드의 수를 파악할 수 없다는 것입니다. node-> parent-> cnt는 나에게 분명해 보였지만 if (node-> parent! = NULL)를 추가 한 후에도 Valgrind는 나에게 많은 경고를 주었고 printf()는 잘못된 숫자를 출력했다. 이는 Giuseppe가 지적했듯이 realloc() 이후 포인터가 더 이상 같은 노드에 표시되지 않기 때문입니다. – user206268
그런 식으로 "this"를 사용하거나 "NULL"을 다시 정의하면 안됩니다 ... C++ 컴파일러에서 사용하기로 결정하면 문제가 발생할 수 있습니다. –