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;声明了一个成员,该成员next是指向正在定义的结构类型的指针。在达到定义的结尾之前, typedef 名称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

小写的“节点”是一种结构类型......即结构节点{东西}是一个包含东西的节点结构。

另一方面,大写的“节点”是一种全新的数据类型,它指的是“结构节点”

通常(尽管在 C++ 中我认为可以),您不能在 C 程序中传递“节点”……例如作为函数的参数。相反,你必须传递一个“结构节点”作为你的论点......

// 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 回答
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);
}

这不会编译。编译器不知道 astruct node是什么,除了它存在。因此,您可以将结构中的定义更改为Node *next;. typedef 在声明之前不在范围内,因此它仍然无法编译。简单的答案是按照他说的做,在node之后使用标签struct,它工作正常。

于 2013-03-20T19:20:16.443 回答