11

リンクされたデータ構造をよりよく理解するために、教授のコード例を研究しています。

linked-list.cの例では、教授はタイプノードを次のように定義しています。

typedef struct node {
  int data;
  struct node *next;
} Node;

小文字ノードのポイントは何ですか?私はあなたがただ書くことができるという印象を受けました、例えば:

typedef struct {
  int data;
  struct node *next;
} Node;

次に、Nodeを独自のタイプとして使用します。小文字のノードを含めないと、コンパイラがコードを評価しているときに、「struct node * next」の意味を理解できないという事実と関係がありますか?

4

6 に答える 6

16

この宣言を見てください:

struct node {
  int data;
  struct node *next;
};

typedef struct node Node;

これは、単一のステートメントに組み合わせることができます(宣言を簡略化します)。

typedef struct node {
  int data;
  struct node *next;
} Node;
于 2013-03-20T19:04:14.230 に答える
10

小文字を含めないとnode、コンパイラがコードを評価しているときに「」の意味を理解できないという事実と関係がありstruct node *nextますか?

はい。

nodeinstruct nodeは、構造体タイプのタグです。構造体にタグを付けると、タグが完成した瞬間からそのタイプを参照できるようになります。

typedef struct node {
  int data;
  struct node *next;
} Node;

は、定義されている構造体タイプへのポインタでstruct node *next;あるメンバーを宣言します。nexttypedef名は、定義が終了するNode前に使用できません。;

typedefタグを省略すると、が完了する前に定義されているタイプを参照することはできません。

typedef struct {
  int data;
  struct node *next;
} Node;

この行は、を指すタグを使用してstruct node *next;、新しい、無関係の、不完全な型を宣言します。structnodenext

これは有効ですが、(他の場所で定義されていない限り)何もstruct node知られていないため、nextどこでも完全な型へのポインターにキャストせずにポインターを使用することはできません(どこでも完全に機能するわけではありませんNode foo; foo.next = malloc(12);)。

于 2013-03-20T19:20:30.650 に答える
1

彼は、各構造体オブジェクトの宣言への書き込みを回避するためによく知られた手法を使用しているため、ノードの一時的な名前を定義しています。struct node

彼がただやるなら:

struct node {
  int data;
  struct node *next;
};

あなたは使用しなければならなかったでしょう:

struct node* node;

新しいノードを宣言します。そして、それを避けるために、後で定義する必要があります。

typedef struct node Node;

次のようなオブジェクトを宣言できるようにするために:

Node* node;

最終的には:

typedef struct node {
  int data;
  struct node *next;
} Node;

struct node { ... };に加えての単なるショートカットですtypedef struct node Node;

于 2013-03-20T19:06:42.567 に答える
0

これは次struct nodeのようなタイプですint

それゆえ

struct node {
  int data;
  struct node *next;
}NodeVar;

構造体ノードの単一の変数ノードを宣言していることを意味します。

お気に入りint intVar;

typedefは、コードを理解しやすくするためのものです。

使用するときに

typedef struct node Node;

と同じ宣言を使用できます

Node NodeVar;
于 2013-03-20T19:11:53.077 に答える
0

このコードを考えてみましょう:

#include <stdio.h>

typedef struct {
   int data;
   struct node *next;
} Node;

int main()
{
   Node a, b = {10, NULL};
   a.next = &b;

   printf("%d\n", a.next->data);
}

これはコンパイルされません。コンパイラはstruct node、それが存在することを除いて、が何であるかを知りません。したがって、構造体の定義をに変更することができますNode *next;。typedefは宣言される前はスコープ内にないため、コンパイルされません。簡単な答えは、彼が言ったように、node後にタグを使用することですstruct、そしてそれはうまくいきます。

于 2013-03-20T19:20:16.443 に答える
0

小文字の「node」は構造体タイプです...つまり、struct node {stuff}は、stuffを含むノード構造体です。

一方、大文字の「ノード」は、「構造体ノード」を参照するまったく新しいデータ型です。

一般に(C ++では可能だと思いますが)、Cプログラムの「ノード」を渡すことはできません...たとえば、関数の引数として。むしろ、引数として「structnode」を渡す必要があります...

// this will throw a syntax error because "node" is not a data type, 
// it's a structure type.

void myFunc( node* arg ); 

// while this will not because we're telling the compiler we're 
// passing a struct of node

void myFunc( struct node* arg ); 

// On the other hand, you *can* use the typedef shorthand to declare 
// passing a pointer to a custom data type that has been defined 
// as 'struct node'

void myFunc( Node* arg );
于 2013-03-20T20:18:24.700 に答える