




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章群体类和群体数据的组织 本章主要内容 模板群体类群体数据的组织 第一部分 模板 函数模板类模板 函数模板 函数模板可以用来创建一个通用功能的函数 以支持多种不同形参 进一步简化重载函数的函数体设计 声明方法 Template函数声明 函数模板 求绝对值函数的模板 includeusingnamespacestd TemplateTabs Tx returnx 0 x x intmain intn 5 doubled 5 5 cout abs n endl cout abs d endl 函数模板 运行结果 55 5 求绝对值函数的模板分析 编译器从调用abs 时实参的类型 推导出函数模板的类型参数 例如 对于调用表达式abs n 由于实参n为int型 所以推导出模板中类型参数T为int 当类型参数的含义确定后 编译器将以函数模板为样板 生成一个函数 intabs intx returnx 0 x x 函数模板 类模板的作用 使用类模板使用户可以为类声明一种模式 使得类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值 能取任意类型 包括基本类型的和用户自定义类型 类模板 类模板的声明 类模板 templateclass类名 类成员声明 如果需要在类模板以外定义其成员函数 则要采用以下的形式 template类型名类名 函数名 参数表 类模板 例9 2类模板应用举例 include includeusingnamespacestd 结构体StudentstructStudent intid 学号floatgpa 平均分 类模板 template 类模板 实现对任意类型数据进行存取classStore private Titem 用于存放任意类型的数据inthaveValue 用于标记item是否已被存入内容public Store void 默认形式 无形参 的构造函数TGetElem void 提取数据函数voidPutElem Tx 存入数据函数 默认形式构造函数的实现templateStore Store void haveValue 0 10 template 提取数据函数的实现TStore GetElem void 如果试图提取未初始化的数据 则终止程序if haveValue 0 cout 存入数据函数的实现voidStore PutElem Tx haveValue 将haveValue置为TRUE 表示item中已存入数值item x 将x值存入item 11 intmain Studentg 1000 23 StoreS1 S2 StoreS3 StoreD S1 PutElem 3 S2 PutElem 7 cout S1 GetElem S2 GetElem endl S3 PutElem g cout Thestudentidis S3 GetElem id endl cout RetrievingobjectD cout D GetElem endl 输出对象D的数据成员 由于D未经初始化 在执行函数D GetElement 时出错 12 第二部分 群体数据 线性群体线性群体的概念直接访问群体 数组类顺序访问群体 链表类栈类队列类 群体的概念 群体是指由多个数据元素组成的集合体 群体可以分为两个大类 线性群体和非线性群体 线性群体中的元素按位置排列有序 可以区分为第一个元素 第二个元素等 非线性群体不用位置顺序来标识元素 线性群体的概念 线性群体中的元素次序与其位置关系是对应的 在线性群体中 又可按照访问元素的不同方法分为直接访问 顺序访问和索引访问 在本章我们只介绍直接访问和顺序访问 数组 静态数组是具有固定元素个数的群体 其中的元素可以通过下标直接访问 缺点 大小在编译时就已经确定 在运行时无法修改 动态数组由一系列位置连续的 任意数量相同类型的元素组成 优点 其元素个数可在程序运行时改变 动态数组类模板 例9 3 9 3 h 直接访问的线性群体 ifndefARRAY CLASS defineARRAY CLASSusingnamespacestd include include ifndefNULLconstintNULL 0 endif NULLenumErrorType invalidArraySize memoryAllocationError indexOutOfRange char errorMsg Invalidarraysize Memoryallocationerror Invalidindex 动态数组类模板程序 17 templateclassArray private T alist intsize voidError ErrorTypeerror intbadIndex 0 const public Array intsz 50 Array constArray 18 数组类模板的构造函数 构造函数templateArray Array intsz if sz 0 sz为数组大小 元素个数 若小于0 则输出错误信息Error invalidArraySize size sz 将元素个数赋值给变量sizealist newT size 动态分配size个T类型的元素空间if alist NULL 如果分配内存不成功 输出错误信息Error memoryAllocationError 直接访问的线性群体 数组类的拷贝构造函数 templateArray Array constArray 浅拷贝 intmain ArrayA 10 ArrayB A templateArray Array constArray 深拷贝 数组类的重载 运算符函数 templateArray 数组类的重载下标操作符函数 templateT 直接访问的线性群体 为什么有的函数返回引用 如果一个函数的返回值是一个对象的值 它就被认为是一个常量 不能成为左值 如果返回值为引用 由于引用是对象的别名 所以通过引用当然可以改变对象的值 重载指针转换操作符 templateArray operatorT void const 返回当前对象中私有数组的首地址returnalist 指针转换运算符的作用 includeusingnamespacestd intmain inta 10 voidread int p intn read a 10 voidread int p intn for inti 0 i p i intmain Arraya 10 voidread int p intn read a 10 voidread int p intn for inti 0 i p i Array类的应用 例9 4求范围2 N中的质数 N在程序运行时由键盘输入 include include include 9 3 h usingnamespacestd intmain ArrayA 10 intn intprimecount 0 i j cout 2asupperlimitforprimenumbers cin n A primecount 2 2是一个质数for i 3 ii 2 A primecount i for i 0 i primecount i cout setw 5 A i if i 1 10 0 cout endl cout endl 29 链表 链表是一种动态数据结构 可以用来表示顺序访问的线性群体 链表是由系列结点组成的 结点可以在运行时动态生成 每一个结点包括数据域和指向链表中下一个结点的指针 即下一个结点的地址 如果链表每个结点中只有一个指向后继结点的指针 则该链表称为单链表 单链表 顺序访问的线性群体 单链表的结点类模板 templateclassNode private Node next 链表中当前结点public Tdata Node constT 在结点之后插入一个结点 data1 p data templatevoidNode InsertAfter Node p p节点指针域指向当前节点的后继节点p next nextnext p 当前节点的指针域指向p 顺序访问的线性群体 删除结点之后的结点 data1 Node Node DeleteAfter void Node tempPtr next if next NULL returnNULL next tempPtr next returntempPtr tempPtr 链表的基本操作 生成结点插入结点查找结点删除结点遍历链表清空链表 链表类模板 例9 6 9 6 h ifndefLINKEDLIST CLASS defineLINKEDLIST CLASS include includeusingnamespacestd ifndefNULLconstintNULL 0 endif NULL include 9 5 h templateclassLinkedList private Node front rear Node prevPtr currPtr intsize intposition Node GetNode constT 37 public LinkedList void LinkedList constLinkedList 38 voidInsertFront constT endif LINKEDLIST CLASS 39 链表类应用举例 例9 7 includeusingnamespacestd include 9 6 h include 9 6 cpp intmain LinkedListLink inti key item for i 0 i item Link InsertFront item 顺序访问的线性群体 cout key Link Reset 41 while Link EndOfList if Link Data key Link DeleteAt Link Next cout List Link Reset while Link EndOfList cout Link Data Link Next cout endl 42 特殊的线性群体 栈 栈是只能从一端访问的线性群体 可以访问的这一端称栈顶 另一端称栈底 栈的应用举例 函数调用 栈的应用举例 表达式处理 栈的基本状态 栈空栈中没有元素栈满栈中元素个数达到上限一般状态栈中有元素 但未达到栈满状态 47 栈的基本操作 初始化入栈出栈清空栈访问栈顶元素检测栈的状态 满 空 栈类模板 例9 8 9 8 h ifndefSTACK CLASS defineSTACK CLASS include includeusingnamespacestd constintMaxStackSize 50 templateclassStack private Tstacklist MaxStackSize inttop public Stack void voidPush constT 类的实现略 栈的应用 例9 9一个简单的整数计算器实现一个简单的整数计算器 能够进行加 减 乘 除和乘方运算 使用时算式采用后缀输入法 每个操作数 操作符之间都以空白符分隔 例如 若要计算 3 5 则输入 35 乘方运算符用 表示 每次运算在前次结果基础上进行 若要将前次运算结果清除 可键入 c 当键入 q 时程序结束 9 9 h9 9 cpp 9 9 h include include include includeusingnamespacestd enumBoolean False True include 9 8 h classCalculator private StackS voidEnter intnum BooleanGetTwoOperands int 51 voidCalculator Enter intnum S Push num BooleanCalculator GetTwoOperands int 52 voidCalculator Compute charop Booleanresult intoperand1 operand2 result GetTwoOperands operand1 operand2 if result switch op case S Push operand2 operand1 break case S Push operand2 operand1 break case S Push operand2 operand1 break case if operand1 0 cerr Divideby0 endl S ClearStack elseS Push operand2 operand1 break case S Push pow operand2 operand1 break cout S Peek elseS ClearStack 53 voidCalculator Run void charc 20 while cin c c q switch c case c S ClearStack break case if strlen c 1 Enter atoi c elseCompute c break case case case case Compute c break default Enter atoi c break 54 voidCalculator Clear void S ClearStack 9 9 cpp include 9 9 h intmain CalculatorCALC CALC Run 55 特殊的线性群体 队列 队列是只能向一端添加元素 从另一端删除元素的线性群体 队列的基本状态 队空队列中没有元素队满队列中元素个数达到上限一般状态队列中有元素 但未达到队满状态 元素移动方向 元素移动方向 58 循环队列 在想象中将数组弯曲成环形 元素出队时 后继元素不移动 每当队尾达到数组最后一个元素时 便再回到数组开头 60 例9 10队列类模板 ifndefQUEUE CLASS defineQUEUE CLASS include includeusingnamespacestd constintMaxQSize 50 templateclassQueue private intfront rear count Tqlist MaxQSize public Queue void voidQInsert constT 成员函数的实现略 第三部分 群体数据的组织 插入排序选择排序交换排序顺序查找折半查找 排序 sorting 排序是计算机程序设计中的一种重要操作 它的功能是将一个数据元素的任意序列 重新排列成一个按关键字有序的序列 数据元素 数据的基本单位 在计算机中通常作为一个整体进行考虑 一个数据元素可由若干数据项组成 关键字 数据元素中某个数据项的值 用它可以标识 识别 一个数据元素 在排序过程中需要完成两种基本操作 比较两个数的大小调整元素在序列中的位置 群体数据的组织 内部排序与外部排序 内部排序 待排序的数据元素存放在计算机内存中进行的排序过程 外部排序 待排序的数据元素数量很大 以致内存存中一次不能容纳全部数据 在排序过程中尚需对外存进行访问的排序过程 内部排序方法 插入排序选择排序交换排序 插入排序的基本思想 每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上 直到待排序元素插入完为止 初始状态 5 41020123 直接插入排序 在插入排序过程中 由于寻找插入位置的方法不同又可以分为不同的插入排序算法 这里我们只介绍最简单的直接插入排序算法 例9 11直接插入排序函数模板 9 11 h templatevoidInsertionSort TA intn inti j Ttemp for i 1 i0 直接插入排序函数模板 9 11 h 68 选择排序的基本思想 每次从待排序序列中选择一个关键字最小的元素 当需要按关键字升序排列时 顺序排在已排序序列的最后 直至全部排完 3 41020125 34 1020125 第i次选择后 将选出的那个记录与第i个记录做交换 直接选择排序 在选择类排序方法中 从待排序序列中选择元素的方法不同 又分为不同的选择排序方法 其中最简单的是通过顺序比较找出待排序序列中的最小元素 称为直接选择排序 例9 12直接选择排序函数模板 9 12 h templatevoidSwap T 直接选择排序函数模板 9 12 h 71 交换排序的基本思想 两两比较待排序序列中的元素 并交换不满足顺序要求的各对元素 直到全部满足顺序要求为止 最简单的交换排序方法 起泡排序 对具有n个元素的序列按升序进行起泡排序的步骤 首先将第一个元素与第二个元素进行比较 若为逆序 则将两元素交换 然后比较第二 第三个元素 依次类推 直到第n 1和第n个元素进行了比较和交换 此过程称为第一趟起泡排序 经过第一趟 最大的元素便被交换到第n个位置 对前n 1个元素进行第二趟起泡排序 将其中最大元素交换到第n 1个位置 如此继续 直到某一趟排序未发生任何交换时 排序完毕 对n个元素的序列 起泡排序最多需要进行n 1趟 起泡排序举例 对整数序列85243按升序排序 85243 5 2 4 3 8 2 4 3 5 8 2 3 4 5 8 2 3 4 5 8 初始状态 第一趟结果 第二趟结果 第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 26840-2025电子商务药品核心元数据
- JJF 2286-2025干涉型光纤水听器相移灵敏度校准规范(差分延时外差解调法)
- 2025江苏苏州国家历史文化名城保护区、苏州市姑苏区区属国资集团副总裁招聘2人模拟试卷附答案详解(黄金题型)
- 2025年西电集团医院招聘(57人)模拟试卷有答案详解
- 安全培训教师总结课件
- 安全培训教室器材课件
- 2025第十三届贵州人才博览会贵阳幼儿师范高等专科学校引进高层次及急需紧缺人才模拟试卷及答案详解(各地真题)
- 广播稿写作培训课件
- 2025吉林农业大学招聘高层次人才7人模拟试卷有完整答案详解
- 2025江苏省检察官学院招聘高层次人才1人考前自测高频考点模拟试题及完整答案详解
- 【《企业人才招聘存在的问题与对策》5200字(论文)】
- 危险方法危害公共安全罪认定标准研究
- 我国养老状况课件
- 心脏支架术后康复课件
- 2025年体育产业成本控制与赛事运营研究报告
- 能源问题面试题库及答案
- 国庆期间保安安全培训课件
- 2025年征兵心理测试题库及答案
- 监控设备迁移合同协议书
- 《老年服务礼仪与沟通技巧》全套教学课件
- 赏析古诗的意象、意境
评论
0/150
提交评论