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 *root = newNode(5);ため、コンパイラが混乱します。

于 2014-01-30T11:55:29.180 に答える
0

コンパイラが関数宣言を見つけられない場合、そのような関数が存在すると想定しますが、int. 電話をstruct node* newNode(int data);かける前に宣言してください。newNode(...)main

于 2014-01-30T11:57:09.120 に答える
0

C の古いバージョンでは、関数を使用する前に関数を宣言する必要はありませんでした。古い C では、宣言されていない関数はint、指定されていない数の引数を返し、受け入れると想定されていました。これがエラーが発生する理由です。コンパイラは、関数がではなく をnewNode返すと想定しているためです。intstruct node *

最新の C (C99 以降) では、これを行うことはできなくなりました。関数は、使用する前に宣言する必要があります。一部のコンパイラは依然として古い動作を許可し、それに対して警告しますが、厳密に準拠する C99 プログラムは、最初に関数を宣言しないと関数を使用できません。

あなたの場合、次のコード行をmain関数の前に置く必要があります。newNodeこれにより、関数とその呼び出し方法がコンパイラに伝えられます。

struct node *newNode(int);
于 2014-01-30T11:59:11.753 に答える