您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 《C语言程序设计》第8章 结构体、共用体与枚举类型
第8章结构体、共用体与枚举类型本章要求:•理解结构体类型的概念,掌握结构体变量的定义和使用•掌握结构体数组、结构体指针的定义和使用•理解共用体的概念,掌握共用体变量的定义和使用•了解枚举数据类型及自定义数据类型的使用•理解链表的概念,初步掌握动态链表的常见操作本章重点:•结构体变量的定义和使用•链表的概念本章难点:•动态链表的常见操作8.1结构体类型与结构体变量8.1.1结构体概述•数组是一种简单构造类型数据,数组中的各元素是属于同一个类型的。•但在实际问题中,常会遇到这样一类数据,它由多个类型不相同的数据项组成。学生基本情况:学号、姓名、性别、年龄、成绩…•结构体(structure)是一种数据类型。C语言本身没有提供具体的结构体类型,但提供了说明结构体类型的方法。8.1.2结构体的声明声明结构体类型的一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};成员类型可以是基本型或构造型struct关键字,不能省略合法标识符可省:无名结构体structstudent{intnum;charname[20];charsex;intage;};8.1.3结构体变量的定义定义好一个结构体类型后,我们可以将其看作是和int、char、float等数据类型一样的一个新的数据类型。1.先定义结构体类型,再定义结构体变量struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;structstudent{intnum;charname[20];charsex;intage;};structstudenta,b;numnamesexage…2字节20字节1字节2字节intx;xastructstudentt;可多次使用structstudent来定义变量2.定义结构体类型的同时定义结构体变量struct结构体名{类型标识符成员名;类型标识符成员名;…………….}变量名表列;structstudent{intnum;charname[20];charsex;intage;}a,b;3.直接定义结构体变量structstudentt;用无名结构体直接定义变量只能一次8.1.4结构体变量的引用格式引用规则:结构体变量不能整体引用,只能引用变量成员引用方式:结构体变量名.成员名structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;成员(分量)运算符优先级:1结合性:从左向右stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};结构体嵌套structdate{intmonth;intday;intyear;};structperson{charname[20];charsex;structdatebirthday;};若有定义:structpersonperson1;namesexbirthdaymonthdayyear合法:person1.sex=‘F’;person1.birthday.day=35;同类型结构体变量间的整体赋值,及变量的初始化structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}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指向结构体的指针指向结构体变量的指针的值是该结构体变量所分配的存储区域的首地址。1.结构指针变量的定义structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;numnamesexage…stup2.通过指针访问结构体变量的成员①结构变量名.成员名(名字引用);②结构指针-成员名(指针引用);③(*结构指针).成员名(将指针转化为名字引用);structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;①stu.age=8;②p-age=8;③(*p).age=8;stup8.2结构体数组8.2.1结构体数组的定义(三种形式)structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];numnamesexagenumnamesexagestu[0]stu[1]25B}stu[2];8.2.2结构体数组的初始化例如:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“HeLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};引用方式:结构体数组名[下标].成员名stu[0].age=8;printf(“%s”,stu[1].name);8.2.3指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;};structstudentstu[9];structstudent*p=stu;numnamesexagenumnamesexage…pp+1改写数组输出例子8.3结构体与函数已知:structstudentstu1,stu[10],*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共用体名{类型标识符成员名;类型标识符成员名;…………….};uniondata{inti;charch;floatf;};uniondata{inti;charch;floatf;};uniondataa;a1B2B4Bichf共用体变量任何时刻-只有一个成员存在共用体变量定义分配内存,长度=最长成员所占字节数共用体变量的定义形式有三种(类似结构体变量的定义)2.共用体变量引用(类似结构体变量)uniondata{inti;charch;floatf;}a,b,d[5],*p=d;a.ia.cha.fp-ip-chp-f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f结构体与共用体区别:存储方式不同联系:两者可相互嵌套变量的各成员同时存在任一时刻只有一个成员存在例8.5枚举类型枚举类型就是将变量可能出现的值放在一起而形成的一个整型常量的集合类型。限制在此集合内,变量只能取这个集合中的某个值。1.枚举类型的定义:enum枚举类型名{取值表};例enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};2.枚举变量的定义──与结构变量类似(1)间接定义例如,enumweekdaysworkday;(2)直接定义例如,enum{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday;weekdays3.说明(1)枚举型仅适应于取值有限的数据。(2)取值表中的值称为枚举元素,枚举元素是常量。在C编译器中,按定义的顺序取值0、1、2、...。所以枚举元素可以进行比较,比较规则是:序号大者为大。例如,上例中的Sun=0、Mon=1、……、Sat=6,所以MonSun、Sat最大。(3)枚举元素的值也是可以人为改变的:定义时由程序指定。例如,如果enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};则Sun=7,Mon=1,从Tue=2开始,依次增1。例8.6typedef的使用•功能:用自定义名字为已有数据类型命名•简单形式:typedeftypenewname;类型定义语句关键字已有数据类型名用户定义的类型名例typedefintINTEGER;typedeffloatREAL;INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;•typedef没有创造新数据类型。•typedef是编译时处理为已有类型命名,#define是预编译时处理时简单字符置换。typedef定义类型步骤:①按定义变量方法先写出定义体,如inti;②将变量名换成新类型名,如intINTEGER;③他最前面加typedef,如typedefintINTEGER;④用新类型名定义变量,如INTEGERi,j;INTEGERi,j;inti,j;例:ARRAYa;inta[100];①inta[100];②intARRAY[100];③typedefintARRAY[100];④ARRAYa8.7动态数据结构——链表8.7.1链表的提出•数组:–在内存中占用连续存储的空间。–插入,删除操作需要移动多个元素。•链表–是动态的进行存储分配,链表的各个结点在逻辑上是连续的,但是在内存中存储时不占用连续的空间。–链表的使用能有效的避免存储空间的浪费和数据移动的问题。8.7.2链表的基本结构链表是一种常用的、能够实现动态存储分配的数据结构。1.头指针变量head──指向链表的首结点。2.每个结点一般由2个域组成:①数据域──存储结点本身的信息。②指针域──指向后继结点的指针。3.尾结点的指针域置为“NULL(空)”,作为链表结束标志1356A1475BNULLC1249head1249135614758.7.3链表结点的定义structstudent{intnum;floatscore;structstudent*next;};numscorenext100185100287100395NULLhead一个结点单向链表8.7.4单向链表的访问1.输出链表各个结点的数据voidprint_link(structstudent*head){structstudent*p;p=head;while(p!=NULL){printf(“%d,%6.1f\n”,p-num,p-score);p=p-next;}}100185100287100395NULLheadpppNULLp2.统计链表的长度voidlen_link(structstudent*head){intn=0;structstudent*p=head;while(p!=NULL){n++;p=p-next;}return(n);}100185100287100395NULLheadpppNU
本文标题:《C语言程序设计》第8章 结构体、共用体与枚举类型
链接地址:https://www.777doc.com/doc-3804387 .html