结构体与共用体PPT课件

上传人:pu****.1 文档编号:587938243 上传时间:2024-09-06 格式:PPT 页数:63 大小:392KB
返回 下载 相关 举报
结构体与共用体PPT课件_第1页
第1页 / 共63页
结构体与共用体PPT课件_第2页
第2页 / 共63页
结构体与共用体PPT课件_第3页
第3页 / 共63页
结构体与共用体PPT课件_第4页
第4页 / 共63页
结构体与共用体PPT课件_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《结构体与共用体PPT课件》由会员分享,可在线阅读,更多相关《结构体与共用体PPT课件(63页珍藏版)》请在金锄头文库上搜索。

1、第第8章章 结构体与共用体结构体与共用体 主要内容主要内容n结构体结构体n链表链表 n共用体共用体 n枚举类型枚举类型 n自定义类型自定义类型 2024/9/61本章要点本章要点n结构体数组结构体数组n结构体指针结构体指针n用指针处理链表用指针处理链表n共用体和枚举类型共用体和枚举类型n用户自定义类型的定义方法用户自定义类型的定义方法2024/9/628.1 结构体n8.1.1 结构体类型与结构体变量 如果程序中用到图8.1所表示的数据结构,可以在程序中自己建立一个结构体类型。例如: struct Student int num; char name20; char sex; int age;

2、 float score; char addr30; ; 2024/9/638.1 结构体n8.1.1 结构体类型与结构体变量定义一个结构体类型的一般形式为:struct 结构体名 成员表列;有两点读者需要理解:(1)可定义多种结构体类型,例如除了建立上面的struct Student结构体类型外,还可以根据需要建立名为struct Teacher,struct Worker等结构体类型,各自包含不同的成员。2024/9/64(2)成员可以为某一个结构体类型。例如:struct Date /声明一个结构体类型struct Date int month; /月 int day; /日 int y

3、ear; /年 ; struct Student int num; char name20; char sex; float score; char addr30; struct Date birthday; 8.1 结构体2024/9/658.1 结构体n8.1.1 结构体类型与结构体变量2. 定义结构体变量说明结构变量有以下三种方法。(1)先定义结构体类型,再说明结构变量。struct Student long num; char name30; char sex; int age; float score;char addr20; ;struct Student student1,stu

4、dent2;2024/9/668.1 结构体n8.1.1 结构体类型与结构体变量(2)在定义结构类型的同时说明结构体变量。struct Studentlong num;char name30;char sex;int age;float score;char addr20; student1,student2;2024/9/678.1 结构体n8.1.1 结构体类型与结构体变量(3)直接定义结构体类型变量。struct long num;char name20;char sex;int age;float score;char addr;student1,student2;2024/9/688

