结构体¶
结构体¶
考虑到408考试要求过考生给出某种数据结构的特定结构体定义,因此这边专门介绍一下
- 结构体的定义与创建
在C语言中,struct关键字用于定义结构体,结构体的最简单的定义方式为:
下面以一个例子来解释一下
//申明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句,表示结构体设计定义的结束。
struct后面是一个可选的标志(book),它是用来引用该结构体的快速标记。因此我们以后就可以这样创建数据对象。
这句话创建了一个book型变量,变量名为library
【注意】:在C语言中,如果采用这种结构体类型定义方式,那么在定义一个该结构体变量时
struct关键字不能省略。这里struct book起到的作用就和int等基本数据类型名作用一样。
上述操作也可以一步到位,在定义结构体类型的时候同时定义变量,只需要在末尾的“}”后面加上变量名即可;如下
struct book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}library;
//注意这里不再是定义声明结构体类型,而是直接创建结构体变量了,这个编译器会分配内存的;
//这样的确可以省略标识符也就是结构体名,但是只能使用一次;因为这是声明结构体的过程和定义结构体变量的过程和在了一起;并且成员变量没有初始化;
//如果你想多次使用一个结构体模块,这样子是行不通的;
对结构体初始化
为了解决命名时需要带上struct的麻烦,并且不想它是一次性的,可以用typedef关键字,其作用可以理解为给数据类型起一个“别名”。
用typedef定义新类型名来代替已有类型名,即给已有类型重新命名;
一般格式为;typedef 已有类型 新类型名;
typedef int Elem; //给int起别名Elem
//下面两句结构体定义的作用是相同的
int student;
Elem student;
在408考试时,typedef常用于给结构体类型取别名。这种方式在定义新的结构体类型时,可以省略struct关键字;例如
typedef struct book //这里的book也可以省略
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}book;//给struct book{...}取了一个别名book;
book DS; //这句话创建了一个book类型的变量,名为DS
分析:
typedef struct关键词:指明了这是一个结构体类型的定义,并为其取别名;typedef struct后面的结构体名称,这部分在已定义了结构体别名的情况下可以省略不写;- 结构体类型别名,即最后的
book,之后就可以把这个名称当作该结构体的变量名来使用;
另一个注意事项
在定义结构体类型时,当结构体成员中有指向该结构体类型变量的指针时,typedef struct后面必须加上该结构体名称。以二叉树的结点为例:
//定义一个名为Node的结构体类型
typedef stuct Node{
int data;
struct Node *lchild, *rchild; //结点的指针域,此句中struct不可以省略
}Node;
在上述代码中,分别定义了
lchild和rchild两个指针,在结构体内部定义这两个指针时,需要用到结构体名Node,因此应当在typedef struct的·后面预先声明。只有实现了预先声明,结构体内部才可以使用它本身的类型来对变量进行定义,即实现递归定义。因此【注意】:
在第二行代码
typedef struct Node中,结构体名称Node不能省略,因为后面结构体指针变量要使用;
在第四行代码
struct Node *lchild中,结构体指针不能用别名Node,因为别名Node还未生效。
- 结构体内部变量的访问\
结构体变量访问其成员变量时,使用
.运算符,而结构体指针访问其成员变量时,使用->运算符,如下所示
Node root,l,r; //声明3个Node类型的变量
root.data = 1; root.lchild = &l; root.rchild = &r; //初始化root;
root.lchild -> data = 2;
root.lchild -> data = 2; //通过指针对
l进行操作;在这句话中,因为root本身是一个Node类型的变量,故使用.,而它的成员变量lchild是一个Node类型的指针,故使用->