资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C,程序设计第,9,章 自定义数据类型,主讲教师:鲁 萍,西安建筑科技大学 理学院,1,第,9,章 自定义数据类型,小 结,习 题,结构体变量,结构体数组,结构体与指针,指针与链表,共用体,枚举,2,结构体类型的定义,例,1,学生信息,:学号,姓名,成绩,成绩,成绩,平均成绩,要求计算平均成绩,并输出学生的学号,姓名和平均成绩,问题:学生信息包含不同类型的数据,例,2,对一个班的若干学生进行管理,实现插入新生信息和删除转学学生信息的功能。,问题:新数据无法和已有数据连续存储,结构体,链表,3,结构体类型的定义,例,1,学生信息,:学号,姓名,成绩,成绩,成绩,平均成绩,要求计算平均成绩,并输出学生的学号,姓名和平均成绩,struct student,int num;,char name20;,float score1;,float score2;,float score3;,float aver;,;,结构体类型:,不同类型的数据的有序集合,struct,类型名称,成员表列,;,结构体变量:,用结构体类型说明的变量,(定义结构体,类型,不分配内存单元!定义结构体,变量,时分配存储单元),/,定义个结构体变量,struct student,stu1,stu2,;,struct student,stu3;,/,定义,3,个元素的结构体数组,4,结构体变量的初始化,定义时初始化:将各元素初值放在“”里赋值给变量。,例:,struct,student,int,num;,char name20;,float score1;,float score2;,float score3;,float aver;,stu3=001,zhang3,80,88,75,002,li4,90,83,84,003,wang5,50,62,65;,可以这样定义结构体变量,5,001,“zhang3”,80,88,75,002,“,li4”,90,83,84,stu,1,结构体变量的定义,struct student,int num;,char name20;,float score1;,float score2;,float score3;,float aver;,stu1,stu2,;,存储:,(1),结构体的所有成员各自占用不同的内存单元,(2),一共,占用多少字节存储单元?,sizeof(struct student),stu3;,stu,2,stu0,stu1,stu2,int num,char name20,float score1,float score2,float score3,float aver,38,字节,38,字节,38,字节,int num,char name20,float score1,float score2,float score3,float aver,6,for(i=0;i3;i+),aver=score1+score2+score3;,aver/=3;,结构体 变量引用,例,11-1,要求,计算平均成绩,,并输出学生的学号,姓名和平均成绩,struct student,int num;,char name20;,float score1;,float score2;,float score3;,float aver;,stu3=001,zhang3,80,88,75,002,li4,90,83,84,003,wang5,50,62,65;,stui.stui.stui.stui.stui.,成员的引用方式:结构体变量名.成员名,001,“zhang3”,80,88,75,002,“,li4”,90,83,84,stu,0,stu,1,num,name20,score1,score2,score3,aver,num,name20,score1,score2,score3,aver,7,输出学生的所有信息,p,rintf(”%d,%s,%f,%f,%,f,%f,n”,stud1);,不能,对结构体变量,整体输入输出,,只能对,各个成员分别输入输出,p,rintf(”%d,%s,%f,%f,%,f,%f,n”,stud1.num,stu1.name,stu1.score1,stu1.score2,stu1.score3,stu1.aver);,(,),结构体变量引用,A0901,:学生信息:学号,姓名,成绩,成绩,成绩,平均成绩,要求计算平均成绩,并,输出学生的学号,姓名和平均成绩,for(i=0;i3;i+),printf(%5d%20s%8.2f,n,stui.num,stui.name,stui.aver);,8,结构体例题,A0901,:,#include,struct student,int num;char name20;,float score1;float score2;float score3;float aver;,;,void main(),struct student stu3=001,zhang3,80,88,75,002,li4,90,83,84,003,wang5,50,62,65;,int i;,for(i=0;i3;i+),stui.aver=stui.score1+stui.score2+stui.score3;,stui.aver/=3;,for(i=0;i,p-,p-,p-,p-,(*p).,(*p).,(*p).,1,、结构体类指针变量的定义:,结构体类型名称 *指针变量名,2,、通过指针变量引用成员:,1),结构体类指针变量名,-,成员名(常用),2)(*,结构体类指针变量名,).,成员名,10,指向结构体数组的指针,A0901,:,#include,struct student,int num;char name20;float score1;float score2;float score3;float aver;,;,stu3=001,zhang3,80,88,75,002,li4,90,83,84,003,wang5,50,62,65;,struct stud *p=stu;,for(p=stu;paver=p-score1+p-score2+p-score3;,p-aver/=3;,for(,p=stu,;pnum,p-name,p-aver);,84,83,90,“,li4”,002,75,88,80,“zhang3”,001,stu0,stu1,stu2,P,p+,指向数组中的下一个元素,11,用指针构成链表,81.3,75,88,80,“zhang3”,001,002,85.7,84,83,90,“,li4”,59,65,62,50,wang5,003,指针,指针,指针,1249 1356 1475,新 增加 一个学生?,数组不能动态定义!新增信息存储单元不连续,每个结构中的最后一个是指针,,指向下一个节点的首地址,形成链式结构,struct student,int num;,char name20;,float score1;,float score2;,float score3;,float aver;,;,struct student *next;,不行!,链表:可以使物理上不连续的存储单元在逻辑上连续访问,12,构建链表,A0902,例,建立如下链表,由,3,个学生数据的结点组成。输出各结点中的数据,并计算学生成绩的平均值。,next,001,89.5,002,90,004,85,next,next,struct student,int num;,float score;,struct student *next;,;,=NULL,next,head,标记链表的结束,链表的起始,13,构建链表,struct student,int num;float score;,struct student *next;,;,void main(),struct student a,b,c,*head,*p;,a.num=001;a.score=89.5;,b.num=002;b.score=90;,c.num=004;c.score=85;,head=,a.next=,b.next=,c.next=NULL;,p=head;,while,(,),printf(“%d%f n”,p-num,p-score);,p=p-next;,next,next,next,next,head,a b c,P,001,89.5,002,90,004,85,NULL,P,P,P,p!=NULL,14,链表操作:插入、删除,next,head,next,001,89.5,a,002,90,next,b,004,85,next,=NULL,c,next,003,78,1.malloc,函数,:,内存动态存储区中分配一个长度为,size,的连续空间,2.free,函数 释放空间,/,动态申请一个节点空间,struct student*d;,int len=sizeof(struct student);,d=(struct student*)malloc(len);,/,为节点赋值,scanf(%d,scanf(%f,/,将节点插入链表,d-next=b.next;,b.next=d;,/,链表删除元素,d,b.next=d-next,free(d);,/,释放空间,d,-,15,结构体数组练习,A0903,:,有,10,人投票,对,3,个候选人得票进行统计。每此输入一个候选人的名字,要求输出最后统计结果。,【,程序思路分析,】,将输入的后选人的名字与结构体中的初始名字比较,若两者相等,则将该后选人的票数加,1,;,投票人数通过循环方式进行控制;有多少人就循环多少次,但每次只能投一个人的票。,结构定义:,struct person,char name20;,int count;,pers3=Zhang,0,Wang,0,Li,0;,16,main(),struct person,char name20;,int count;,pers3=Zhang,0,Wang,0,Li,0;,int i=0,j=0;,char nam20;,for(;i10;i+)/*,控制投票人数*,/,scanf(“%s”,nam);/*,输入候选人姓名*,/,for(j=0;j3;j+)/*,控制候选人数*,/,if(strcmp(nam,persj.name)=0)persj.count+;,printf(n);,for(i=0;i3;i+),printf(%6s%d,persi.name,persi.count);,17,结构体变量嵌套,struct clock,int hour,minute,second;,struct date,int year,month,day;,struct clock time;,today,nextday;,1.单独引用结构体变量的成员,today.year=2004;,today.time.second=15;,2.结构体变量作为一个整体引用,nextday=today;,成员也可以是一个结构变量。,18,共用体,共用体类型定义,使几种不同类型的变量存放到同一内存单元中,相互覆盖。,union,类型名称,成员表列,;,变量定义:,方法同结构体,变量引用,共用体变量名,.,成员名称,整形,i,变量,i,字符变量,ch,实,f,型,f,变,f,量,f,地址,1000,1000,1000,union,data,int i;,char ch;,float f;,;,共用体变量所占内存长度,等于最长的成员的长度,a,b,c;,例:,a.i=1;,a.ch=A;,a.f=10.50;,完成上述赋值操作后,有效的成员是,a.f,19,枚举类型,一、,枚举类型的定义,格式,:,enum,枚举
展开阅读全文