5、.1 结构体n8.1.1 结构体类型与结构体变量3. 结构体变量的初始化和引用例例8.1 把一个学生的信息(学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。算法描述:算法描述:首先声明一个结构体类型,然后定义一个结构体变量,最后通过printf函数输出到屏幕上。2024/9/698.1 结构体# include int main () struct Student int num; char name20; char sex; char addr20; a=10001,“Li Ming”,M,”Bei Jing”; /定义结构体变量a并初始化 printf (Number

6、:%dnName:%sn sex:%cn address:%sn, a.num, a.name,a.sex,a.addr); return 0;2024/9/6108.1 结构体程程序序分分析析:程序中声明了一个名为Student的结构体类型,有4个成员。在声明类型的同时定义了结构体变量a并进行初始化。提供了a各成员的值,num,name数组,sex及addr数组的值为10001,“Li Ming”,M,”Bei Jing”。最后用printf函数输出变量中各成员的值。注意 :(1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量。如:struct Student

7、a=10001,Li Ming,M,Bei Jing; (2)可以引用结构体变量中成员的值,引用方式为结构体变量.成员名(3)如果成员本身又属于一个结构体类型,则要输出若干个成员运算符,一级一级的找到最低的一级的成员。 student1. birthday. month 2024/9/6118.1 结构体(4)结构体变量成员间可以像普通变量一样进行各种运算。(5)同类结构体变量可以互相赋值,如: student1=student2;(6)可以引用结构体变量成员的地址和结构体变量的地址。例如: scanf (“%d”,&student1.num); printf (“%o”, &student1

8、); 例例8.2 输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩。算法描述:算法描述:(1)定义两个结构相同的结构体变量(2)输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩2024/9/6128.1 结构体# include int main () struct Student int num; char name20; float score; student1,student2; scanf (%d%s%f,&student1.num,student1.name, &student1.score); scanf (“%d%s%f”,&student2.num,

9、student2.name, &student2.score); 2024/9/613printf (The higher score is:n); if (student1.scorestudent2.score) printf (%d %s %6.2fn,student1.num,student1.name, student1.score); else if (student1.scorestudent2.score) printf (%d %s %6.2fn,student2.num,student2.name, student2.score); else printf (%d %s %

10、6.2fn,student1.num,student1.name, student1.score);printf (%d %s %6.2fn,student2.num, student2.name, student2.score); return 0;8.1 结构体2024/9/6148.1 结构体 程序分析:程序分析: 根据student1.score和student2.score的比较结果,输出不同学生的信息,由于student1.score是属于student1变量的一部分,因此若确定了student1.score是成绩较高者,则输出student1的全部信息是很方便的,反之亦然。但是如

11、果用普通变量则难以实现这一目的。2024/9/6158.1 结构体8.1.2 结构体数组定义结构体数组的方法和结构体变量相似:(1) struct 结构体名 成员表列 数组名数组长度;(2) 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名数组长度; 例例8.3 编写程序,利用结构体数组存储和显示三个学生的信息。 算法描述:算法描述:首先定义并初始化一个结构体数组,然后通过printf函数输出到屏幕上即可。2024/9/6168.1 结构体# include struct student int num;char name10;float score; stu3=1,

12、Zhao, 90, 2, Qian, 89.5, 3, Sun, 85;int main () int i;printf (NumtNametScoren); /打印表头打印表头for(i=0; i3; i+) /输出三个学生的基本情况输出三个学生的基本情况printf (%dt,stui.num);printf (%st,stui.name);printf (%5.1fn,stui.score);return 0;2024/9/6178.1 结构体程序分析:程序分析:程序中定义了一个外部结构体数组stu,共3个元素,并作了初始化赋值。在main函数中用for语句逐个输出各元素的各个成员值。

13、2024/9/6188.1 结构体 8.1.3 结构体指针 指向结构体变量的指针指向结构体变量的指针 例例8.4 使用指向结构体变量的指针来访问结构体变量的各个成员。 算法描述:算法描述:首先定义并初始化一个结构体变量和指针变量,该指针变量指向结构体变量,然后通过printf函数输出到屏幕上即可。2024/9/6198.1 结构体# include struct student int num;char name10;float score; int main ()struct student s=1, Wang, 89.5, *p=&s; printf (Num:%dn, p-num);pr

14、intf (Name:%sn, p-name);printf (Score:%5.1fn, p-score);return 0; 2024/9/6208.1 结构体 程序分析:程序分析: 程序中定义了一个外部结构体类型struct student,在主函数中定义了一个struct student变量s,并作了初始化赋值。又定义了一个指针变量p,它指向一个struct student类型的对象。将结构体变量s的起始地址赋值给指针变量s,最后逐个输出各个成员的值。 2024/9/6218.1 结构体 8.1.3 结构体指针 例例8.5 利用指针指向结构体数组,显示三个学生的信息。 算法描述:算法描

15、述:首先定义并初始化一个结构体数组和指针变量,该指针变量指向结构体数组首地址,然后通过printf函数输出到屏幕上即可。 2024/9/6228.1 结构体# include struct student int num; char name10; float score; ; int main ()struct student stu3=1, Wang, 90.0, 2, Qian, 89.5, 3, Sun, 85.0; struct student *p; int i;p=stu; printf (NumtNametScoren);for(i=0; inum);printf (%st,

