2009-11-17 80 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)。您在添加節點時使用未初始化的指針。