2009-11-17 4 views
0

viewTree (루트)를 호출 할 때 segfault가 발생합니다.세그먼트 화 오류 - 트리 표시

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

그리고 귀하의 질문은 무엇입니까? –

답변

2

루트 노드에 부모가 있습니까? 자식 리프 노드에 왼쪽 자식과 오른쪽 자식이 있습니까?

대부분의 문제는 printf 문에 들어 있다고 생각합니다. id을 인쇄하기 전에 실제로 액세스중인 개체가 있는지 여부를 확인하지 마십시오. 거기에 if 문장을 추가하고 도움이되는지 확인하십시오.

1

viewTree(node *tree)treenull인지 확인하지 않았습니다. treenull 일 때 tree->id에 액세스하려고하면 segfault에 대한 명확한 제조법이 적용됩니다.

null은 재귀 호출에서 하위 트리로 전달됩니다.

편집 : 일반적으로 개체의 구성원에 액세스해야 할 때마다 null을 확인해야합니다. 그러므로 을 읽기 전에 tree->idtree->lchild != null을 읽고 나서 tree->lchild->id을 읽어야합니다.

+0

또한 Tim이 답변 한 것처럼 tree 인수가 NOT NULL이더라도 부모, 자식, 링크가 NULL인지 확인한 후에 사용해야합니다. 두 대답 모두 +1. –

+0

더 깊은 품목에 액세스하기 전에 그래, 그래. –

0

루트 노드를 할당하지 말고 형제 노드와 부모 노드 (NULL로 설정)에 대한 포인터를 초기화하십시오. 노드를 추가 할 때 초기화되지 않은 포인터를 사용하고 있습니다.

관련 문제