分段故障 - 显示树

时间:2009-11-17 21:22:55

标签: c segmentation-fault

调用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;
}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

viewTree(node *tree)中,您不会检查tree是否为null。当tree->idtree时,当您尝试访问null时,会出现段错误的明确配方。

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

编辑:通常,每次需要访问对象成员时都要检查null。因此,必须确保在阅读tree != null之前tree->idtree->lchild != null之前tree->lchild->id

答案 2 :(得分:0)

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