在普通c中使用"struct"的问题

kem*_*iya 0 c struct

我在这里遇到了一些问题.我已创建一个结构和功能,试图了解该树数据结构works.Now的问题是,当我尝试编译命令下面的代码gcc test.c -o test,编译器总是返回错误信息error? expected ‘;’, ‘,’ or ‘)’ before ‘&’ token,请给我一些帮助.

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

void createTree(BiTree &T)
{
    int i;
    scanf("%d", &i);
    if(i == -1)
    {
        T = NULL;
    }
    else
    {
        T = (BiTNode *)malloc(sizeof(BiTNode));
        T->data = i;
        createTree(T->lchild);
        createTree(T->rchild);
    }
}

int main(void)
{
    BiTNode* root = NULL;
    createTree(root);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*ynd 5

正确的签名是:

void createTree(BiTree T)
Run Code Online (Sandbox Code Playgroud)

并不是:

void createTree(BiTree &T)
Run Code Online (Sandbox Code Playgroud)

事实上,你不能在C函数签名中使用&.你这样做的方式在C++中是有效的,它支持引用.C不这样做.

但是,您可以createTree(BiTNode* T)在签名中使用指针(例如),但在您的情况下不需要它,因为您已经指定BiTree是指向BiTNode的指针.

重要更新:此更改将使您的函数编译,但为了使其工作,您还需要确保您可以实际使用在该函数内创建的指针.有两种方法可以做到这一点:

1)返回新指针作为结果:

BiTree createTree()
{
    BiTree T;
    int i;
    scanf("%d", &i);
    if(i == -1)
    {
        T = NULL;
    }
    else
    {
        T = (BiTNode *)malloc(sizeof(BiTNode));
        T->data = i;
        T->lchild = createTree();
        T->rchild = createTree();
    }
    return T;
}

int main(void)
{
    BiTNode* root = NULL;
    root = createTree();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

2)将指向BiTree的指针作为函数参数(也许这就是你对引用的意义).

void createTree(BiTree *T)
{
    int i;
    scanf("%d", &i);
    if(i == -1)
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = i;
        createTree(&(*T)->lchild);
        createTree(&(*T)->rchild);
    }
}

int main(void)
{
    BiTNode* root = NULL;
    createTree(&root);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @Ashalynd:签名不应该是`void createTree(BiTree*T)`?? (2认同)
  • @Ashalynd:在调用`createTree`之后,你的解决方案`root`将为NULL,而对`createTree`的调用将毫无意义.并且在`createTree(T-> lchild)`之后,`T-> lchild`将保持不变. (2认同)