16、p-name);printf (%5.1fn, p-score);return 0;2024/9/6238.1 结构体 程序分析:程序分析: 在上面的例子中,指针变量p的起始值是stu0的地址,即p指向stu0。在第一次进入循环后,通过p输出stu0各成员的值;执行p+后,p中的地址变为stu1的地址,即此时,p指向stu1,再次进入循环。这样,就可以输出每个数组元素各成员的值了。2024/9/6248.1 结构体 8.1.3 结构体指针 指向结构体数据的指针作函数参数指向结构体数据的指针作函数参数 函数间传递结构体类型的数据,有两种方法:(1) 直接传结构体变量。(2) 传结构体变量的地址。

17、 例例8.6 利用指向结构体数据的指针作函数参数存储和显示三个学生的信息。 算法描述:算法描述:首先定义一个被调函数output,形参为结构体变量指针。然后在main函数中定义并初始化一个结构体数组,在main函数中调用output函数输出到屏幕上即可。 2024/9/6258.1 结构体# include struct studentint num;char name10;float score; void output (struct student *p)printf (%dt%st%5.1fn, p-num, p-name, p-score);int main ()struct stu

18、dent stu3=1,Zhao,90.0,2,Qian,89.5,3,Sun,85.0;int i;printf (NotNametScoren);for(i=0; i3; i+)output (&stui);return 0;2024/9/6268.1 结构体 程序分析:程序分析: 在程序中声明了结构体struct student类型,在主函数中定义了结构体struct student类型的数组stu。在调用output函数时,用结构体数组stu中各元素的地址作为实参,用指向struct student类型数据的指针变量p作为形参。 2024/9/6278.2 链表8.2.1 链表的结构

19、链表有一个“头”(head),指向链表的第一个结点,一个“尾”,中间有若干元素,每个元素称为一个结点(node)。每个结点包括两部分:一部分是结点数据本身,称为数据域;另一部分是一个指针,指向下一个结点的地址,称为指针域。具体结构如图8.4所示。2024/9/6288.2 链表 8.2.2 链表的定义 对图8.5所示链表,需要定义如下结构体类型: struct student long num;char name20;float score;struct student *next; ;2024/9/6298.2 链表8.2.3 动态链表1.处理动态链表的函数(1)malloc函数函数原型:v

20、oid *malloc(unsigned size)p=(char *)malloc(8);(2)calloc函数函数原型:void *calloc(unsigned n,unsigned size) p=(char *)calloc(2,20);(3)free函数函数原型:void free(void *ptr) free(p);2024/9/6308.2 链表2链表的操作(1)动态链表的建立创建一个新结点,并令指针head、p1与p2都指向该结点 ;再创建一个新结点,令指针p1指向该结点;然后,令前一个结点指针域的指针指向该结点;最后,令指针p2后移一个位置,以指向新创建结点;创建第三个结

21、点,令指针p1指向该结点;然后,令前一个结点指针域的指针指向该结点,令指针p2后移一个位置,以指向新建立结点. 2024/9/6318.2 链表(2)动态链表的输出 先让指针变量p指向第一个结点,输出该结点的值;然后后移一个结点,再输出;如此重复,直到到达表尾结点,如图8.9所示。2024/9/6328.2 链表 例例8.7 编写函数建立动态链表,结点个数作函数形参,返回链表头指针。然后编写函数输出动态链表。 算法描述:算法描述:本例的实现可分为两个部分,第一部分是链表的建立部分,其中结点个数作为函数的形参,并返回链表头指针。第二部分是链表的输出部分。可分别定义不同的函数实现。 2024/9/

22、6338.2 链表# include # include struct student /定义链表的结点类型定义链表的结点类型long num;float score;struct student *next;void print (struct student *head) /输出动态链表的函数输出动态链表的函数struct student *p=head;while (p!=NULL) printf (学号学号:%d 成绩成绩:%3fn,p-num, p-score);p=p-next; /指针指针p后移一个结点后移一个结点 2024/9/6348.2 链表struct student *

