调用viewTree(root);
时出现段错误 struct treeElement {
unsigned long weight;
unsigned short id;
char chr;
struct treeElement *lchild, *rchild, *parent;
};
typedef struct treeElement node;
node *root;
//INITIALIZE TREE
void initTree() {
root = malloc(sizeof(node));
currentNYT = root;
} //initTree
//VIEW TREE
void viewTree(node *tree) {
printf("%5d%5d%5d%5d%5c%lu", tree->id, tree->parent->id, tree->lchild->id, tree->rchild->id, tree->chr, tree->weight);
viewTree(tree->lchild);
viewTree(tree->rchild);
}
//ADD NODE
void addNode(char newNodeChr) {
node *newNYT, *newExternal;
newNYT = malloc(sizeof(node));
newNYT->id=maxNodes-idCount; idCount++;
newNYT->chr='\0';
newNYT->weight=0;
newNYT->parent=currentNYT;
newNYT->lchild=newNYT->rchild=NULL;
newExternal = malloc(sizeof(node));
newExternal->id=maxNodes-idCount;
newExternal->chr=newNodeChr;
newExternal->weight=1;
newExternal->parent=currentNYT;
newExternal->lchild=newExternal->rchild=NULL;
currentNYT->lchild = newNYT;
currentNYT->rchild = newExternal;
currentNYT=newNYT;
} //addNode
int main()
{
initTree();
addNode('a');
addNode('b');
viewTree(root);
getchar();
return 0;
}
答案 0 :(得分:2)
根节点是否有父节点?子叶节点是否有左右儿童?
我认为您的大部分问题都在于printf
声明 - 在尝试打印id
之前,您不会检查您正在访问的任何对象是否确实存在。在那里添加一些if
语句,看看它是否有帮助。
答案 1 :(得分:1)
在viewTree(node *tree)
中,您不会检查tree
是否为null
。当tree->id
为tree
时,当您尝试访问null
时,会出现段错误的明确配方。
null
将最终在递归调用中传递给子树。
编辑:通常,每次需要访问对象成员时都要检查null
。因此,必须确保在阅读tree != null
之前tree->id
和tree->lchild != null
之前tree->lchild->id
。
答案 2 :(得分:0)
不要只分配根节点,而是初始化它,尤其是指向兄弟节点和父节点的指针(将它们设置为NULL)。在添加节点时,您正在使用未初始化的指针。