c10结构体、共用体及枚举类型.ppt_第1页
c10结构体、共用体及枚举类型.ppt_第2页
c10结构体、共用体及枚举类型.ppt_第3页
c10结构体、共用体及枚举类型.ppt_第4页
c10结构体、共用体及枚举类型.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计,第10章结构体、共同体与枚举类型,问题:实际应用中,通常会将相关的不同类型的数据项组成一个有机的整体,这些数据项在计算机中如何表示?,学生登录信息学生成绩表,这些数据的特点是:1、有多项不同类型数据组成2、各项数据占用空间大小有可能不同C语言为了表示这种数据,定义了一种数据结构:结构体。,引子,第10章结构体、共同体与枚举类型,本章难点,结构体类型及变量结构体数组的使用指针和结构体共用体、枚举、用户自定义类型,结构体指针变量的引用链表的建立、插入、删除、输出等操作共用体类型的数据特点,本章要点,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,本章主要内容,结构体类型定义结构体是一种构造数据类型一个“结构体”类型由若干“成员”组成,每一个成员可以是一个基本数据类型或者是一个结构体类型。结构体类型定义,struct结构体名类型标识符成员名;类型标识符成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,10.1结构体变量的定义,定义义结构体类型时,应注意成员类型可以是除本身结构体类型之外的任何已有类型,也可以是任何已有类型(包括本身类型在内)的指针类型,即构成嵌套的结构。当一个结构体类型定义在函数之外时,它具有全局作用域;若定义在任一对花括号之内,则具有局部作用域,其作用范围是所在花括号构成的块。结构体是一种复杂的数据类型,是数目固定、类型不同的若干成员的集合,结构体类型的定义只是列出了该结构的组成情况,编译系统并未因此而分配存储空间,当定义了结构体类型的变量或数组后,编译系统才会分配存储空间。成员名可以与程序中的变量名相同,二者不代表同一个对象。如果两个结构体的成员类型、名称、个数相同,但结构体名不同,也是两个不同的结构类型。,例如,可将日期定义为一个结构体:structdateintmonth;intday;intyear;,结构体变量的定义先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量例如在定义结构体类型的同时定义结构体变量例如直接定义结构体变量例如,structstuintnum;charname20;charsex;intage;floatscore;structdatebirthday;structstuboy1,boy2;,structstuintnum;charname20;charsex;intage;floatscore;structdatebirthday;boy1,boy2;,structintnum;charname20;charsex;intage;floatscore;structdatebirthday;boy1,boy2;,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体变量的引用引用方式:结构体变量名.成员名其中点号“.”称为成员运算符,它在所有的运算符中优先级最高。引用结构体变量时,应注意以下几点不能将一个结构体变量作为一个整体进行输入输出如果成员本身又是一个结构体类型,则要用若干个成员运算符逐级找到最低一级的成员才能引用对成员变量可以像普通变量一样进行各种运算可以引用结构体变量成员的地址,也可以引用结构体变量的地址,10.2结构体变量的引用和初始化,例如,对前面定义的结构变量boy1和boy2,其成员的引用形式如下。boy1.num/*第一个人的学号*/boy2.sex/*第二个人的性别*/,结构体变量的初始化本例中,对结构体变量boy1作了初始化赋值,然后把boy1的值整体赋予boy2,最后用printf函数输出boy2各成员的值。,例对结构变量初始化。#includemain()structstuintnum;charname20;charsex;intage;floatscore;boy2,boy1=102,Zhangping,M,20,78.5;boy2=boy1;printf(Number:%dnName:%sn,boy2.num,);printf(Sex:%cnage:%dScore:%4.1fn,boy2.sex,boy2.age,boy2.score);,运行结果:Number:102Name:ZhangpingSex:MAge:20Score:78.5,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体数组的定义结构体数组的每一个元素都具有相同的结构体类型三种形式:,形式一:structstudentintnum;charname20;charsex;intage;structstudentstu2;,形式二:structstudentintnum;charname20;charsex;intage;stu2;,形式三:structintnum;charname20;charsex;intage;stu2;,10.3结构体数组,结构体数组初始化一个结构体数组的元素相当于一个结构体变量,引用结构体数组元素的一般形式为结构体数组名下标.成员名例如,#includestructstuintnum;charname20;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;main()inti,c=0;floatave,s=0;for(i=0;i”的优先级比较高,高于算术运算符、关系运算符、逻辑运算符例如+pstu-num等价于+(pstu-num)结构体指针访问结构体变量的形式也可以表示为(*结构体指针变量).成员名例如(*pstu).num应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”,10.4结构体指针变量,存放结构体变量在内存的起始地址,以下三种形式是等价结构体变量名.成员名(*结构体指针变量).成员名结构体指针变量-成员名,结构指针变量的引用#includestructstuintnum;charname20;charsex;floatscore;boy=102,Zhangping,M,78.5,*pstu;main()pstu=,运行结果:Number=102Name=ZhangpingSex=MScore=78.500000Number=102Name=ZhangpingSex=MScore=78.500000Number=102Name=ZhangpingSex=MScore=78.500000,指向结构体数组的指针普通数组可以通过指针变量来访问,同样,也可以通过结构体指针访问结构体数组。例如pstu=boy;或pstu=pstu就指向了该结构体数组的首地址(即第一个元素boy0的地址)。结构体指针pstu加1则指向下一个元素,用指针变量输出结构体数组。#includestructstuintnum;charname20;charsex;floatscore;boy5=101,Zhouping,M,45,102,Zhangping,M,62.5,103,Liufang,F,92.5,104,Chengling,F,87,105,Wangming,M,58;main()structstu*ps;printf(NotNametttSextScoretn);for(ps=boy;psnum,ps-name,ps-sex,ps-score);,运行结果:NoNameSexScore101ZhoupingM45.0102ZhangpingM62.5103LiufangF92.5104ChenglingF87.0105WangmingM58.0,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体变量作为函数参数结构体变量的成员可作为函数的实参,用法和普通变量作实参一样例如,10.5结构体与函数,显示学生的基本信息,利用结构体变量作为函数参数编程。#include#includestructstuintnum;charname20;charsex;floatscore;main()voidlist(structstustudent);structstustudent;student.num=101;strcpy(,Zhouping);student.sex=M;student.score=45;list(student);voidlist(structstustudent)printf(Number=%dtName=%sn,student.num,);printf(Sex=%cttScore=%fn,student.sex,student.score);,运行结果:Number=101Name=ZhoupingSex=MScore=45.000000,返回结构体类型数据的函数函数的返回值可以是整型、实型或指针类型等例如,显示学生的基本信息,利用结构体变量作为函数参数编程。输入数据部分用函数实现#includestructstuintnum;charname20;charsex;floatscore;student;main()voidlist(structstustudent);structstunewstudent();student=newstudent();list(student);voidlist(structstustudent)printf(Number=%dtName=%sn,student.num,);printf(Sex=%cttScore=%fn,student.sex,student.score);structstunewstudent()structstunewstu;scanf(%d,运行结果:101LipingM76Number=101Name=LipingSex=MScore=76.000000,结构体指针作为函数参数结构体指针作为函数的参数时,传递的只是地址,从而减少结构变量作参数时引起的空间和时间上的开销例如,显示学生的基本信息,利用结构体指针变量作为函数参数编程。#includestructstuintnum;charname20;charsex;floatscore;main()voidlist(structstu*student);structstustudent;student.num=101;strcpy(,Zhouping);student.sex=M;student.score=45;list(,运行结果:Number=101Name=ZhoupingSex=MScore=45.000000,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,位段结构体类型和位段结构体变量C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”定义例如位段结构体变量的定义与结构体变量定义方式相同位域的引用一般形式为:位段结构体变量.位域名例如,10.6位段结构体,struct位段结构体名类型标识符位域1:位域长度;类型标识符位域2:位域长度;.类型标识符位域n:位域长度;,structbsinta:8;intb:2;intc:6;data;,位域的引用#includemain()structbsunsigneda:1;unsignedb:3;unsignedc:4;bit,*pbit;bit.a=1;bit.b=7;bit.c=15;printf(%d,%d,%dn,bit.a,bit.b,bit.c);pbit=,运行结果:1,7,150,3,15,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,链表概述概述,是一种数据结构,可以动态分配内存,链表由结点组成,每个结点有数据域和指针域两个域。“头指针”指向第一个元素结点,指针域指向下一结点。结构定义,如形式如右图所示例如,10.7链表,structstuintnum;charname20;structstu*next;,structstuintnum;charname20;structstu*next;,动态内存管理内存空间分配函数malloc原型void*malloc(unsignedintsize)例float*pc;pc=(float*)malloc(5*sizeof(float);内存空间函数calloc原型void*calloc(unsignedn,unsignedsize);例pc=(float*)calloc(8,sizeof(float);释放内存空间函数free原型voidfree(void*p);例如,动态数组的建立和使用。#include#includemain()float*pf;inti,n;scanf(%d,/*调用free函数时,会自动将指针pf的类型转换为void指针类型*/,运行结果:51.1000002.2000003.3000004.4000005.500000,创建链表读取数据;生成新结点;将数据存入新结点;将新结点插入到链表中。例如:从键盘读入学生的信息,包括学号、成绩,当输入的学号为0时,表示建立链表结束。流程图如图,#include#include#defineLENsizeof(structstu)/*LEN为结构体类型structstu的长度*/structstuintnum;floatscore;structstu*next;structstu*creat()structstu*head;/*用于指向链表的第一个结点,即头指针*/structstu*p;/*用于指向新生成的结点*/structstu*tail;/*用于指向链表的最后一个结点*/intx;tail=head=NULL;scanf(%d,顺序访问链表中的结点所谓“访问”就是对各结点的数据域中的值进行修改、运算、输出等例如:编写函数,顺序输出链表中各结点数据域中的内容。顺序输出链表的算法比较简单,只需利用一个工作指针(p)从头到尾依次指向链表中的每个结点,当指针指向某个结点时,就输出该节点数据域中的内容,直到遇到链表结束标志为止。如果链表为空,就输出提示信息。,voidlist(structstu*head)structstu*p;p=head;if(head!=NULL)printf(Thelistrecordsare:n);doprintf(%dt%5.1fn,p-num,p-score);p=p-next;/*p指针后移*/while(p!=NULL);elseprintf(Thelistisnull);main()structstu*head;head=creat();list(head);,运行结果:10190102890Thelistrecordsare:10190.010289.0,在链表中插入结点指将一个结点插入到一个已有链表中,因此,创建链表的过程,也可以理解为将一个个结点插入到空链表中。算法过程输入数据生成新结点将数据存入新结点在链表中寻找第一个大于新结点学号的结点如果链表为空,直接插入新结点,即新结点为链表的唯一的结点查找成功,该结点为链表的第一个结点,将链表的头指针指向新结点,新结点的next域指向原来链表的第一个结点,即插到表头之前查找成功,该结点不是链表的第一个结点,将新结点插入到该结点之前,即插到表的中间查找不成功,插入到链表末尾的后面例如:编写函数,将一个结点插入到一个已有学生链表中,设已有链表按学号由小到大顺序排列。程序运行过程,structstu*insert(structstu*head,structstu*stud)structstu*p0;/*p0指向要插入的新结点*/structstu*p1;/*p1指向链表中第一个学号大于新结点的学号的结点*/structstu*p2;/*p2指向p1的前驱结点,即p2的next域指向p1*/p0=stud;p1=head;if(head=NULL)/*情况,原来的链表为空表*/head=p0;p0-next=NULL;elsewhile(p1!=NULL),运行结果:102951009410193103990Thelistrecordsare:10094.010193.010295.010399.0,在链表中删除结点过程从p1指向的第一个结点开始,检查其数据是否等于给定的关键字(如学号),如果相等就将该结点删除,否则p1后移一个结点,再如此进行下去,直到遇到表尾为止。如果删除的是第一个结点(由p1指向),例如,删除学号为100的学生结点,头指针指向第二个结点,操作为:head=p1-next,如图10-6所示如果要删除的不是第一个结点,例如,删除学号为102的学生结点,即让学号为101的学生结点(由p2指向)的next指针域指向学号为103的学生结点,操作为:p2-next=p1-next,如图10-7所示例如:编写链表删除函数,根据输入的学号删除学生结点。,structstu*del(structstu*head,intnum)structstu*p1;/*p1指向要删除的结点*/structstu*p2;/*p2指向要删除的结点的前驱结点*/if(head=NULL)/*空链表*/printf(ThelistisNULLn);elsep1=head;while(p1!=NULL/*输出链表*/,运行结果:02951009410193103990Thelistrecordsare:10094.010193.010295.010399.0pleaseinputthenumberfordeletion:102delete:102Thelistrecordsare:10094.010193.010399.0,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,共用体类型及其变量的定义共用体变量中的所有成员占用同一段内存空间,共用体又称为“联合体”共用体类型定义例如,union共用体名类型标识符成员名;类型标识符成员名;.;,例uniondatainti;charch;floatf;,类型定义不分配内存,10.8共同体,先定义共用体类型后定义共用体变量uniondatainti;chars6;floatf;uniondataa,b,c;,同时定义共用体类型和变量uniondatainti;chars6;floatf;a,b,c;,直接定义共用体变量unioninti;chars6;floatf;a,b,c;,共用体变量的定义有三种方式,共用体变量的引用引用共用体变量成员方式有如下三种例如例如,共用体变量名.成员名=共用体指针变量名-成员名=(*共用体指针变量名).成员名,程序示例#include#includemain()unionchara4;structbtcharc1;charc2;charc3;charc4;chs;d;strcpy(d.a,deab);printf(%c,%cn,d.chs.c2,d.chs.c3);,共用体变量的地址和它的各个成员的地址相同d的成员a和chs的首地址相同,即a0、a1、a2和a3的地址依次与c1、c2、c3和c4相同运行结果:e,a,程序示例main()unionchara;intb;longc;uu;uu.c=0 x12345678;printf(n1:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c);uu.a=0 x61;printf(n2:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c);uu.b=0 x1234;printf(n3:a=%x,b=%x,c=%lx,uu.a,uu.b,uu.c);,1:a=78,b=12345678,c=123456782:a=61,b=12345661,c=123456613:a=34,b=1234,c=1234,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,枚举类型及变量枚举类型是一个采用标识符表示的整型常数的集合,其定义类似于结构体类型。定义一般形式为enum枚举名枚举常量1,枚举常量2,枚举常量n;其中,enum为关键字,表示枚举;枚举名是用户定义的标识符;枚举常量是用户定义的有意义的标识符。例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat,10.9枚举类型,枚举变量的定义先定义枚举类型再定义枚举变量enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumweekdaya,b,c;直接定义枚举变量enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sata,b,c;同时定义枚举类型和枚举变量enumSun,Mon,Tue,Wed,Thu,Fri,Sata,b,c;,枚举变量的赋值和使用只能取其相应枚举类型所列出的枚举常量例如:enumSun,Mon,Tue,Wed,Thu,Fri,Sata,b,c;a=Sun;/*正确*/a=Sunday/*错误*/例如注意:能使用赋值语句对枚举常量标识符赋值只能把枚举常量值赋予枚举变量,不能把枚举常量所对应的序号直接赋予枚举变量枚举常量不是字符常量也不是字符串常量,使用时不要加单、双引号枚举常量可以进行比较运算,由它们对应的整数参加比较,程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论