C语言-第10章结构体与公用体.ppt

上传人:tia****nde 文档编号:12706159 上传时间:2020-05-14 格式:PPT 页数:53 大小:452KB
返回 下载 相关 举报
C语言-第10章结构体与公用体.ppt_第1页
第1页 / 共53页
C语言-第10章结构体与公用体.ppt_第2页
第2页 / 共53页
C语言-第10章结构体与公用体.ppt_第3页
第3页 / 共53页
点击查看更多>>
资源描述
第十章,结构体与共用体,本章要点,结构体的概念结构体的定义和引用结构体数组,10.1定义一个结构体的一般形式,定义一个结构体的一般形式为:struct结构体名成员表列;,对每个成员也必须作类型说明,其形式为:,类型说明符成员名;,例如:structstuintnum;/学号charname20;/姓名charsex;/性别floatscore;/成绩;,10.2结构体变量的说明,说明结构体变量有以下三种方法。,structstuintnum;charname20;charsex;floatscore;structstuboy1,boy2;,structstuintnum;charname20;charsex;floatscore;boy1,boy2;,structintnum;charname20;charsex;floatscore;boy1,boy2;,1.三种方法中说明的boy1,boy2变量都具有下图所示的结构。,2.成员也可以又是一个结构体类型,即构成了嵌套的结构体。,structdateintmonth;intday;intyear;structintnum;charname20;charsex;structdatebirthday;floatscore;boy1,boy2;,3.类型定义符typedef,语言允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。例如:typedefintINTEGER以后就可用INTEGER来代替int作整型变量的类型说明了。例如:INTEGERa,b;它等效于:inta,b;,typedef定义的一般形式为:,typedef原类型名新类型名,例如:typedefstructcharname20;intage;charsex;STU;定义STU表示stu的结构体类型,然后可用STU来说明结构体变量:STUbody1,body2;,又如:表示二维坐标平面上的一个点(x,y)typedefstructfloatx;floaty;POINT;接下来定义两个点p1,p2:POINTp1,p2;此语句即可实现。,10.3结构体成员变量的表示方法,表示结构体变量成员的一般形式是:结构体变量名.成员名,例如:boy1.num即第一个人的学号boy2.sex即第二个人的性别如果成员本身又是一个结构体则必须逐级找到最低级的成员才能使用。例如:boy1.birthday.month即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。,结构体成员运算符(优先级别最高),10.4结构体变量的赋值,结构体变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。结构体变量不能进行整体赋值。相同类型的结构体变量之间可以赋值。,如:typedefstructfloatx;floaty;POINT;POINTp1,p2;p1=3.5,6;/整体赋值发生错误。但可以给成员变量赋值。如:p1.x=3.5;等。也可以结构体变量之间赋值.如:p2=p1;,【例10.1】给结构体变量赋值并输出其值。#includevoidmain()structstuintnum;char*name;charsex;floatscore;boy1,boy2;boy1.num=102;boy1.name=Zhangping;printf(inputsexandscoren);scanf(%c%f,10.5结构体变量的初始化,【例10.2】对结构体变量初始化。各成员变量的存储如图所示。#includevoidmain()structstu/*定义结构体*/intnum;char*name;charsex;floatscore;boy2,boy1=102,Zhangping,M,78.5;/*boy1初始化*/boy2=boy1;/*结构体变量赋值*/printf(Number=%dnName=%sn,boy2.num,boy2.name);printf(Sex=%cnScore=%fn,boy2.sex,boy2.score);,10.6结构体数组,10.6.1结构体数组的定义1.先定义结构体,再说明结构体数组。,structstuintnum;char*name;charsex;floatscore;;structstuboy5;,2.在定义结构体类型的同时说明结构体数组。,structstuintnum;char*name;charsex;floatscore;boy5;,3.直接说明结构体数组。,structintnum;charname20;charsex;floatscore;stu15,stu210;,10.6.2结构体数组的初始化,以第一种为例,初始化的格式为:struct结构体类型名;struct结构体类型名结构体数组size=初值表1,初值表2,初值表n;,structstuintnum;char*name;charsex;floatscore;boy5=101,Liping,M,45,102,Zhangping,M,62.5,103,Hefang,F,92.5,104,Chengling,F,87,105,Wangming,M,58,;,10.6.3结构体数组元素的引用,结构体数组元素的引用格式为:结构体数组名下标.成员名;,10.6.4结构体数组的应用,【例10.3】计算学生的平均成绩和不及格的人数。学生信息如图10-4所示。,#includestructstuintnum;char*name;charsex;floatscore;boy5=101,Liping,M,45,102,Zhangping,M,62.5,103,Hefang,F,92.5,104,Chengling,F,87,105,Wangming,M,58,;voidmain()inti,c=0;floatave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score60)c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fncount=%dn,ave,c);,例10.4同学录,#include#defineNUM3structmemcharname10;charphone12;voidmain()structmemmanNUM;inti;for(i=0;inum应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。,指针引用结构体成员,【例10.5】结构体指针变量的使用。#includestdio.hstructstuintnum;char*name;charsex;floatscore;boy1=102,Zhangping,M,78.5,*pstu;voidmain()pstu=,从运行结果可以看出结构体变量.成员名(*结构体指针变量).成员名结构体指针变量-成员名三种表式等效,boy1.num,(*pstu).num,pstu-num,10.7.2指向结构体数组的指针,结构体指针变量也可指向结构体数组的一个元素,这时结构体指针变量的值是该结构体数组元素的首地址。这与普通数组的情况是一致的。,【例10.6】用指针变量输出结构体数组。,#includestdio.hstructstuintnum;char*name;charsex;floatscore;boy5=101,Zhouping,M,45,102,Zhangping,M,62.5,103,Lioufang,F,92.5,104,Chengling,F,87,105,Wangming,M,58,;voidmain()structstu*ps;printf(NotNametttSextScoretn);for(ps=boy;psnum,ps-name,ps-sex,ps-score);,10.7.3结构体变量和指针变量作函数参数,结构体变量作函数参数。但是发生函数调用时参数是“值传递”,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。最好的办法就是使用结构体指针这时由实参传向形参的只是地址,从而减少了时间和空间的开销。,【例10.7】计算一组学生的平均成绩和不及格人数。用结构体指针变量作函数参数编程。#includestdio.hstructstuintnum;char*name;charsex;floatscore;boy5=101,Liping,M,45,102,Zhangping,M,62.5,103,Hefang,F,92.5,104,Chengling,F,87,105,Wangming,M,58,;voidmain()structstu*ps;voidave(structstu*ps);ps=boy;ave(ps);,voidave(structstu*ps)intc=0,i;floatave,s=0;for(i=0;iscore;if(ps-scorenum=102;ps-name=Zhangping;ps-sex=M;ps-score=62.5;printf(Number=%dnName=%sn,ps-num,ps-name);printf(Sex=%cnScore=%fn,ps-sex,ps-score);free(ps);,10.10联合体(Union),联合体类型的定义格式为:,union联合体类型名数据类型名1成员名1;数据类型名2成员名2;数据类型名n成员名n;,例如,定义一个联合体类型:unionDatashorti;charch;floatf;,联合体Data包含有三个成员,它们使用同一起始地址的内存空间,联合体变量的内存大小是成员中占内存最大的成员的大小。因此,Data的大小也是4。,10.10.2联合体变量的定义和引用,1联合体变量的定义与结构体变量的定义一样,联合体变量的定义也有三种形式,见表10-2:,2联合体变量的引用对联合体成员的引用格式与对结构体成员的引用格式相同,如果通过联合体变量来引用成员,用“.”运算符,如果通过联合体指针变量来引用成员,用“-”运算符.例如:unionDatadata1,*p,d10;则其引用的方式可为data1.i,data1.f,p-ch,p-f,(*p).ch,(*p).f,d5.ch等。,unionDatashorti;charch;floatf;,10.10.3联合体变量的赋值,1联合体变量的初始化定义联合体变量时对变量赋初值,但只能对变量的第一个成员赋初值,不可像结构体变量那样对所有的成员赋初值。例如:unionDatadata1=10;/10赋给成员iunionDatadata1=A;/A赋给成员i,即i的值为65unionDatadata1=10,A,3.14;/错误,只能有一个赋值unionDatadata1=10;/错误,初值必须用括起来,unionDatashorti;charch;floatf;,2联合体变量在程序中赋值定义联合体变量后,如果要对其赋值,则只能通过对其成员赋值,不可整体赋值。例如:unionDatadata1,*p,d10;data1=10;/错误,不能整体赋值data1.i=10;/正确p=/正确,unionDatashorti;charch;floatf;,说明:,1.由于联合体变量的各成员共享同一块内存空间,因此每一瞬时只有一个成员作用,其他成员不起作用。规定起作用的成员是最后一次存放的成员。例:unionDatadata1;date1.i=10;data1.ch=a;data1.f=3.14;printf(“%d,%c,%f”),data1.i,data1.ch,data1.f);执行后输出为:-2621,?,3.140000最后起作用的是data1.f,再操作i和ch成员已无意义。但有时在数值兼容的情况下,对一个成员变量赋值,其他的成员变量发生相改变。,unionDatashorti;charch;floatf;,例如:UnionDatadata1;date1.i=10;data1.ch=A;printf(“%d,%c”),data1.i,data1.ch);执行后输出为:65,A结果是由最后输入的A决定的。,2.因为联合体变量每一瞬间只有一个成员变量有效,因此联合变量的地址和它的各成员的地址相同,即charch;floatf;,【例10.14】联合体变量成员间的相互影响。#includestdio.hvoidmain()unionshorta2;longk;charc4;r,*s=,10.11枚举类型,10.11.1类型的定义和枚举变量的说明1.枚举的定义枚举类型定义的一般形式为:,enum枚举名枚举值表;,在枚举值中应罗列出所有可用值。这些值也称为枚举元素。,2.枚举变量的说明同结构体一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday类型,可采用下述任一种方式:enumweekdaysun,mou,tue,wed,thu,fri,sat;enumweekdaya,b,c;或者为:enumweekdaysun,mou,tue,wed,thu,fri,sata,b,c;或者为:enumsun,mou,tue,wed,thu,fri,sata,b,c;,10.10.2枚举类型变量的赋值和使用,枚举类型在使用中有以下规定:1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值:sun=5;mon=2;sun=mon;都是错误的。2.枚举元素本身由系统定义了一个表示序号的数值,从0开顺序定义为0,1,2。如在weekday中,sun值为0,mon值为1,,sat值为6。,例10.14枚举类型变量的使用,#includestdio.hvoidmain()enumweedaysun,mon,tue,ved,thu,fri,sata,b,c;a=sun;b=mon;c=tue;printf(%dn%dn%dn,a,b,c);,说明:,只能把枚举类型赋予枚举变量,不能把枚举元素的数值直接赋予枚举变量。如:a=sum;b=mon;是正确的。a=0;b=1;是错误的。a=(enumweekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:a=tue;,还应该说明的是枚举元素不是字符变量也不是字符串常量,使用时不要加单、双引号,10.9链表的概念,简单链表的示意图,图中,第0个结点(head)称为头结点(表头),它存放有第一个结点的首地址,它没有数据,只是一个指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,另一个域为指针域,存放下一结点的首地址。,例如,一个存放学生学号和成绩的结点应定义为下面结构体:structstuintnum;intscore;structstu*next;,10.9.1创建动态链表,创建链表是指从无到有地建立起一个链表,即向空链表中依次插入若干节点,并保持节点之间的前驱和后继关系。基本思想:首先创建一个头结点,让头结点head和尾结点tail都指向该结点,并设置该结点的指针域为NULL。然后创建一个结点,用指针pNew指向它,并将实际数据放在该结点的数据域,其指针域为NULL;最后将该结点插入到tail所指向结点的后面,在数据结构中也叫尾插法。,程序如下:structstuintnum;intage;structstu*next;typedefstructstuSTUDENT;STUDENT*CreatLList(intn)/返回链表的头结点STUDENT*head,*tail,*pNew;inti;for(i=0;inum,10.9.2链表结点的查找与输出,查找操作是指,将要查找的某个成员变量值,与链表中的结点该成员分量的值进行比对,当相同时,即找到所要找的结点,然后进行输出。输出操作是指,将链表中满足条件的结点的数据域的值显示出来。基本思想:通过链表头指针head,使指针p指向实际数据链表的第一个结点,移动p找到要求查找的数据域,判断是否是要找的结点,如果是输出结点的数据,如此进行,有时会找到尾结点。,【例10.11】对链表进行查找并输出所有满足要求的结点数据,用函数Display实现。structstuintnum;intage;structstu*next;typedefstructstuSTUDENT;voidDisplay(STUDENT*head)STUDENT*p;intno;printf(InputNoYourwillfindn);scanf(%d,10.9.3链表的插入操作,基本思想:通过链表的头指针head,按照结点指针域的先后顺序,将要插入的结点的数据域依次与每个结点的数据域进行比较,当找到满足条件的结点i时,从第i+1个结点一直到尾结点依次向后移动,然后再将新结点N插入到i处,插入一个节点,使链表的长度加1。,插入结点分为3种情况:新插入点是第一个结点新插入点在链表的中间新插入点作为链表的尾结点,插入的结点作为第一个结点,插入中间结点,插入结点作为链表的尾结点,【例10.12】插入结点的源程序:structstuintnum;intage;structstu*next;typedefstructstuSTUDENT;voidDelete(STUDENT*head,STUDENT*p)STUDENT*p1,*p2;p1=head;p2=head;for(p1;p1!=NULL;p1=p1-next)if(p-numnum)/作为第一个结点插入head=p;p-next=p1;break;,elseif(p1-next!=NULL)/作为中间结点插入p2-next=p;p-next=p1;else/作为尾结点插入p1-next=p;break;p2=p1;,10.9.4删除结点操作,基本思想:通过单链表的头指针head,首先找到链表中指向第i个结点的前驱结点指针p和指向第i个结点的指针q;然后删除第i个结点。删除时只需执行p-next=q-next即可。记住释放结点i的内存单元。注意当i0时,表示头结点,是不可删除的。,【例10.13】删除结点的源程序#includemalloc.hstructstuintnum;intage;structstu*next;typedefstructstuSTUDENT;voidInsert(STUDENT*head,inti)STUDENT*p,*q;intj;if(i=0)/表示头结点,是不可删除的return;p=head;for(j=1;jnext!=NULL;j+)p=p-next;/找到要删除结点的前驱pif(p-next=NULL)/表示链表中的第i个结点不存在printf(the%dnodenotfound!n,i);return;q=p-next;/使q指向要删除的结点ip-next=q-next;/删除节点ifree(q);/释放结点i的内存单元,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!