【问题标题】:Problems with using "struct" in plain c在纯 c 中使用“struct”的问题
【发布时间】:2014-10-02 01:02:05
【问题描述】:

我在结构方面遇到了一些问题。我创建了一个结构和一个函数来尝试了解树数据结构的工作原理。现在的问题是,当我尝试使用命令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;
}

【问题讨论】:

  • 顺便说一句,BiTNode in typedef struct BiTNode 是多余的。
  • 您是否希望rootcreateTree(root); 语句之后为空?
  • @HolyBlackCat,实际上它并不是多余的。如果您将代码粘贴并编译(在将声明修复为@Ashalynd 和@Elliott 建议之后),那么typedef struct BiTNode 中的显式BiTNode 会阻止以下两行编译器警告:createTree(T-&gt;lchild); createTree(T-&gt;rchild);warning: incompatible pointer types passing 'struct BiTNode *' to parameter of type 'BiTree'。至少这是我的编译器告诉我的。试一试。
  • 你到底想达到什么目的?
  • @DarrenStone 哎呀,你是对的。

标签: c struct


【解决方案1】:

正确的签名是:

void createTree(BiTree T)

而不是:

void createTree(BiTree &T)

事实上,你不能在 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;
}

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

【讨论】:

  • 要清楚,C 只有指针。它不支持引用。
  • 是的,我就是这个意思。
  • @Ashalynd :签名不应该是void createTree(BiTree *T) 吗??
  • @Ashalynd :使用您的解决方案,root 在调用 createTree 后将为 NULL,而对 createTree 的调用将毫无意义。在createTree(T-&gt;lchild) 之后,T-&gt;lchild 也将保持不变。
  • @Ashalynd :显然该程序也应该工作,而不仅仅是编译。但实际上我不确定 OP 到底想达到什么目的。
【解决方案2】:

你的功能

 void createTree(BiTree &T)

应该是

void createTree(BiTree *T)

void createTree(BiTree T)

你不能在纯 C 中使用 C++ 语法通过引用传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多