0

我正在尝试编写一个简单的代码来用 C 语言构造一棵树。下面是我的代码片段。

#include<stdio.h>

struct node
{
  int data;
  struct node *left;
  struct node *right;
};

int main()
{
  struct node *root = newNode(5);
  //struct node *root = NULL; working piece
  //newNode(&root,5); working piece
  if(root == NULL)
  {
    printf("No root\n");
    return 0;
  }
  //root->left = newNode(4);
  //root->right = newNode(3);
  //root->left->left = newNode(2);
  //root->right->right = newNode(1);

  return 0;
}

struct node* newNode(int data)
{
  struct node *temp;
  temp = (struct node*) malloc(sizeof(struct node));
  temp->data = data;
  temp->left = NULL;
  temp->right = NULL;

  return(temp);
}

当我尝试返回结构节点地址时,编译器给了我错误

"rightNode.c", line 29: identifier redeclared: newNode
        current : function(int) returning pointer to struct node {int data, pointer to struct node {..} left, pointer to struct node {..} right}
        previous: function() returning int : "rightNode.c", line 12

但是,当我对此发表评论struct node* newNode(int data)并尝试通过将结构的地址传递给下面的函数来定义一个返回 int 的函数时,它不会向我显示任何错误。

int newNode(struct node **root,int data)
{
  printf("Inside New Node\n");
  return 0;
}

据我所知,在 C 中将结构的地址返回给调用函数是合法的。

这与编译器有关。

我在 unix 环境中使用 cc 编译器

type cc
cc is a tracked alias for /apps/pcfn/pkgs/studio10/SUNWspro/bin/cc

下面是我用来编译的命令cc rightNode.c

任何帮助,将不胜感激...

4

5 回答 5

1

将其放在struct node* newNode(int data)代码上方并包含stdlib.h.

如果要在声明函数之前使用函数,则需要函数原型。malloc 也在 stdlib.h 中定义。

于 2014-01-30T11:55:08.827 回答
1

newNode在使用它之前,您需要声明一个原型。

// somewhere after struct node definition and before first use
struct node* newNode(int);

您还需要包括stdlib.h才能获得malloc.

于 2014-01-30T11:55:22.060 回答
1

调用时没有可见的函数原型,struct node *root = newNode(5);因此编译器会感到困惑。

于 2014-01-30T11:55:29.180 回答
0

在旧版本的 C 中,您不需要在使用函数之前声明它。在较旧的 C 中,假定未声明的函数返回int并接受未指定数量的参数。这就是您收到错误的原因,因为编译器假定newNode函数返回int,而不是struct node *.

在现代 C(C99 和更新版本)中,您不能再这样做了。您必须在使用函数之前声明它们。一些编译器仍然允许旧的行为并警告它,但是一个严格符合 C99 的程序不能使用一个函数而不先声明它。

在您的情况下,您应该将以下代码行放在您的main函数之前。这告诉编译器该newNode函数以及它应该如何被调用:

struct node *newNode(int);
于 2014-01-30T11:59:11.753 回答
0

当编译器找不到函数声明时,它假定该函数存在,但返回int. 在struct node* newNode(int data);你打电话之前声明。newNode(...)main

于 2014-01-30T11:57:09.120 回答