23、create (int n) struct student *head=NULL,*p1,*p2;int i;for (i=1;inum,&p1-score);p1-next=NULL;if (i=1)head=p1; elsep2-next=p1; p2=p1; return (head);2024/9/6358.2 链表int main ()struct student *head;int n;printf (请输入学生个数请输入学生个数:n);scanf (%d,&n);printf (请按学号输入各学生的信息请按学号输入各学生的信息:n);head=create (n);printf

24、(原链表为原链表为:n);print (head); return 0; 2024/9/6368.2 链表程序分析:程序分析:在程序中首先定义了结构体struct student类型作为链表基本类型;接着建立了具有n个结点的动态链表的函数create,并将结点个数作为函数的形参,并返回链表头指针;然后编写了print函数输出动态链表。最后通过主函数调用create及print函数显示动态链表的建立及输出过程。 2024/9/6378.2 链表(3)动态链表结点的删除)动态链表结点的删除(4)动态链表结点的插入)动态链表结点的插入 2024/9/6388.2 链表8.2.1 链表的结构 例例8.

25、8 设链表中各结点按学号由小到大排列,编写函数,删除指定学号的学生结点,以头指针和学号作参数。然后编写函数插入一个新结点,使链表仍按原顺序排列。 算法描述:算法描述:本例对链表的操作涉及的内容包括:1.动态链表的创建;2.动态链表的输出;3.动态链表中结点的删除;4. 动态链表中结点的插入。其中1和2部分可参考例8.7实现,需要定义链表的基本类型,并定义链表的建立及输出函数。3和4部分操作涉及的是链表中结点的删除及插入操作,可分别编写函数实现。2024/9/639struct student *del (struct student *head,int num)struct student *

26、p1,*p2;if(head=NULL) /若链表为空若链表为空printf (原表为空!原表为空!n);return (NULL);elsep1=head;while (p1-num!=num&p1-next!=NULL) p2=p1;p1=p1-next;if (p1-num=num) if (p1=head) head=p1-next;else p2-next=p1-next; printf (学号为学号为%d的学生已被删除的学生已被删除n,num);elseprintf (学号为学号为%d的学生不存在的学生不存在n,num);return (head);2024/9/6408.2 链表

27、struct student *insert (struct student *head, struct student *stud)struct student *p0,*p1,*p2;p1=head;p0=stud;if (head=NULL) /若原链表为空,则将新结点作为头结点处理若原链表为空,则将新结点作为头结点处理head=p0;p0-next=NULL; 2024/9/641elseWhile (p0-nump1-num) & (p1-next!=NULL)p2=p1;p1=p1-next; if (p0-numnum)if (head=p1) head=p0; else p2-

