收藏 分销(赏)

第08章 结构、联合及枚举类型.ppt

上传人:pc****0 文档编号:14017922 上传时间:2026-05-28 格式:PPT 页数:65 大小:303.50KB 下载积分:10 金币
下载 相关 举报
第08章 结构、联合及枚举类型.ppt_第1页
第1页 / 共65页
第08章 结构、联合及枚举类型.ppt_第2页
第2页 / 共65页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第8章 结构、联合及枚举类型,*,重点与难点,8.1 结构体类型和结构变量的定义,8.2 结构体变量的引用和初始化,8.3 结构体数组,8.4 结构体类型的指针变量,8.5 结构体与函数,8.6 用,typedef,定义类型,8.7 用指针处理链表,8.8 共用体,8.9 枚举类型,*本章小结,*作业,重点与难点,重点:结构体、共用体和枚举类型。,难点:链表的操作。,二维表(关系),学号,姓名,性别,年龄,成绩,地址,10001,Zhang,Xin,M,19,90.5,Shanghai,10002,Wang Li,F,20,98,Beijing,10010,Li Fun,M,18,87.5,Guangzhou,8.1,结构体类型和结构体变量的定义,8.1.1 结构体类型的定义,8.1.2 结构体变量的定义,8.1.1 结构体类型的定义,struct,结构体名,数据类型 成员名1;,数据类型 成员名2;,数据类型 成员名,n;,;,点,坐标,y,x,.,(x,y),二维坐标的点,struct,point,float x;,float y;,;,点的结构体类型,圆的结构体,r,(x,y),struct,circle,struct,point,float x;,float y;,dot;,float r;,struct,point dot;,8.1.2 结构体变量的定义,1、先定义,结构体类型,,再定义,结构体变量,2、定义结构体类型的同时定义结构体变量,3、直接定义结构体类型变量,1、先定义结构体类型,再定义结构体变量,struct,circle,struct,point dot;,float r;,;,struct,circle graph1,graph2;,2、定义结构体类型的同时定义结构体变量,struct,student,int,num;,char name20;,char sex;,int,age,float score;,char,addr,30;,stu1,stu2;,3、直接定义结构体类型变量,struct,int,month;,int,day;,int,year;,date1,date2;,8.2 结构体变量引用和初始化,1、结构体变量的引用,2、结构体变量的初始化,1、结构体变量的引用,在,ANSI,中除了允许具有,相同类型的结构体变量相互赋值,外,一般对结构体变量的引用是通过其,成员,来实现。,成员引用形式:,结构体变量名.成员名,举例:,graph1.r,graph1.dot.x,例8.1 求两个同心圆的面积差,main(),struct,point float x;float y;,struct,circle ,struct,point dot;float r;,struct,circle graph1,graph2;float area;,graph1.dot.x=2;,graph1.dot.y=3;graph1.r=4;,graph2.dot=graph1.dot;,printf,(Graph2.r=);,scanf,(%f,area=3.14*(,graph2.r,*,graph2.r,-,graph1.r,*,graph1.r,);,printf,(Dot is(%-4.1f,%-4.1f)n,graph1.dot.x,graph1.dot.y,);,printf,(Radius is%-4.1f and%-4.1fn,graph1.r,graph2.r,);,printf,(Area(r2-r1)=%-6.1fn,area);,2、结构体变量的初始化,初始化形式,结构体类型 结构体变量=初始化数据;,举例,struct,circle graph1=2,3,4;,即,x=2,y=3,r=4;,其中内层可省。,8.3 结构体数组,struct,circle,cir3,;,struct,credit,int,num;,char*name;,char sex;,float score3,stu,5,;,结构体数组举例,struct,credit,int,num;,char*name;,char sex;,float score3;,stu,5,=,101,Zhao Hua,M,45,80,78,102,Xian Jiang,M,62.5,76,80,103,Sun Jun,F,92.5,92,89,104,Li,Wei,F,87,88,91,105,Zhou,Li,M,58,60,77,;,例8.2 计算学生的总分,按总分排名次及输出名次表,stu,i.total+=,stu,i.scorej;,排序:选择法,for(i=0;iN-1;i+),k=i;,for(j=i+1;j,stu,k.total)k=j;,if(k!=i),temp=,stu,i;,stu,i=,stu,k;,stu,k=temp;,8.4 结构体类型的指针变量,结构体变量可以由不同类型的成员构成,各个成员所占,空间字节数之和,是结构体变量所占的内存空间。,结构体的指针是结构体变量在内存中得,首地址,。,结构体类型的,指针变量,可以存放结构体的首地址。,成员引用方法,一般方法,graph1.dot.x,指针方法,已知,p=,(*p).r,(*p).dot.x,或,p-r,p-dot.x,其中:“,结构体指针变量名-成员名,”方法直观。,举例:成员的指针引用方式,struct,credit*p=,printf,(%-3d%-20s%-3c,(*p).num,(*p).name,(*p).sex);,printf,(%-3d%-20s%-3c,p-num,p-name,p-sex);,索引表结构,struct,index,int,num;,struct,credit*link;,index_id5,struct,credit,int,num;,char*name;,char sex;,float score3;,float total;,stu,5;,索引图示,101,102,103,104,105,103,Sun Jun,F,92.5,92.0,89.0,273.5,104,Li,Wei,F,87.0,88.0,91.0,266.0,102,Qian Jiang,M,62.5,76.0,80.0,218.5,101,Zhao Hua,M,45.0,80.0,78.0,203.0,105,Zhou,Li,M,58.0,60.0,77.0,195.0,8.5 结构体与函数,结构体成员可以,像简单变量一样,作为函数的参数。,结构体变量也可以作为函数的参数。它的传递方式是值传递。由于在值传递时,,实参拷贝到形参变量,,如果结构体变量的成员较多、数据量较大时,传递效率会很低。,一般采用结构体指针变量作为函数的参数。这样,在参数传递时仅需要,拷贝一个地址,而已。,例8.4 结构体与函数,void,caltotal,(,struct,credit,stu,int,n,),int,i,j;,for(i=0;in;i+),stu,i.total=0;,for(j=0;jnum,p-score);,p=p-next;,while(p!=NULL);,指向下一个结点,3、处理动态链表所需的函数,函数原型,功能,void*,malloc,(unsigned,int,size),在内存中分配长度为,size,的连续空间,void*,calloc,(unsigned n,unsigned,int,size),在内存中分配,n,个长度为,size,的连续空间,void*free(void*p),释放,p,所指的内存空间,4、建立动态链表,建立动态链表是指在程序执行过程中从无到有地建立起一个链表,,即,一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。,建立过程图示,head,99101,89.5,99103,90,99105,85,表尾,链表建立完毕,99107,88,创建链表函数,struct,student*,creat,(void),struct,student*head,*p1,*p2;,int,n=0;,head=NULL;p2=head;,while(1),p1=p2=(,struct,student*,),malloc,(,sizeof,(,struct,student),;,scanf,(%ld,%f,if(p1-num1=0)break;,n+;,if(n=1),head=p1,;else,p2-next=p1,;,p2=p1;,p2-next=NULL;,return(head);,head,指向表头,p2,指向表尾,p1,指向新结点,5、输出链表,输出链表:首先要得到链表第一个结点的地址,即,head,的值,然后设一个,指针变量,p,先,指向第一个结点,输出,p,所指的结点,然后使,p,后移一个结点,再输出,,直到链表的尾结点,。,编写一个输出链表的函数,void print(,struct,student*head),struct,student*p;,p=head,;,if(head!=NULL),do,printf,(n%ld%5.1f,p-num,p-score);,p=p-next;,while(,p!=NULL,);,else,printf,(,nlink,table is empty!);,输出链表图示,head,99101,89.5,99103,90,99105,85,99107,88,p,6、对链表的删除操作,从动态链表中删除结点是将某个结点的,前驱结点,和它的,后续结点,链结起来。并将该结点所占的内存释放。,删除结点图示,head,99101,89.5,99103,90,99105,85,99109,88,p1,99107,65,p2,p2,head,99101,89.5,99103,90,99105,85,99109,88,99107,65,p1,删除结点程序,while(num!=p1-num&p1-next!=NULL),p2=p1;p1=p1-next;,/*,查找将被删除的结点,*/,if(num=p1-num),if(p1=head),head=p1-next;,else,p2-next=p1-next;,7、对链表的插入操作,对链表的插入:是将一个结点插入到一个已有的链表中。,p2,head,99101,89.5,99103,90,99105,85,99109,88,99107,65,p1,p0,插入操作,if(head=NULL),head=p0;p0-next=NULL;,else,while(,p0-nump1-num,)&(,p1-next!=NULL,),p2=p1;,p1=p1-next;,if(,p0-numnum,),if(head=p1)head=p0;,else p2-next=p0;,p0-next=p1;,else p1-next=p0;p0-next=NULL;,链到表头,链到表尾,链到表中,8、对链表的综合操作,链表的综合操作包括链表的,建立,、,插入,结点、,删除,结点和,输出,链表的结点数据等操作。其中,建立链表的操作可以由插入操作完成,插入操作可以控制链表的建立是有序的。,8.8 共用体,1、共用体的概念,2、共用体变量的引用方式,3、共用体类型数据的特点,1、共用体的概念,共用体:实现,不同类型的变量,存放在,同一内存单元,中,使用,覆盖技术,,几个变量相互覆盖。,1000地址,整型变量,i,整型变量,i,字符变量,ch,实型变量,f,实型变量,f,实型变量,f,实型变量,f,共用体类型,定义一般形式,union,共用体名,成员表列,变量表列;,举例:,union data,int,i;,char,ch,;,float f;,a,b,c;,2、共用体变量的引用方式,引用方式:不能引用共用体变量,而只能共用变量中的,成员,。,举例:,union data,int,i;,char,ch,;,float f;,a,b,c;,成员引用:,a.i,a.,ch,a.f,共用体与结构体,比较项目,结构体,共用体,所占内存,各成员所占内存之和,由占内存最多成员决定,成员存在,各个成员都在内存中存在,只有最后使用的成员存在,成员地址,各个成员都有不同的地址,所有成员都是一样的地址,与共用体变量地址一样,例8.7 验证共用体变量的存储形式,main(),union,uarea,char c_data;,int,i_data;float f_data;,udata,;,printf,(&,udata,is%un,&,udata,);,udata,.c_data=A;,printf,(&,udata,.c_data is%u,value is%cn,&,udata,.c_data,udata,.c_data);,udata,.i_data=114;,printf,(&,udata,.i_data is%u,value is%in,&,udata,.i_data,udata,.i_data);,udata,.f_data=118.0;,printf,(&,udata,.f_data is%u,value is%en,&,udata,.f_data,udata,.f_data);,printf,(&,udata,.i_data is%u,value is%in,&,udata,.i_data,udata,.i_data);,3、共用体类型数据的特点,1、每一瞬时只有一个成员起作用,其他的成员不起作用,即,不是同时都存在和起作用,。,2、新存入的成员值,覆盖,原来成员的值,只有最近一次存放的成员起作用。,3、共用体变量的地址与各个成员,地址相同,。,4、由于只有一个成员起作用,故不能使用定义共用体变量时对它,初始化,。同样地,不能把共用体作为,函数参数,,也不能使函数,返回值,为共用体变量。,程序输出,程序运行情况:,&,udata,is 65498,&,udata,.c_data is 65498,value is A,&,udata,.i_data is 65498,value is 114,&,udata,.f_data is 65498,value is 1.18000e+02,&,udata,.i_data is 65498,value is 0,共用体应用举例,设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、职务。根据职业(教师或学生)的不同,职务成员存放的值可以为职称(教师)或班级(学生)。,从中可知,“职务”成员应该是,共用体,数据定义,struct,int,num;,char name10;,char sex;,char job;,union,int,class;,char position10;,category,;,person2;,共用体变量,8.9 枚举类型,枚举,:是指将变量的值一一列举出来,变量的值只限于列举出来值的范围内。,举例,enum,weekday,sun,mon,tue,wed,thu,fri,sat,;,其中:,sun,mon,.,是,枚举常量,enum,weekday,workday,week_end;,其中:,workday,.,是,枚举变量,枚举常量,不能对它赋值;,枚举常量按定义时的顺序确定它们的值为:0,1,2,.,可以改变枚举元素的值:,enum,weekday,sun7,mon,1,tue,wed,thu,fri,sat,;,应用举例,口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中取出3个球,问得到3中不同色的球可能取法,打印出每种组合的3种颜色。,分析:,可以使用简单类型,(1、2、.),,使用枚举类型更直观。,枚举变量,枚举变量的值虽然整型值,但与整型量不同,需要进行强制转换:,workday=(,enum,weekday)2;,例,8.8 输入06,输出对应的星期英文名称,main(),int,x;,enum,days sun,mon,tue,wed,thu,fri,sat day,;,printf,(Which day(06)is Today?);,scanf,(%d,if(x6)exit(1);,day=(,enum,days)x;,switch(day),case sun:,printf,(Today is,sunday,.n);break;,case,mon,:,printf,(Today is,monday,.n);break;,case,tue,:,printf,(Today is,tuesday,.n);break;,case wed:,printf,(Today is,wednesday,.n);break;,case,thu,:,printf,(Today is,thursday,.n);break;,case,fri,:,printf,(Today is,friday,.n);break;,case sat:,printf,(Today is,saturday,.n);break;,程序,enum,colorred,yellow,blue,white,black;,enum,color,i,j,k,pri,;,switch(,pri,),case,red,:,printf,(red);break;,case,yellow,:,printf,(yellow);break;,.,default:break;,课堂训练,2、有一链表,编程实现各个结点数据的累加。已知每个结点是如下结构体:,struct,node,float data;,struct,node*next;,本章小结(3点),结构体类型与结构体变量;,结构体变量的地址,成员的地址;,使用,typedef,定义类型名;,链表;,共用体;,枚举类型。,作业,p176 8.3,8.5,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服