第十讲-结构类型ppt课件_第1页
第十讲-结构类型ppt课件_第2页
第十讲-结构类型ppt课件_第3页
第十讲-结构类型ppt课件_第4页
第十讲-结构类型ppt课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十讲 结构类型,1 结构类型及其变量定义 结构类型是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型 结构类型定义,struct 结构名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或构造型 (数组、指针或其 他结构类型),struct是关键字, 不能省略,合法标识符 可省:无名结构类型,例 struct student long int order; char name20; char sex; short int age; int score10; char addr30; ;,结构类型定义描述结构 的组织形式,不分配内存,结构类型定义

2、的作用域,例 struct id_card char name30; char sex; char nationality20; struct date int year,month,day; birthday; char *p_addr; struct date signed_date; long number; char *office; ;,同一结构类型各成员不能同名,不同结构类型成员可以同名,结构类型可以嵌套定义,例 struct wrong char name30; int count; struct wrong a; ;,结构类型不能递归定义,例 struct student lo

3、ng int order; char name20; char sex; short int age; int score10; char addr30; ; struct student stu1,stu2;,结构变量的定义 先定义结构类型,再定义结构变量 一般形式:,struct 结构名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构名 变量名表列;,例 #define STUDENT struct student STUDENT long int order; char name20; char sex; short int age; int score10; c

4、har addr30; ; STUDENT stu1,stu2;,例 struct coord float x; float y; ;/*struct coord表示屏幕上一个点的坐标*/ struct coord first,second;,定义结构类型的同时定义结构变量 一般形式:,struct 结构名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student long int order; char name20; char sex; short int age; int score10; char addr30; stu1,stu2;,例 stru

5、ct coord float x; float y; first,second; /*struct coord表示屏幕上一个点的坐标*/,直接定义结构类型变量 一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct long int order; char name20; char sex; short int age; int score10; char addr30; stu1,stu2;,用无名结构类型直接定义 变量只能一次,例 struct float x; float y; first,second; /*struct coord表示

6、屏幕上一个点的坐标*/,说明 结构类型与结构类型变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构类型可嵌套 结构类型成员名与程序中变量名可相同,不会混淆 结构类型及变量的作用域与生存期,2 结构类型变量的引用 引用规则 结构类型变量不能整体引用,只能引用变量成员,可以将一个结构类型变量赋值给另一个结构类型变量 结构类型嵌套时逐级引用,成员(分量)运算符 优先级: 1 结合性:从左向右,引用方式: 结构类型变量名.成员名,例 1 计算某个同学5门课程成绩的平均分。 #include void main() struct student char *

