typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
具体区别在于:
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;
区别就在于使用时,是否可以省去struct这个关键字。
关于在结构体内部引用:
在C语言中,当你定义了一个结构体类型(如struct LNode
),并希望在该结构体的一个成员中引用该结构体类型的指针时,你需要使用struct
关键字来明确指出这是一个结构体类型。这是因为C语言在编译时需要一个明确的类型标识符来识别类型,而在结构体类型名被定义之前,编译器无法知道LNode
是一个类型名还是一个变量名或其他标识符。
typedef struct
{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
这里有几个关键点需要注意:
-
结构体定义与类型别名:这段代码首先定义了一个匿名结构体(因为它没有直接给出结构体名),然后通过
typedef
为这个匿名结构体创建了一个别名LNode
,同时也为指向该结构体的指针类型创建了一个别名LinkList
。 -
结构体内部引用:在结构体定义内部,当你想声明一个指向该结构体类型的指针时,由于此时
LNode
这个别名还未被定义(它将在整个结构体定义完成后才通过typedef
生效),因此你不能直接使用LNode *next
。相反,你需要使用struct LNode *next
来明确告诉编译器这是一个指向struct LNode
类型的指针。 -
解决方案:如果你希望避免在结构体内部使用
struct
关键字,你可以通过先定义结构体类型名,然后再使用typedef
来创建别名的方式来实现。例如:
struct LNode {
Elemtype data;
struct LNode *next;
};
typedef struct LNode LNode, *LinkList;
或者,你也可以在定义结构体时直接使用typedef
,但结构体内部仍然需要使用struct
关键字(因为别名是在整个结构体定义完成后才创建的):
typedef struct LNode {
Elemtype data;
struct LNode *next;
} LNode, *LinkList;
这两种方式都是有效的,它们允许你在结构体内部引用该结构体类型,同时也在结构体定义之外提供了类型别名以便更方便地使用。
&符号
bool initList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));//创建头结点
L->next=NULL;//此时表为空 头结点的指针域为空
return true;
}
在上述代码中,&
符号用于表示对变量 L
的引用(或更准确地说,是指针的地址传递)。在C或C++中,当你希望一个函数能够修改其参数所指向的内容时,你会使用指针或引用(在C++中)。由于这段代码是用C语言写的,所以它使用了指针。
函数 initList
的参数 LinkList &L
在C++中会被写成 LinkList& L
,表示这是一个对 LinkList
类型(实际上是指向 LNode
结构体的指针)的引用。但在C语言中,没有直接的“引用”概念,所以我们使用指针来实现类似的功能。因此,在C语言中,函数的参数应该是 LinkList L
(但这样函数内部对 L
的修改不会反映到函数外部,因为传递的是指针的副本),或者更常见的做法是使用指针的指针(LinkList *L
)或者在这里直接使用指针(LinkList L
但通常通过传递其地址来修改它)。