28、next=p0; p0-next=p1;else /新结点插到表尾新结点插到表尾p1-next=p0; p0-next=NULL; return (head);2024/9/6428.2 链表int main ()struct student *head,*stud;int n,k;printf (请输入学生人数请输入学生人数:n);scanf (%d,&n);printf (请按学号输入学生信息请按学号输入学生信息:n);head=create (n);printf (原链表为原链表为:n);print (head); 2024/9/6438.2 链表 printf (请输入要删除的学生学号

29、请输入要删除的学生学号:n);scanf (%d,&k);head=del (head,k);printf (删除后链表变为删除后链表变为:n);print (head);stud=(struct student*) malloc (sizeof (struct student);printf (请输入欲插入的学生学号及成绩请输入欲插入的学生学号及成绩n);scanf (%d%f,&stud-num,&stud-score);head=insert (head,stud);printf (插入后链表变为插入后链表变为:n);print (head); return 0; 2024/9/6448

30、.2 链表 程序分析:程序分析: 在程序中首先声明了结构体struct student类型作为链表基本类型;接着定义了创建n个结点链表的函数create和输出链表的函数print。然后定义了链表中结点删除及插入的函数del和insert,其中del的形参为指向链表的头指针和需要删除的学生学号信息,insert函数的形参为指向链表的头指针和需要插入的结点信息。最后通过主函数调用上述函数显示链表的建立、输出、插入及删除结果。2024/9/6458.3 共用体8.2.1 链表的结构共用体类型的定义的一般形式为: union 共用体名 成员列表;例: union untp int i; char ch

31、; float f; ;2024/9/6468.3 共用体共用体类型变量的定义也可以用以下三种方法来定义:(1) 先定义类型、再定义变量,例如: union untp int i; char ch; float f; ; /定义共用体类型 union untp un1,un2; /定义变量2024/9/6478.3 共用体(2)定义类型的同时定义变量,例如:union untpint i;char ch;float f; un1,un2; (3)直接定义变量,例如:union int i;char ch;float f; un1,un2; 2024/9/6488.3 共用体n8.3.1 共用体

32、的特点(1)在某一时刻,存放的和起作用的是最后一次存入的成员。例如,)在某一时刻,存放的和起作用的是最后一次存入的成员。例如,执行执行un1.i=1;un1.ch=c; un1.f=3.14; 后,后,un1.f才是有效的成员。才是有效的成员。(2)由于所有成员共享同一内存空间,故共用体类型变量与其各成员)由于所有成员共享同一内存空间,故共用体类型变量与其各成员的地址相同。例如,的地址相同。例如,&un1&un1.i&un1.ch&un1.f。(3)不能对共用体类型变量进行初始化,也不能将共用体类型变量作)不能对共用体类型变量进行初始化,也不能将共用体类型变量作为函数参数,以及使函数返回一个共

33、用体类型数据,但可以使用指向共为函数参数,以及使函数返回一个共用体类型数据,但可以使用指向共用体类型的指针变量。用体类型的指针变量。(4)共用体类型可以出现在结构体类型定义中,反之亦然。)共用体类型可以出现在结构体类型定义中,反之亦然。(5)不能对共用体变量名赋值,也不能通过引用变量名来得到一个值。)不能对共用体变量名赋值,也不能通过引用变量名来得到一个值。 2024/9/6498.3 共用体8.3.2 共用体变量的应用 例例8.9 有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来处理,如图8

34、.12所示。 算法描述:算法描述:如果job项为s,则第项为classes。即Li是501班的。如果job项是t,则第项为position。Wang是prof(教授)。对第5项可以用共用体来处理。2024/9/6508.3 共用体#include struct long num; char name20; char sex; char job; union int classes; char position10; category;person2;int main() int n,i;2024/9/651for(i=0;i2;i+) scanf(%d %s %c %c,&personi.nu

35、m,personi.name, &personi.sex, &personi.job); if(personi.job=s) scanf(“%dn ,&personi.category.classes); /若是学生若是学生 else if(personi.job=t) scanf(%sn,personi.category.position); /若是教师若是教师 else printf(Input error!n); printf(No. Name Sex Job classes/positionn); for(i=0;itue) 2024/9/6558.4 枚举类型例例8.10 枚举类型举

36、例枚举类型举例# include int main () enum body J,F,M,A; /声明枚举类型body enum body month31,j; /定义枚举变量 int i; j=J; for(i=1;iA) j=J; /若jA,j又重新赋值J 2024/9/6568.4 枚举类型for(i=1;i成员名成员名2024/9/662本章小结n3.共用体变量的定义与引用类似于结构体变量的定义与引共用体变量的定义与引用类似于结构体变量的定义与引用。枚举类型指明这种类型的变量取值只能是指定的若干用。枚举类型指明这种类型的变量取值只能是指定的若干个枚举常量之一。每个枚举常量代表一个具体的值。个枚举常量之一。每个枚举常量代表一个具体的值。n4.用用 typedef 可定义新的类型名来表示已有的类型名。其可定义新的类型名来表示已有的类型名。其方法如下:方法如下: 1. 先按定义变量的方法写出定义体;先按定义变量的方法写出定义体; 2. 将变量名换成新类型名;将变量名换成新类型名; 3. 在最前面加上在最前面加上 typedef; 4. 用新类型名去定义变量。用新类型名去定义变量。2024/9/663

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号