|
親へのポインタを消しました。あった方が楽ですけど。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct unity_t {
int id;
struct unity_t *l_child;
struct unity_t *r_child;
} Unity;
typedef struct rhizome_t {
Unity *root;
struct rhizome_t *next;
} Rhizome;
Rhizome *gb_head = NULL;
void printAll_sub(Unity *root)
{
if (root->l_child == NULL || root->r_child == NULL)
return;
fprintf(stderr, "%d,%d,%d\n", root->id, root->l_child->id, root->r_child->id);
printAll_sub(root->l_child);
printAll_sub(root->r_child);
}
void printAll(void)
{
Rhizome *idx;
fprintf(stderr, "###########################################\n");
for (idx = gb_head->next; idx != NULL; idx = idx->next) {
printAll_sub(idx->root);
}
fprintf(stderr, "###########################################\n");
}
Unity *searchUnit_sub(Unity *root, int id)
{
Unity *temp;
if (root == NULL || root->id == id)
return root;
if ((temp = searchUnit_sub(root->l_child, id)) != NULL)
return temp;
return searchUnit_sub(root->r_child, id);
}
Unity *searchUnit(int id)
{
Rhizome *tree;
Unity *temp;
for (tree = gb_head; tree != NULL; tree = tree->next) {
if ((temp = searchUnit_sub(tree->root, id)) != NULL)
return temp;
}
return NULL;
}
Unity *creatNode(int id)
{
Unity *temp;
if ((temp = malloc(sizeof(Unity))) == NULL)
return NULL;
temp->id = id;
temp->l_child = NULL;
temp->r_child = NULL;
return temp;
}
int addNode(Unity *node, int l_child_id, int r_child_id)
{
if ((node->l_child = creatNode(l_child_id)) == NULL)
return 0;
if ((node->r_child = creatNode(r_child_id)) == NULL)
return 0;
return 1;
}
int addTree(int parent_id, int l_child_id, int r_child_id)
{
Rhizome *tail;
for (tail = gb_head; tail->next != NULL; tail = tail->next)
;
if ((tail->next = malloc(sizeof(Rhizome))) == NULL)
return 0;
tail = tail->next;
if ((tail->root = malloc(sizeof(Unity))) == NULL)
return 0;
tail->root->id = parent_id;
tail->next = NULL;
addNode(tail->root, l_child_id, r_child_id);
return 1;
}
void unitAddition(int parent_id, int l_child_id, int r_child_id)
{
Unity *parent_node;
if (searchUnit(l_child_id) != NULL || searchUnit(r_child_id) != NULL) {
printAll();
exit(1);
}
if ((parent_node = searchUnit(parent_id)) != NULL) {
if (parent_node->l_child != NULL || parent_node->r_child != NULL) {
printAll();
return;
}
if (!addNode(parent_node, l_child_id, r_child_id))
goto error;
} else {
if (!addTree(parent_id, l_child_id, r_child_id))
goto error;
}
return;
error:
fprintf(stderr, "メモリ不足\n");
printAll();
exit(1);
}
int printFamilyTree_sub(Unity *root, int id)
{
if (root == NULL) return 0;
if (root->id == id) goto print;
if (printFamilyTree_sub(root->l_child, id))
goto print;
if (printFamilyTree_sub(root->r_child, id))
goto print;
return 0;
print:
printf("%d,", root->id);
return 1;
}
void printFamilyTree(int id)
{
Rhizome *tree;
for (tree = gb_head; tree != NULL; tree = tree->next) {
printFamilyTree_sub(tree->root, id);
}
printf("\b\n");
}
int main(void)
{
int node_id, l_child_id, r_child_id;
int status;
gb_head = malloc(sizeof(Rhizome));
for (;;) {
for (;;) {
char buf[1024];
fgets(buf, sizeof(buf), stdin);
status = sscanf(buf, "%d,%d,%d", &node_id, &l_child_id, &r_child_id);
if (status == 1 || status == 3)
break;
}
if (status == 3) {
if (node_id >= l_child_id || node_id >= r_child_id) {
printAll();
return 1;
}
unitAddition(node_id, l_child_id, r_child_id);
} else if (status == 1) {
printFamilyTree(node_id);
}
}
return 0;
}
|