我有一个分配要求我从txt读取一个通用树,在内存中分配树然后执行一系列操作,如删除节点,删除子树,列出节点的子节点,列出节点的后代,以及我遇到问题的节点,列出节点的父节点。使用的语言是C.可能有C ++语言的元素不是“快捷方式”,例如使用类。
我将此结构用于通用树:
typedef struct genTree
{
char info;
struct genTree* first; //points to the first child of a node
struct genTree* next; //points to the first sibling of a node
}tgt;
typedef tgt* pgt;
这意味着节点的父亲指向它的第一个孩子,然后这个孩子指向它的兄弟姐妹。
我想出了这个总是返回树根的函数:
pgt find_father(pgt root, char SON_PARAM)
{
pgt son, father;
if(root == NULL) return NULL;
if(root->info == SON_NODE) return root;
if(root->next != NULL) {
son = find_father(root->next, SON_NODE);
return son;
}
else {
father = root;
son = find_father(root->first, SON_NODE);
if(son == NULL) return NULL;
else return son;
}
}
感谢任何帮助。
答案 0 :(得分:1)
您的函数在所有情况下都没有return语句。您应该返回struct genTree *
类型的内容。此外,当您设置b->first = find_father(root->next, NODE_PARAM)
时,您实际上会覆盖整个树。请注意,b
不是struct genTree
,而是struct genTree *
。这意味着您要将first
点中的字段b
重置为。最后,您必须在此处进行深度优先搜索,因为您没有反向引用。最简单的方法是在struct genTree
中引入反向引用。假设我理解你正在尝试做什么,试试这个:
struct genTree
{
char info;
struct genTree* parent; //points to the parent of a node (NULL if root)
struct genTree* first; //points to the first child of a node
struct genTree* next; //points to the first sibling of a node
}
struct genTree* find_father(struct genTree* root, char NODE_PARAM)
{
struct genTree* b;
if(root == NULL) return NULL; //standard error checking
if(root->info == NODE_PARAM) return root->parent;
b = find_father(root->first, NODE_PARAM);
if(b == NULL)
{
b = find_father(root->next, NODE_PARAM);
}
return b;
}
在这种情况下,退出代码为1可能是由于处理器正在尝试读取垃圾回收值这一事实。如果它是一个数字就可以了,但垃圾指针(即使它只是NULL)通常是个问题。