在c中从控制台读取二叉树

时间:2016-09-11 11:46:52

标签: c

我正在尝试使用我编写的以下函数将二叉树读入我的程序。

void readTree(struct Dnode *root)
{
    struct Dnode *temp;
    struct Dnode *input;
    char initData;

    scanf(" %c",&initData);
    input=CreateNode(initData);

    if(initData==122){
        printf("Leaf\n");
        return;
    }
    else {
        root=input;
        temp=root;
        printf("going to left of %c\n",initData);
        readTree(root->lLink);
        printf("going to right of %c\n",initData);
        readTree(root->rLink);
    }
}

一切都工作得很好,除了在树的主要部分不存在的事实。这是我的主要计划:

int main()
{
    int n=0;
    struct Dnode *root=NULL;
    printf("Enter the tree as it asks. Enter z whenever there is no children :\n");
    readTree(root);
    printf("%c",root->data);
    printf("In main");
    return;

 }

输入树后程序突然崩溃。请帮帮我。

2 个答案:

答案 0 :(得分:0)

你必须明白,作为参数传递给函数的值和evoked函数的参数是相同的,但两个局部变量完全不同。

当你的函数readTree()被激发时,会声明一个局部变量root,并且该值会自动启动为与evoked时传递给函数的值相同。 变量,main()中的root和readTree()中的根是不同的两个变量,但具有相同的值。

在函数readTree()中,您将创建一个新节点并将返回值绑定到readTree()中的变量root。正如我所写,这两个根源并不相同。因此,您的更改,绑定不会超出范围 - readTree()和main()中的根保持不变。

要处理此问题,必须将指针传递给指向struct Dnode的指针。

像这样,在main函数中,

struct Dnode *root;
readTree(&root);

和readTree()也必须更改

readTree(struct Dnode **root)

答案 1 :(得分:0)

您的代码存在一些问题。

1)您希望函数更改root但不是

在主root中是struct Dnode*,该函数需要struct Dnode*。由于C使用pass-by-value,这意味着当函数返回时,函数内部所做的任何更改都将丢失。

换句话说 - 当函数返回时,root 中的main仍然是 NULL。然后你执行:printf("%c",root->data);因为你要解除引用NULL而崩溃。

相反,该函数应采用双指针,即struct Dnode**。在功能内部,您必须在分配时使用*root = ....。并且必须像readTree(&root);

一样调用该函数

2)当它是一个叶子时,你永远不会保存它。

3)永远不会使用变量temp

4)名称root混淆了递归函数

将它们放在一起,你的代码可能是:

void readTree(struct Dnode **current)  // Double pointer
{
    struct Dnode *input;
    char initData;

    scanf(" %c",&initData);
    input=CreateNode(initData);

    *current=input; // Save the created

    if(initData==122){
        printf("Leaf\n");
        return;
    }
    else {
        printf("going to left of %c\n",initData);
        readTree(&((*current)->lLink));
        printf("going to right of %c\n",initData);
        readTree(&((*current)->rLink));
    }
}

从主要电话来看:

readTree(&root);
         ^
         notice