Change node counting system
This commit is contained in:
parent
f053b6cc5a
commit
1559a0d51c
11
src/main.c
11
src/main.c
|
@ -16,21 +16,26 @@ int main(int argc, char** argv){
|
||||||
NOD_NodeAddChild(node, node);
|
NOD_NodeAddChild(node, node);
|
||||||
NOD_NodeAddChild(testchild, node);
|
NOD_NodeAddChild(testchild, node);
|
||||||
|
|
||||||
|
NOD_NodeUnparent(justtotest);
|
||||||
|
|
||||||
printf("\nThe name of the node is \"%s\"\n", node->name);
|
printf("\nThe name of the node is \"%s\"\n", node->name);
|
||||||
for(int i = 0; i < node->childc; i++){
|
for(int i = 0; i < NOD_NodeChildCount(node); i++){
|
||||||
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\nThe name of the node is \"%s\"\n", node->name);
|
printf("\nThe name of the node is \"%s\"\n", node->name);
|
||||||
for(int i = 0; i < node->childc; i++){
|
for(int i = 0; i < NOD_NodeChildCount(node); i++){
|
||||||
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\nThe amount of children is %d, the real size is %d\n",
|
printf("\nThe amount of children is %d, the real size is %d\n",
|
||||||
node->childc,
|
NOD_NodeChildCount(node),
|
||||||
(int)sizeof(testchild)
|
(int)sizeof(testchild)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
NOD_PrintNodeTree(node);
|
||||||
|
|
||||||
NOD_DestroyNode(node);
|
NOD_DestroyNode(node);
|
||||||
NOD_DestroyNode(testchild);
|
NOD_DestroyNode(testchild);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
39
src/node.c
39
src/node.c
|
@ -87,19 +87,44 @@ void NOD_NodeAddChild(NOD_Node* parent, NOD_Node* child){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NOD_NodeRemoveChild(NOD_Node* parent, NOD_Node* child){
|
void NOD_NodeUnparent(NOD_Node* node){
|
||||||
if(parent != NULL && child != NULL){
|
if(node != NULL && node->parent != NULL){
|
||||||
if(parent->childc < 1 || parent->childv == NULL){
|
NOD_Node* parent = node->parent;
|
||||||
|
|
||||||
|
for(int i = 0; i < parent->childc; i ++){
|
||||||
|
if(parent->childv[i] == node){
|
||||||
|
parent->childv[i] = NULL;
|
||||||
|
|
||||||
|
/* Free allocated memory if last child */
|
||||||
|
if(i + 1 == parent->childc){
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"NOD_Error: Cannot remove child \"%s\". Node \"%s\" has no children.\n",
|
"NOD_Debug: Freeing last child of vector...\n");
|
||||||
child->name,
|
parent->childv = realloc(parent->childv, sizeof(node) * parent->childc);
|
||||||
parent->name);
|
parent->childc--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node->parent = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NOD_PrintNodeTree(NOD_Node* node){
|
void NOD_PrintNodeTree(NOD_Node* node){
|
||||||
if(node != NULL){
|
if(node != NULL){
|
||||||
printf("%s", node->name);
|
printf("\"%s\"\n", node->name);
|
||||||
|
for(int i = 0; i < node->childc; i++){
|
||||||
|
if(i+1 != node->childc) printf("├── ");
|
||||||
|
else printf("└── ");
|
||||||
|
printf("\"%s\"\n", node->childv[i]->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int NOD_NodeChildCount(NOD_Node* node){
|
||||||
|
unsigned int count = 0;
|
||||||
|
for(int i = 0; i < node->childc; i++){
|
||||||
|
if(node->childv[i] != NULL) count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
typedef struct node{
|
typedef struct node{
|
||||||
char* name;
|
char* name;
|
||||||
|
|
||||||
|
/** childc keeps track of allocated space,
|
||||||
|
not amount of children. For that use
|
||||||
|
NOD_NodeChildCount */
|
||||||
int childc;
|
int childc;
|
||||||
struct node** childv;
|
struct node** childv;
|
||||||
struct node* parent;
|
struct node* parent;
|
||||||
|
@ -14,6 +17,9 @@ NOD_Node* NOD_CreateNode(char* name);
|
||||||
void NOD_DestroyNode(NOD_Node* node);
|
void NOD_DestroyNode(NOD_Node* node);
|
||||||
|
|
||||||
void NOD_NodeAddChild(NOD_Node* parent, NOD_Node* child);
|
void NOD_NodeAddChild(NOD_Node* parent, NOD_Node* child);
|
||||||
void NOD_NodeRemoveChild(NOD_Node* parent, NOD_Node* child);
|
void NOD_NodeUnparent(NOD_Node* child);
|
||||||
|
|
||||||
|
void NOD_PrintNodeTree(NOD_Node* node);
|
||||||
|
int NOD_NodeChildCount(NOD_Node* node);
|
||||||
|
|
||||||
#endif // __NODE_H_
|
#endif // __NODE_H_
|
||||||
|
|
Loading…
Reference in New Issue