C++程序设计第8章枚举型和结构体.ppt
《C++程序设计第8章枚举型和结构体.ppt》由会员分享,可在线阅读,更多相关《C++程序设计第8章枚举型和结构体.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第8章 枚举型和结构体 目的与要求8.1 枚举类型的定义及应用8.2 结构体的定义及应用8.3 链表本章小结目的与要求 通过本章学习,应了解枚举型与结构体两种导出数据类型的概念,掌握枚举型与结构体两种数据类型的定义格式与方法,会用枚举型与结构体数据类型定义枚举型变量与结构体变量。会用结构体与枚举型解决实际问题。了解链表的概念,初步学会链表的简单操作,如:链表的建立、增加、删除、查询等方法。8.1 枚举类型的定义及应用 枚举类型:是某类数据可能取值的集合;枚举变量:用枚举类型定义的变量。8.1.1 枚举类型的定义1.枚举类型的定义格式 enum ;例如:enum weekdays Sun,Mon
2、,Tue,Wed,Thu,Fri,Sat;2.枚举类型元素的序号 枚举类型元素序号:是元素对应的整型常量值。(1)默认序号值 若枚举类型定义中没有指定元素的序号值,则默认序号值从0开始依次递增。(2)指定序号值 全指定,所谓全指定是给枚举类型的每一个元素指定一个序号值。例如:enum boolean TRUE=1,FALSE=0;部分指定,所谓部分指定是给枚举类型的部分元素指定序号值。例如:enum colors red=5,blue=1,green,black,white,yellow;。8.1.2 枚举类型变量的定义1.先定义类型后定义变量格式:,;例如:enum weekdays Sun
3、,Mon,Tue,Wed,Thu,Fri,Sat;weekdays day1,day2;2.定义类型的同时定义变量格式:enum ,;例如:enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat day1,day2;枚举类型变量的定义3.直接定义枚举变量格式:enum ,;例如:enum Sun,Mon,Tue,Wed,Thu,Fri,Sat day1=Sun,day2=Mon;定义枚举变量时,可对变量进行初始化赋值。8.1.3 枚举类型变量的引用 1.1.赋值运算 枚举类型的元素可直接赋给枚举变量,且同类型枚举变量之间可以相互赋值。即:(1)枚举变量=枚举元素;如
4、,day1=Sun;(2)枚举变量1=枚举变量2;如,day2=day1;2.枚举变量的输入输出(1)不能用键盘通过“cin”向枚举变量输入元素值。(2)可用“coutday1)day2=day1;/day2day1的比较就是序号值关系式:10的比较 if(day1Sat)da1=Sat;/day1Sat的比较就是序号值关系式:06的比较枚举型举例 【例8.1】先定义描述6种颜色的枚举类型colors,然后再用该枚举类型定义枚举数组,任意输入6个颜色号,转换成对应的颜色枚举量后输入到枚举数组中,最后输出枚举数组中对应的颜色。例程 【例8.2】定义一个描述三种颜色的枚举类型red、blue、gr
5、een,输出这三种颜色的全部排列结果。例程8.2 结构体的定义及应用 nonamemathphiengave1001Zhou908580851002Li758085801003Wang95859090 学生成绩情况表 学生成绩信息必须用不同数据类型的数据项来描述的情况,如:学号:no-int 姓名:name-char8 成绩:eng、phi、math、ave-float 8.2.1 结构体的概念 结构体的概念 结构体:将不同类型数据作为一个整体来处理的数据结构称为结构体。结构体类型:是导出型数据类型,必须先定义结构体类型,后定义结构体变量。8.2.2 结构体类型的定义结构体类型的定义格式为:s
6、truct ;说明:(1)关键词struct说明定义的是结构体类型;(2)结构体类型名必须符合标识符命名规则;(3)结构体由若干个数据成员组成,每个数据成员可以有不同的数据类型。数据类型可以是基本类型,也可以是导出类型。结构体类型的定义举例【例8.3】定义一个学生成绩的结构体数据类型如下:struct student int no;/学号 char name8;/姓名 float eng,phy,math,ave;/英语、物理、数学与平均成绩 ;8.2.3 结构体变量的定义1.结构变量的定义(1)先定义类型后定义变量格式:存储类型 ,;例如:student stu1,stu23;(2)定义结构
7、体的同时定义结构体变量 格式:struct ,;结构体变量的定义例如:struct student int no;char name8;float eng,phy,math,ave;stu1,stu23;(3)直接定义结构体变量 struct ,;例如:struct int no;char name8;float eng,phy,math,ave;stu1,stu23;2.结构体变量的初始化 定义结构体变量时可进行初始化。结构体变量的初始化格式:=初始化值;例如:student stu1=1001,Zhou,90,85,80;student stu23=1001,Zhou,90,85,80,1
8、001,Li,75,80,85,1001,Wang,95,85,90;结构体变量的引用1.结构体变量数据成员的引用格式 .其中“.”称为成员运算符。例如::stu1.no 表示引用学生结构体变量stu1中的数据成员no。stu20.no 表示引用学生结构体数组元素stu20的数据成员no。2.结构体变量数据成员的输入/输出 C+规定,用cin、cout只能对数据成员进行输入输出,不能对结构体变量输入输出。输入输出格式如下。(1)输入:cin.;例如:cinstu1.nostu1.namestu1.engstu1.phistu1.math;(2)输出:cout.;例如:coutstu1.nots
9、tu1.nametstu1.engtstu1.phitstu1;与coutstu1 是错误的。3.结构变量的赋值运算 允许两个同类型结构变量之间的赋值运算:结构体变量1=结构体变量2;例如:student stu1=1001,Zhou,90,85,80,stu2;stu2=stu1;此时,stu2将具有与stu1相同的数据内容。【例8.4】定义全班学生学习成绩的结构体数组,学生结构体类型的数据成员为:姓名、学号、英语、物理、数学和这三门功课的平均成绩。先输入全班成绩,再计算每个学生的平均成绩,最后输出全班成绩表。例程8.2.5 结构体变量与数组作为函数参数(习题课)1.函数定义格式(1)结构体
10、变量作为函数参数 (,)函数体(2)结构体数组作为函数参数 (,)函数体结构体变量与数组作为函数参数2.函数调用格式(1)结构体变量作为实参:函数名(结构体变量名,)(2)结构体数组作为实参:函数名(结构体数组名,)3.参数的传送方式 用结构体变量作为函数参数时,实参值传送给形参属于值传送,因此,函数调用后实参值仍保持不变。用结构体数组作为函数参数时,实参值传送给形参属于传地址,因此,函数调用后实参数组值随形参数组而变动。结构体变量与数组作为函数参数举例 【例8.5】定义全班学生学习成绩的结构体数组,学生结构体类型的数据成员为:姓名、学号、英语、物理、数学和这三门功课的平均成绩(通过计算得到)
11、。设计四个函数:全班成绩输入,求出每个学生的平均成绩,按平均成绩的升序排序,输出全班成绩表。在主函数调用这四函数完成学生成绩的输入、计算、排序与输出工作。【例8.6】建立学生档案的结构体数组,描述一个学生的信息:姓名、性别、年龄、出生日期。输出已建立的学生档案。【例8.7】定义一个复数结构体,以复数的实部r、虚部i作为结构体成员,编写能实现两复数加法的函数,用结构体变量作为其形参。在主函数内定义两个复数,并赋初值。调用复数加法函数,完成两复数相加的操作。例程例程例程8.3 链表 8.3.1链表的概念 1.链表的概念 链表是由若干同类型结点用指针链接而成的数据结构。链表由表头、结点与链尾三部组成
12、。链表的概念(1)表头head是指向链表的头指针;(2)结点是用含有指针的结构体类型node定义的结构体变量。如描述学生信息结点类型node可定义为:struct node int no;char name8;float eng,phy,math,ave;node*next;(3)链尾是链表中指针值为0的结点,用于表示链表的结束。类似于字符串中以0作为结束标志。2.链表的基本操作 链表的主要操作有链表的建立、查询、输出、插入、删除等。为方便后面的讨论,将结点内数据成员简化为学号、成绩与指针三项,简化后的链表结点类型node定义为:struct node int no;int score;nod
13、e *next;;8.3.2 链表的基本操作 链表的主要操作有建立链表、输出链表、删除链表、查询指定结点、删除指定结点、插入结点、建立有序链表等。链表的基本操作可以用自定义函数来实现:(1)建立链表函数 node*Create(void)(2)输出链表函数 void Print(node*head)(3)删除链表 函数 void Delchain(node*head)(4)删除指定结点函数 node*Delete(node*head,int no)(5)插入结点函数 node*Insert(node*head,node*pn)(6)建立有序链表函数 node*Create_order()在主函
14、数中调 用上述函数,可完成建立链表、输出链表、删除链表、删除结点、插入结点、建立有序链表等操作。1.建立无序链表函数Create()建立无序链的步骤为:(1)先定义三个node类型的指针变量:node *head,*pn,*pt;(2)新建结点,输入学号和成绩。用new运算符动态分配新结点空间,将pn指向该新结点,给新结点输入学号和成绩。(3)将新结点加入到链尾,新结点加入到链尾有链表为空与非空二种情况:链表为空 链表非空 链表为空时加入新结点 链表非空时插入新结点建立无序链表函数(4)重复(2)、(3)两步,通过循环不断向链表添加新结点直到学号为“-1”为止。(5)将链尾结点指针赋0。(6)
15、返回链表头指针head。例程2.输出链表函数Print()例程 输出链表中各结点成绩应用函数void Print(void)实现。建立输出链表函数的步骤如下。(1)函数必须用形参node*head接收来自主函数的链表头指针head。(2)定义指针变量node*p=head;将p指向链表首结点。(3)用循环语句依次输出每个结点的学号与成绩,直到链尾(p=0)为止。3.删除链表函数Delchain()例程删除链表是指删除链表全部结点,并回收结点所占用的全部内存空间。删除链表用函数Delchain(node*head)实现,主要操作步骤如下。(1)用形参node*head接受来自于主函数的链表头指针
16、;(2)定义指针变量node*p=head;并使指针变量p 指向链首,如图所示;(3)用循环语句依次删除链表的各结点。返回4.删除链表上指定结点函数Delete()删除链表上指定值结点用函数Delete(node*head,int no)实现。函数形参应有两个,第一个为链表头指针head,第二个为要删除结点的学生学号no。要删除链表上指定学号的结点,首先要找到要删除的结点,然后才能删除该结点。删除结点可能会遇到三种情况:(1)若链表为空,即head为0,则返回空指针。(2)若要删除的结点为链表首结点,则将该结点的指针值赋给链表头指针head,然后删除该结点即可。如前页图所示。删除链表上指定结点
17、(3)要删除的结点不是链表首结点。定义指针变量pc、pa分别指向当前正查找的结点与其后一个结点。图示 用下列循环语句找到要删除结点。while(pc-no!=no)pa=pc;pc=pc-next;查找后有两种情况:链表中无要删除的结点,则输出无此结点的信息。链表中有要删除的结点,如要删除结点学号为“1002”。图示例程查找指定结点返回删除指定结点返回5.插入结点函数Insert()链表各结点按成绩score降序排列,插入结点后,仍要求按成绩score降序排列。在插入函数Insert(node*head,node*pn)的形参中,head为头指针,pn为指向插入结点的指针。在插入函数体中:pc
18、为指向插入点前一个结点的指针,pa为指向插入点后一个结点的指针。插入结点有两种情况:(1)链表为空 将新结点插入到链表首,并将尾指针赋0。实现语句为:if(head=NULL)head=pn;pn-next=0;图示插入结点(续)(2)链表非空 首先判断新结点的成绩是否大于或等于链表首结点的成绩,若大于或等于首结点成绩,则将新结点插入到链首位置,若小于首结点成绩,则要根据新结点的成绩,将指针变量pc移动到插入点前,指针变量pa移动到插入点后。实现语句为:while(pc-next!=0&(pn-scorescore)pa=pc;pc=pc-next;图示插入结点(续)当pc与pa移到插入点位置
19、处时,又有两种情况:新结点插入到链尾 当新结点成绩最小时,按降序排列该结点应插入到链表尾。插入到链表尾的条件是新结点成绩小于链表尾结点成绩,即:pn-scorescore。实现语句为:if(pn-score score)pc-next=pn;pn-next=0;插入结点(续)新结点插入到链表中间 除上面所述情况外,新结点应插入链表中间,实现语句为:pn-next=pc;pa-next=pn;第一条语句使新结点指向pc所指结点,第二条语句使pa所指结点指向新结点,从而实现将新结点插入到pc与pa所指两结点之间。图示例程插入结点返回6.建立有序链表函数Create_Order()向一个空链表中不断
20、地插入新建立的结点,并使新结点按序排列,就产生一条有序链。建立一条有序链表的过程可分为两步:首先建立一个新结点,其次将新结点插入到链表中。例程 7.完成链表处理的主程序#include#include struct node char no;int score;node *next;node*Create(void)/建立无序链表的函数 void Print(const node*head)/输出链表的函数void Delchain(node*head)/删除整个链表的函数node*Delete(node*head,int no)/删除指定结点的函数node*Insert(node*head,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 枚举 结构
限制150内