7、name; /*姓名*/ long order; /*学号*/ int score5; /*成绩*/ float average; /*平均分*/ who; int sum=0,n; printf(“input name,order and 5 scoresn”); scanf(“%s%ld”,, ,char name20;,例 2 输入矩形左上角和右下角坐标,计算该矩形长和宽及面积。 #include #include void main() float length,width,area; struct coord float x,y; ; struct rectangle

8、 struct coord topleft,bottomrt;mybox; printf(“enter the top left x,y coordinate:n”); scanf(“%f%f”, ,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,3 结构变量的初始化 形式一:,struct 结构类型名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构类型

9、名 结构类型变量=初始数据;,例 struct student char name20; long order; int score5; float average; ; struct student who=“Wang Lin”,031112,92,91,89,87,94,0.0;,聚合成员初始化,例 struct coord float x,y; struct rectangle struct coord topleft; struct coord bottomrt; ; struct rectangle mybox=1.8,8.3,12.4,1.29;,例 struct student

10、int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,初值表中初值的个数=结构变量长远的个数,形式二:,struct 结构类型名 类型标识符 成员名; 类型标识符 成员名; . 结构类型变量=初始数据;,例 struct student char name20; long order; int score5; float average; who=“Wang Lin”,031112,92,91,89,87,94,0.0;,例 struct coord

11、 float x,y; struct rectangle struct coord topleft; struct coord bottomrt; mybox=1.8,8.3,12.4,1.29;,形式三:,struct 类型标识符 成员名; 类型标识符 成员名; . 结构类型变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,例 struct char name20; long order; int score

12、5; float average; who=“Wang Lin”,031112,92,91,89,87,94,0.0;,例 struct coord float x,y; struct struct coord topleft; struct coord bottomrt; mybox=1.8,8.3,12.4,1.29;,4 结构类型和指针 指向结构类型变量的指针 定义形式:struct 结构类型名 *结构类型指针名; 例 struct student *p;,使用结构类型指针变量引用成员形式,存放结构类型变量在内存的起始地址,指向运算符 优先级: 1 结合方向:从左向右,例 指向结构类型的

13、指针变量,例 int n; int *p= n=10,struct student stu1; struct student *p= (*p).num=101,main() struct student long int num; char name20; char sex; float score; stu_1,*p; p= ,struct student int num; char name20; char sex; int age; stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20; main() stru

14、ct student *p; for(p=stu;pnum,p-name,p-sex,p-age); ,指向结构数组的指针,例 指向结构类型数组的指针,例 6.2 分析下面程序的运行结果 #include void main(void) struct int x; int y; a2=1,2,3,4,*p=a; printf(“%d,”,+p-x); printf(%dn”,(+p)-x); ,指向结构数组的指针,1,2,3,4,2,2,3,5 结构数组 结构数组的定义 三种形式:,形式一: struct student int num; char name20; char sex; int

15、age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,结构数组初始化,例 struct int num; char name20; char sex; int age; stu =,;,顺序初始化: struct student int num; char name20; char sex; int age; ; struct student

16、stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int num; char name20; char sex; int age; stu =,;,结构数组引用,引用方式: 结构数组名下标.成员名,例 统计后选人选票,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%

17、s,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,例6.3 编程,输入10个学生的姓名和数学、英语和语文三门功课的成绩,计算每个学生的平均成绩,并输出学生姓名和平均成绩。,#include #define N 30 struct student char name20; /*学生姓名*/ float math; /*数学成绩*/ float eng; /*

18、英语成绩*/ float cuit; /*语文成绩*/ float aver; /*平均成绩*/ ;,void main( void) struct student sN; int i; for(i=0;iN;i+) printf(“请输入第%d学生的数据n”,i+1); printf(“姓名:”); gets(); printf(“数学、英语、语文成绩:”); scanf(“%f,%f,%f ”, ,例6.4 输入N个整数,记录输入的数和序号,按从小到大的顺序排列(如果两个整数相同,按输入的先后次序排列)。输出排序以后的每个整数和它原来的序号。,#include #define

19、 N 10 struct data int no; int num; ; void main(void ) struct data xN,temp; int i,j; /*输入10个整数*/ printf(“输入10个整数:”); for(i=0;iN;i+) scanf(“%d”, ,/*排序*/ for(i=0;iN-1;i+) for(j=0;jN-i-1;j+) if (xj.numxj+1.num) temp=xj+1; xj+1=xj; xj=temp; /*输出结果*/ printf(“值原来序号”); for(i=0;iN;i+) printf(“%5d %5dn”,xi.no

20、,xi.num); ,例 约瑟夫问题:n个小孩围成一圈,依次编号。老师指定从第w个小孩开始报数,报数为s的小孩出列;然后从下一个小孩开始重新报数,重复上述过程,直到所有小孩都出列。,分析:数据结构,如何表示队列和小孩? 每个小孩用一个结构类型表示: struct child int ino; /*当前小孩编号*/ int next; ; /*下一个小孩编号*/ n个小孩组成队列用结构数组表示: struct child linkN+1; /*下标为0的元素不使用*/ N为可以容纳的人数上限,分析:算法: (1)初始化队列link: linkk.nextk+1 k=1,n-1 linkn.nex

21、t1 (2)开始报数 if(linkk.ino!=0) 如果第k个小孩在队列中 I+1I 报数变量I 加1 (3)如果I =s,则第k个人出列,转(5),否则转(4) (4) k更新为下一个小孩编号 klinkk.next, 转(2) (5)输出第k个小孩编号linkk.ino (6)linkk.ino0表示已经出列 (7)已经出列人数加1count (8) 如果count等于总人数n,则转(9) ,否则转(2) (9)算法结束,#include #define N 100 /*程序能够处理的人数上限*/ void main() struct child int ino,next;linkN+

22、1; int I,n_child,which,com_out,k,count; /*输入已知数据:小孩实际人数、初始报数小孩编号、出列的编号*/ scanf(“%d%d%d”,/*出列人数*/,while(count!=n_child) I=0;/*报数的数值*/ while(1) if(linkk.ino!=0) I+; if(I=come_out) break; k=linkk.next; printf(“%dt”,linkk.ino);/*输出出队小孩编号*/ linkk.ino=0;/*第k个小孩出队*/ count+; /*出队人数加1*/ if(count%10=0) printf

23、(“n”); printf(“bye!n”); ,例6.5 编程实现两个复数的乘法运算。,分析: 一个复数由实部和虚部组成,可以用含有两个浮点数类型的成员的结构类型来表示: struct complex float re; /*实部*/ float im; /*虚部*/ ; struct complex x,y; x*y的结果的实部为x.re*y.re-x.im*y.im x*y的结果的虚部为x.re*y.im +x.im*y.re,#include struct complex float re; float im; ; void main( void) struct complex x,

24、y, z; printf(“请输入第1个复数n”); printf(“实部:”);scanf(“%f”, ,例6.6 编程计算当前时间的下一秒的时间。,分析: 时间由时、分、秒构成,采用一个结构类型来表示时间: struct time int hour; /*时*/ int minutes; /*分*/ int second; /*秒*/ ;,#include struct time int hour; int minutes; int second; void main(void ) struct time now,ntime; printf(“请输入当前时间,时间格式:时:分:秒n”);

25、scanf(“%d:%d:%d”, ,引用自身的结构,例如, struct tnode char word20; int count; struct tnode*left; struct tnode*right; ;,结构成员:指向自身所属的结构类型的对象,常用于构造各种数据结构:队列、链表、树、图等。,6 链表,什么是链表? 链接方式存储的线性表简称为链表(Linked List),是常见的数据结构。 链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储

26、每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 链表的结点结构datanext data域-存放结点值的数据域next域-存放结点的直接后继的地址(位置)的指针域(链域) 例如: struct node int data; struct node *next;,链表,链表分类:单链表:每个结点只有一个链域的链表。,链表分类:循环链表,head:链表的头指针,链表,链表分类:双向链表:每个结点有两个链域的链表。,NULL,链表,静态链表 例: #include #include struct node int data; struct

27、 node *next; ; void main() struct node a,b,c,*head;*p; a.data=1; b.data=2; c.data=3; head= ,1,2,3,链表中结点都在程序中定义,不是临时开辟的,用完后不能释放,并且,链表中可以创建的结点数有限制。称为“静态链表”,链表,对链表的操作 建立链表、遍历链表、删除链表中的结点、插入结点 以单链表为例进行说明。,建立链表(尾插法建表) 结点类型: struct child char name20; struct child *next; new,head,tail;,(1)头指针置空head=NULL; (2)创建新结点new=(struct child*)malloc(siz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论