2009-11-17 77 views
0

我在调用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; 
} 
+1

而你的问题是? – 2009-11-17 21:25:38

回答

2

根节点是否有父节点?孩子的叶子节点是否有左右儿童?

我认为你的问题大部分在于你的printf声明 - 在你试图打印id之前,你不检查你正在访问的任何对象是否实际存在。在那里添加一些if语句,看看它是否有帮助。

1

在你的viewTree(node *tree)你不会检查是否treenull或不。当您尝试访问tree->idtreenull的段错误的明确配方。

null将最终在递归调用中传递给子树。

编辑:一般来说,每次需要访问对象的成员时,都会检查null。因此,tree != null在读取tree->idtree->lchild != null之前,必须先确认tree->lchild->id

+0

同样由Tim回答,即使树参数不是NULL,在使用它们之前仍然需要检查父,子,链接是否为NULL。 +1两个答案。 – 2009-11-17 21:30:27

+0

是的,在访问更深的项目之前。 – 2009-11-17 21:31:57

0

不要只分配根节点,而是初始化它,特别是指向兄弟和父指针(将它们设置为NULL)。您在添加节点时使用未初始化的指针。