跳转至

结构体

结构体

考虑到408考试要求过考生给出某种数据结构的特定结构体定义,因此这边专门介绍一下

  1. 结构体的定义与创建

在C语言中,struct关键字用于定义结构体,结构体的最简单的定义方式为:

struct 结构体名 {
    成员列表   //注意;其中每个成员可以使用任何一种c数据结构甚至是其他的结构体,也是可以的;
};

下面以一个例子来解释一下

//申明一个结构体 
struct book 
{
    char title[MAXTITL];//一个字符串表示的titile 题目 ; 
    char author[MAXAUTL];//一个字符串表示的author作者 ; 
    float value;//一个浮点型表示的value价格; 
};//注意分号不能少,这也相当于一条语句,表示结构体设计定义的结束。

struct后面是一个可选的标志(book),它是用来引用该结构体的快速标记。因此我们以后就可以这样创建数据对象。

struct book library;//把library设为一个可以使用book结构体的结构体变量,则library这个变量就包含了其book结构体中的所有元素

这句话创建了一个book型变量,变量名为library

【注意】:在C语言中,如果采用这种结构体类型定义方式,那么在定义一个该结构体变量时struct关键字不能省略。这里struct book起到的作用就和int等基本数据类型名作用一样。

上述操作也可以一步到位,在定义结构体类型的时候同时定义变量,只需要在末尾的“}”后面加上变量名即可;如下

struct book 
{
    char title[MAXTITL];
    char author[MAXAUTL]; 
    float value;
}library;
//注意这里不再是定义声明结构体类型,而是直接创建结构体变量了,这个编译器会分配内存的;
//这样的确可以省略标识符也就是结构体名,但是只能使用一次;因为这是声明结构体的过程和定义结构体变量的过程和在了一起;并且成员变量没有初始化;
//如果你想多次使用一个结构体模块,这样子是行不通的;

对结构体初始化

struct book s1={
    "Data Struct",
    "dalao",
    55
};

为了解决命名时需要带上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的·后面预先声明。只有实现了预先声明,结构体内部才可以使用它本身的类型来对变量进行定义,即实现递归定义。因此

【注意】:

1在第二行代码typedef struct Node中,结构体名称Node不能省略,因为后面结构体指针变量要使用;

2在第四行代码struct Node *lchild中,结构体指针不能用别名Node,因为别名Node还未生效。

  1. 结构体内部变量的访问\ 结构体变量访问其成员变量时,使用.运算符,而结构体指针访问其成员变量时,使用->运算符,如下所示
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类型的指针,故使用->