第10章结构体.ppt

上传人:本田雅阁 文档编号:3122299 上传时间:2019-07-13 格式:PPT 页数:36 大小:373.02KB
返回 下载 相关 举报
第10章结构体.ppt_第1页
第1页 / 共36页
第10章结构体.ppt_第2页
第2页 / 共36页
第10章结构体.ppt_第3页
第3页 / 共36页
第10章结构体.ppt_第4页
第4页 / 共36页
第10章结构体.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《第10章结构体.ppt》由会员分享,可在线阅读,更多相关《第10章结构体.ppt(36页珍藏版)》请在三一文库上搜索。

1、第10章 结构体,10.1 问题的提出 10.2 用typedef命名类型 10.3 结构体类型和结构体变量 10.4 结构体数组 10.5 结构体指针 10.6 用指针处理链表 10.7 共用体类型 10.8 枚举类型,10.1 问题的提出,在实际应用中,有时需要将不同类型的数据组合成一个有机的整体,以便于使用。 例如:如何把一个学生的学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、家庭地址(address)等数据项有机地组织起来? 办法是定义新的数据类型sutdent,如下所示。 struct student int num; char name20;

2、 char sex; int age; float score; char address30; ;,10.2 用typedef命名类型,C语言允许使用typedef为已有的类型指定同义的新类型。 例如:typedef int INTEGER; 指定用INTEGER代表int类型。这样,以下两行语句等价: int i, j; INTEGER i, j; 声明一个新的类型名的方法是: typedef 类型名 新类型名 例:typedef int NUM100; NUM a; 首先声明NUM为整型数组类型,接着定义a为整型数组类型。 例:typedef char* CHARPTR; CHARPTR

3、 p; 首先声明CHARPTR为指向char类型的指针类型,接着定义p为char类型的指针变量。 例:typedef int (*FUNCPTR)( ); FUNCPTR fp; 首先声明FUNCPTR为指向函数的指针类型,接着定义fp为FUNCPTR类型的指针变量。,说明: 用typetef可以指定各种类型名,但不能用来定义变量。例如用来声明数组类型、字符串类型等,使用比较方便。 用typedef语句只是对已经存在的类型指定一个新类型名,并未产生新的类型。 当不同源文件用到同一数据类型时,常常使用typedef声明一些数据类型,并放在头文件里,然后在需要的地方用#include命令把相应的头

4、文件包含进来。,10.2 用typedef命名类型,10.3 结构体类型和结构体变量,10.3.1 结构体类型 声明一个结构体类型的一般形式为: struct 结构体名 成员列表; ; 例如, struct student int num; char name20; char sex; ; 定义一个新的结构体类型struct student,这是一个类型名,它和系统提供的标准类型一样具有相同的作用,都是可以用来定义变量的类型。,说明: 结构体类型并不是只有一种,而是可以设计出许多种结构体类型。 结构体类型中的成员也可以是一个结构体变量。,10.3.2 定义结构体类型变量 定义结构体类型的变量,

5、有4种方式 1. 先声明结构体类型再定义变量 例如首先声明结构体类型struct student: struct student int num; char name20; char sex; int age; float score; char address30; ; 然后再定义结构体类型struct student的变量: struct student std1, std2;,10.3 结构体类型和结构体变量,2. 使用typedef声明,例如首先声明结构体类型struct student: struct student int num; char name20; char sex; i

6、nt age; float score; char address30; ; typedef struct student stud; 然后再定义结构体类型stud的变量: stud std1, std2;,10.3 结构体类型和结构体变量,3. 结构体的定义与typedef的使用合二为一,typedef struct student int num; char name20; char sex; int age; float score; char address30; stud; stud std1, std2;,10.3 结构体类型和结构体变量,4. 不指定类型名而直接定义结构体类型变量

7、,struct int num; char name20; char sex; int age; float score; char address30; std1, std2;,10.3 结构体类型和结构体变量,10.3.3 引用结构体变量,在定义了结构体变量以后,就可以引用这个变量。但应遵守以下规则: (1)相同类型的结构体变量可以互相赋值,例如, std1 = std2; 但是不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量中的各个成员分别进行输入和输出。 引用结构体变量中成员的方式为: 结构体变量名.成员名 例如,std1.num表示std1变量中的num成员。可以对变

