《C语言程序设计》第8章结构体、共用体与枚举类型.ppt

上传人:max****ui 文档编号:11498711 上传时间:2020-04-26 格式:PPT 页数:45 大小:531KB
返回 下载 相关 举报
《C语言程序设计》第8章结构体、共用体与枚举类型.ppt_第1页
第1页 / 共45页
《C语言程序设计》第8章结构体、共用体与枚举类型.ppt_第2页
第2页 / 共45页
《C语言程序设计》第8章结构体、共用体与枚举类型.ppt_第3页
第3页 / 共45页
点击查看更多>>
资源描述
第8章结构体、共用体与枚举类型,本章要求:理解结构体类型的概念,掌握结构体变量的定义和使用掌握结构体数组、结构体指针的定义和使用理解共用体的概念,掌握共用体变量的定义和使用了解枚举数据类型及自定义数据类型的使用理解链表的概念,初步掌握动态链表的常见操作本章重点:结构体变量的定义和使用链表的概念本章难点:动态链表的常见操作,8.1结构体类型与结构体变量,8.1.1结构体概述数组是一种简单构造类型数据,数组中的各元素是属于同一个类型的。但在实际问题中,常会遇到这样一类数据,它由多个类型不相同的数据项组成。学生基本情况:学号、姓名、性别、年龄、成绩结构体(structure)是一种数据类型。C语言本身没有提供具体的结构体类型,但提供了说明结构体类型的方法。,8.1.2结构体的声明,声明结构体类型的一般形式:struct结构体名类型标识符成员名;类型标识符成员名;.;,成员类型可以是基本型或构造型,struct关键字,不能省略,合法标识符可省:无名结构体,structstudentintnum;charname20;charsex;intage;,8.1.3结构体变量的定义,定义好一个结构体类型后,我们可以将其看作是和int、char、float等数据类型一样的一个新的数据类型。1.先定义结构体类型,再定义结构体变量,struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名变量名表列;,structstudentintnum;charname20;charsex;intage;structstudenta,b;,intx;,a,structstudentt;,可多次使用structstudent来定义变量,2.定义结构体类型的同时定义结构体变量,struct结构体名类型标识符成员名;类型标识符成员名;.变量名表列;,structstudentintnum;charname20;charsex;intage;a,b;,3.直接定义结构体变量,structstudentt;,用无名结构体直接定义变量只能一次,8.1.4结构体变量的引用格式,引用规则:结构体变量不能整体引用,只能引用变量成员引用方式:结构体变量名.成员名,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;,printf(“%d,%s,%c,%d,%f,%sn”,stu1);stu1=101,“WanLin”,M,19,87.5,“DaLian”;,结构体嵌套,structdateintmonth;intday;intyear;,structpersoncharname20;charsex;structdatebirthday;,若有定义:structpersonperson1;,合法:person1.sex=F;person1.birthday.day=35;,同类型结构体变量间的整体赋值,及变量的初始化,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,stu1=101,“WanLin”,M,19,87.5,“DaLian”;,stu1=stu2;,初始化:structstudentstua=101,“WanLin”,M,19,87.5,“DaLian”;,=111,“Tom”,M,19,60,“USA”;,8.1.6指向结构体的指针,指向结构体变量的指针的值是该结构体变量所分配的存储区域的首地址。结构指针变量的定义,structstudentintnum;charname20;charsex;intage;stu;structstudent*p=,stu,通过指针访问结构体变量的成员,结构变量名.成员名(名字引用);结构指针-成员名(指针引用);(*结构指针).成员名(将指针转化为名字引用);,structstudentintnum;charname20;charsex;intage;stu;structstudent*p=,stu.age=8;p-age=8;(*p).age=8;,stu,8.2结构体数组,8.2.1结构体数组的定义(三种形式),structstudentintnum;charname20;charsex;intage;structstudentstu2;,stu2;,8.2.2结构体数组的初始化,例如:structstudentintnum;charname20;charsex;intage;structstudentstu=100,“HeLin”,M,20,101,“LiGang”,M,19,110,“LiuYan”,F,19;,引用方式:结构体数组名下标.成员名,stu0.age=8;printf(“%s”,stu1.name);,8.2.3指向结构体数组的指针,structstudentintnum;charname20;charsex;intage;structstudentstu9;structstudent*p=stu;,改写数组输出例子,8.3结构体与函数,已知:structstudentstu1,stu10,*p=stu;用结构体变量的成员作参数-值传递函数声明:voidfunc(intx);函数调用:func(stu1.age);用指向结构体指针变量或数组的指针作参数-地址传递或st函数声明:voidfunc(structstudent*st);函数调用:func(stu);或func(p);用结构体变量作参数-多值传递(效率低)函数声明:voidfunc(structstudentz);函数调用:func(stu1);,编写:已知5个学生的信息表,包括学号、姓名、性别、年龄。编写函数find1,找制定学号的学生姓名。在主函数中输入学生学号,调用find1函数查找学生信息。编写函数find2,找制定姓名的学生信息。在主函数中输入学生姓名,调用find2函数查找学生信息。,用一个结构体的指针作为find2函数的返回值,8.4共用体,共用体(也叫联合体)是构造数据类型,使几个不同类型的变量共占一段内存(相互覆盖)1.声明结构体类型的一般形式:union共用体名类型标识符成员名;类型标识符成员名;.;,uniondatainti;charch;floatf;,uniondatainti;charch;floatf;uniondataa;,a,1B,2B,4B,i,ch,f,共用体变量任何时刻-只有一个成员存在共用体变量定义分配内存,长度=最长成员所占字节数共用体变量的定义形式有三种(类似结构体变量的定义),2.共用体变量引用(类似结构体变量),uniondatainti;charch;floatf;a,b,d5,*p=d;,a.ia.cha.fp-ip-chp-f(*p).i(*p).ch(*p).fd0.id0.chd0.f,结构体与共用体,区别:存储方式不同联系:两者可相互嵌套,变量的各成员同时存在,任一时刻只有一个成员存在,例,8.5枚举类型,枚举类型就是将变量可能出现的值放在一起而形成的一个整型常量的集合类型。限制在此集合内,变量只能取这个集合中的某个值。1枚举类型的定义:enum枚举类型名取值表;例enumweekdaysSun,Mon,Tue,Wed,Thu,Fri,Sat;2枚举变量的定义与结构变量类似(1)间接定义例如,enumweekdaysworkday;(2)直接定义例如,enumSun,Mon,Tue,Wed,Thu,Fri,Satworkday;,3说明,(1)枚举型仅适应于取值有限的数据。(2)取值表中的值称为枚举元素,枚举元素是常量。在编译器中,按定义的顺序取值0、1、2、.。所以枚举元素可以进行比较,比较规则是:序号大者为大。例如,上例中的Sun=0、Mon=1、Sat=6,所以MonSun、Sat最大。(3)枚举元素的值也是可以人为改变的:定义时由程序指定。例如,如果enumweekdaysSun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;则Sun=,Mon=,从Tue=2开始,依次增。,例,8.6typedef的使用,功能:用自定义名字为已有数据类型命名简单形式:typedeftypenewname;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例typedefintINTEGER;typedeffloatREAL;,typedef没有创造新数据类型。typedef是编译时处理为已有类型命名,#define是预编译时处理时简单字符置换。,typedef定义类型步骤:,按定义变量方法先写出定义体,如inti;将变量名换成新类型名,如intINTEGER;他最前面加typedef,如typedefintINTEGER;用新类型名定义变量,如INTEGERi,j;,例:,inta100;intARRAY100;,typedefintARRAY100;,ARRAYa,8.7动态数据结构链表,8.7.1链表的提出数组:在内存中占用连续存储的空间。插入,删除操作需要移动多个元素。链表是动态的进行存储分配,链表的各个结点在逻辑上是连续的,但是在内存中存储时不占用连续的空间。链表的使用能有效的避免存储空间的浪费和数据移动的问题。,8.7.2链表的基本结构,链表是一种常用的、能够实现动态存储分配的数据结构。头指针变量head指向链表的首结点。每个结点一般由2个域组成:数据域存储结点本身的信息。指针域指向后继结点的指针。尾结点的指针域置为“NULL(空)”,作为链表结束标志,8.7.3链表结点的定义,structstudentintnum;floatscore;structstudent*next;,一个结点,单向链表,8.7.4单向链表的访问,1.输出链表各个结点的数据,voidprint_link(structstudent*head)structstudent*p;p=head;while(p!=NULL)printf(“%d,%6.1fn”,p-num,p-score);p=p-next;,2.统计链表的长度,voidlen_link(structstudent*head)intn=0;structstudent*p=head;while(p!=NULL)n+;p=p-next;return(n);,8.7.5动态存储空间的建立和释放,1动态存储空间的建立malloc函数,其函数原型为:void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的连续空间。sizeof(type)运算符计算所给数据类型type的字节数,主要用来计算链表中结点所占动态存储空间的字节数。,p=(structstudent*)malloc(sizeof(structstudent);,calloc函数,其函数原型为:void*calloc(unsignedn,unsignedsize);其作用是在内存的动态区存储中分配n个长度为size的连续空间。2.动态存储空间的释放free函数,其函数原型为:voidfree(void*p);其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。p是调用calloc或malloc函数时返回的值。,p=(structstudent*)malloc(sizeof(structstudent);,free(p);,8.7.6动态链表的建立,建立链表主要步骤:先设三个指针变量:head、p1、p2,它们都是用来指向structstudent类型数据的。structstudent*head=NULL,*p1,*p2;head:头指针变量,指向链表第一个结点,作函数返回值。p1:指向新申请的结点。p2:指向链表的尾结点,在将新结点连接到链表末尾时需要。,结点,2.malloc函数开辟第一个结点,并使head和p2都指向它。head=p2=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,3.再用malloc函数开辟另一个结点并使p1指向它,接着输入该结点的数据,并与上一结点相连,且使p2指向新建立的结点。建立新结点:p1=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,p1,使新结点与上一结点连接:p2-next=p1;使p2指向新链结点:p2=p1;,p2,p2,重复第3步的,建立更多结点:p1=(structstudent*)malloc(sizeof(structstudent);scanf(%d%f,head,1002,87,p1,p2,p1,p1,p2,p2,4.给末结点的指针域赋值NULLp2-next=NULL;,NULL,structstudent*create(intn)inti;structstudent*head=NULL,*p1,*p2;head=p2=(structstudent*)malloc(LEN);scanf(%d%f,#defineLENsizeof(structstudent),1.,2.,3.,4.,8.7.7链表的删除操作,删除首结点使p1指向第一个结点,用以下语句实现删除首结点操作。p1=head;head=p1-next;free(p1);,p1,删除其它结点删除链表的中间结点通过将下一结点地址赋给前一结点地址来实现,即将要删除的p1结点的后继地址,放入前一结点p2的地址域,同时释放p1结点。p2-next=p1-next;free(p1);,head,8.7.8链表的插入操作,先设四个指针变量:head:要插入链表的头指针。p0:指向要插入的结点。p1:指向当前结点。p2:指向前一结点。,四种情况:,原链表为空表,即head=NULL时,用以下语句实现插入操作:head=p0;p0-next=NULL;,NULL,head,NULL,无p1、p2,在头结点之前插入,若p1=head,表示插入结点在头结点之前。用以下语句实现插入操作:head=p0;p0-next=p1,head,p0,p1,无p2,在中间插入,表示在在非头结点之前,非尾节点之后插入结点,用以下语句实现插入操作:p2-next=p0;p0-next=p1;,head,p0,尾节点之后插入,用以下语句实现插入操作:p2-next=p0;p0-next=NULL;,head,p0,p1为NULL可理解为无p1,NULL,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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