8、量的成员赋值,例如,std1.num = 10001; “.”是成员运算符,它是优先级最高的运算符之一。,10.3 结构体类型和结构体变量,(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。 (3)对结构体变量中的成员可以像普通变量一样进行各种运算。例如,std1.age+; (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如, scanf(“%d“, / 以16进制输出std1的起始地址,10.3 结构体类型和结构体变量,10.3.4 结构体变量的初始化,【例10-1】 对结构体变量进行

9、初始化。 #include struct student int num; char name20; char sex; char address30; ; typedef struct student stud; int main() stud std = 10001, “Li Jun“, M, “Kunming“; printf(“No.: %dnname: %snsex: %cnaddress: %sn“, std.num, std.name, std.sex, std.address); return 0; ,10.3 结构体类型和结构体变量,10.4.1 定义结构体数组 10.4.2

10、 结构体数组的初始化 10.4.3 结构体数组应用举例,【例10-2】 对候选人得票进行统计。假设有3个候选人,选民每次输入一个候选人的姓名,要求最后输出各人得票结果。 struct Candidate char name20; int count; ; typedef struct Candidate Cand; int main() int i, j; char name20; Cand candidates3 =“Li“, 0, “Zhang“, 0, “Wang“, 0;,10.4 结构体数组,for (i = 1; i = 10; i+) printf(“please input c

11、andidates name: “); scanf(“%s“, ,10.4 结构体数组,程序输入及运行结果:,please input candidates name: Li please input candidates name: Wang please input candidates name: Li please input candidates name: Li please input candidates name: Zhang please input candidates name: Wang please input candidates name: Li please

12、input candidates name: Wang please input candidates name: Wang please input candidates name: Li result: Li: 5 Zhang: 1 Wang: 4,10.4 结构体数组,10.5.1 指向结构体变量的指针变量,【例10-3】 通过指向结构体变量的指针输出该结构体变量的信息。 #include #include struct student int num; char name20; char sex; double score; ; typedef struct student stud;

13、 void main() stud std; / 定义struct student类型的变量 stud *stdptr; / 定义指针变量 stdptr = ,10.5 结构体指针,在C语言中,如果p是一个指向结构体变量s的指针,可以使用以下三种方式来访问结构体变量s中的数据成员: s.成员名 (*p).成员名 p-成员名(其中“-”符号称为指向运算符),10.5 结构体指针,10.5.2 指向结构体数组的指针 例10.4 #include struct student int num; char name20; char sex; int age; ; typedef struct stud

14、ent stud; void main() stud students3=10001,“Li Jun“,M,18, 10002,“Zhang Fang“,F,19, 10003,“Wang Wei“,M,20; stud *stdptr; / 定义指针变量 for(stdptr=students;stdptr!=students+3;stdptr+) printf(“%d %s %c %dn“,stdptr-num, stdptr-name, stdptr-sex, stdptr-age); ,10.5 结构体指针,10.5.3 指向结构体的指针作函数参数 有三种方法可以将一个结构体变量的值传

15、递给一个函数: 用结构体变量的成员。例如,用student1.num或student2作函数参数,将实参值传给形参。用法和普通变量作实参是一样的,属于“值传递”。应注意实参与形参的类型保持一致。 用结构体变量作实参。采取的也是“值传递”方式,将结构体变量所占的内存单元的内容全部顺序传递给形参,形参也必须是相同类型的结构体变量。 这种方式在空间和时间上开销大,又因为采用值传递,形参的值的改变不能返回到主调函数,因此一般较少使用。 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。采取的是“地址传递”方式,对应的形参是相同结构体类型的指针变量,借助于该指针变量可以访问并修改主调函数中结构体

16、变量的初值。,10.5 结构体指针,例10.5 #include struct student int num; char name20; double scores3; ; typedef struct student stud; void display(stud* stdptr); void main() stud std=10001,“Li Jun“,67.5,82.0,78.6; display( ,10.5 结构体指针,10.6 用指针处理链表,链表是一种常见的数据结构,在算法实现中常常用到。 构成链表的元素称为“结点”,图10-1中有4个结点。每个结点都应包括两个部分:用户需要使

17、用的数据和下一个结点的地址。指向链表第一个结点的指针称为头指针,整个链表的存取必须从头指针开始,图中以head表示,它存储了第一个结点的地址。可以看出,头指针指向第一个结点;第一个结点又指向第二个结点,直到最后一个结点,该结点不再指向其他结点,它称为“表尾”,它的地址部分为“NULL”,表示链表到此结束。,10.6 用指针处理链表,结点的数据类型如下: struct student int num; double score; struct student *next; ; 用该数据类型定义变量后,其成员next可以存储某个结点的地址。,10.6 用指针处理链表,10.6.2建立静态链表 【例

18、10-6】 建立一个如图10-2所示的简单链表,它由3个学生数据的结点组成。输出结点中的数据。 struct student int num; double score; struct student *next; ; typedef struct student stud;,10.6 用指针处理链表,void display(stud *head); int main() stud a, b, c,*head; head= ,10.6 用指针处理链表,void display(stud *head) stud *p = head; while (p != NULL) printf(“%d %

19、fn“, p-num, p-score); p = p-next; / 使p指向下一个结点 ,10.6 用指针处理链表,10.6.3 建立动态链表,【例10-7】编写程序建立一个有3名学生数据的单向动态链表。 struct student int num; double score; struct student *next; ; typedef struct student stud;,stud *create(); void display(stud *head); int main() stud *head; head = create(); display(head); return

20、0; ,10.6 用指针处理链表,stud *create() int n = 0; stud *head, *p1, *p2; p1 = (stud *)malloc(sizeof(stud); printf(“please input data: “); scanf(“%d,%lf“, ,10.6 用指针处理链表,while (p1-num != 0) +n; if (n = 1) / 第一次创建结点 head = p1; else p2-next = p1; p2 = p1; p1 = (stud *)malloc(sizeof(stud); printf(“please input d

21、ata: “); scanf(“%d,%lf“, ,10.6 用指针处理链表,链表的插入 / 在单链表中第i个位置之前插入结点, / 插入失败返回0,插入成功返回1。 int insert(stud * head, int i, double score) stud *p = head; stud *s; int j = 0;,10.6 用指针处理链表,while (p ,链表的删除,10.7.1 什么是共用体类型 有时需要使几种不同类型的变量存储到同一段内存单元中。例如可以把一个整型变量、一个字符型变量和一个浮点型变量放在同一个地址开始的内存单元中。以上三个变量在内存中所占的字节数不同,但都

22、从同一地址开始存储。这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。 声明共用体类型的一般形式为: union 共用体名 成员列表; ; 例如:union data int i; char ch; float f; ;,10.7 共用体类型,共用体变量的定义和结构体变量的定义相似,例如: union data int i; char ch; float f; ; union data ud; 当然也可以使用typedef语句: union data int i; char ch; float f; ; typedef union data udata; udata ud;,

23、10.7 共用体类型,10.7.2 共用体变量的引用方式 只能引用共用体变量中的成员,而不能引用共用体变量。例如,前面定义了共用体类型的变量ud,下面的引用方式是正确的: ud.i; ud.ch; printf(“%f”,ud.f);,10.7 共用体类型,10.7.3 共用体类型数据的特点 同一个内存段可以用来存储几种不同类型的成员,但在每一瞬时只能存储其中一种,而不是同时存储几种。 共用体变量中其作用的成员是最后一次存储的成员,再存入一个新的成员后原有的成员就失去作用。因此在使用共用体变量时应十分注意当前存储在共用体变量中的究竟是哪一个成员。 共用体变量的地址和它的各成员的起始地址都是同一

24、地址。例如 输出的值为5.,10.7 共用体类型,如果一个变量只有几种可能的取值,则可以定义为枚举类型。所谓“枚举”是指变量的值一一列举出来,变量的取值只限于列举出来的值的范围之内。 声明枚举类型以关键字enum开头。例如: enum weekday Monday,Tuesday,Wednesday,Thursday, Friday,Saturday,Sunday; 以上语句声明了一个枚举类型enum weekday。然后可以使用此类型来定义变量。例如: enum weekday workday,weekend; 变量workday和weekend被定义为枚举变量,它们的取值只能是Monday

25、到Sunday之一。例如: Weekend=Sunday; 枚举类型中的元素称为枚举元素或枚举常量,它们是用户自定义的标识符。,10.8 枚举类型,说明: C的编译器对枚举元素按常量处理,在定义时使他们的值从0开始递增。在上面的声明中,Monday的值为0,Tuesday的值为1,以此类推。例如: weekend=Sunday; printf(“%d”,weekend); 输出整数6。 也可以改变枚举元素的值,例如: enum weekday Monday=1,Tuesday,Wednesday,Thursday, Friday,Saturday,Sunday; 其中,Monday的值被定义为1,则Tuesday为2,以此类推。 枚举值可以用来做判断比较。例如: if(workday=Monday) if(workdaySaturday),10.8 枚举类型,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1