




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录 13 1线性群体13 2群体数据的组织13 3小结 1 线性群体 线性群体的概念直接访问群体 数组类顺序访问群体 链表类栈类队列类 2 13 1线性群体 群体的概念 群体是指由多个数据元素组成的集合体 群体可以分为两个大类 线性群体和非线性群体 线性群体中的元素按位置排列有序 可以区分为第一个元素 第二个元素等 非线性群体不用位置顺序来标识元素 3 13 1线性群体 13 1 1线性群体的概念 线性群体中的元素次序与其位置关系是对应的 在线性群体中 又可按照访问元素的不同方法分为直接访问 顺序访问和索引访问 在本章我们只介绍直接访问和顺序访问 4 13 1线性群体 13 1 2直接访问群体 数组类 静态数组是具有固定元素个数的群体 其中的元素可以通过下标直接访问 缺点 大小在编译时就已经确定 在运行时无法修改 动态数组由一系列位置连续的 任意数量相同类型的元素组成 优点 其元素个数可在程序运行时改变 vector就是用类模板实现的动态数组 动态数组类模板 例9 3 Array h 5 13 1线性群体 6 例13 1 教材例9 3 动态数组类模板程序 ifndefARRAY H defineARRAY H includetemplate 数组类模板定义classArray private T list 用于存放动态分配的数组内存首地址intsize 数组大小 元素个数 public Array intsz 50 构造函数Array constArray 13 1线性群体 13 1 2直接访问群体 数组类 templateArray Array intsz 构造函数assert sz 0 sz为数组大小 元素个数 应当非负size sz 将元素个数赋值给变量sizelist newT size 动态分配size个T类型的元素空间 templateArray Array 析构函数delete list 拷贝构造函数templateArray Array constArray 7 13 1线性群体 13 1 2直接访问群体 数组类 例13 1 续 重载 运算符 将对象rhs赋值给本对象 实现对象之间的整体赋值templateArray 返回当前对象的引用 8 13 1线性群体 13 1 2直接访问群体 数组类 例13 1 续 重载下标运算符 实现与普通数组一样通过下标访问元素 并且具有越界检查功能templateT 返回当前对象中私有数组的首地址 9 13 1线性群体 13 1 2直接访问群体 数组类 例13 1 续 templateArray operatorconstT const returnlist 返回当前对象中私有数组的首地址 取当前数组的大小templateintArray getSize const returnsize 将数组大小修改为sztemplatevoidArray resize intsz assert sz 0 检查sz是否非负if sz size 如果指定的大小与原有大小一样 什么也不做return T newList newT sz 申请新的数组内存intn sz size sz size 将sz与size中较小的一个赋值给n 将原有数组中前n个元素复制到新数组中for inti 0 i n i newList i list i delete list 删除原数组list newList 使list指向新数组size sz 更新size endif ARRAY H 10 13 1线性群体 13 1 2直接访问群体 数组类 例13 1 续 11 浅拷贝 13 1线性群体 13 1 2直接访问群体 数组类 templateArray Array constArray intmain Arraya 10 Arrayb a 12 深拷贝 13 1线性群体 13 1 2直接访问群体 数组类 为什么有的函数返回引用 如果一个函数的返回值是一个对象的值 就不应成为左值 如果返回值为引用 由于引用是对象的别名 通过引用当然可以改变对象的值 13 13 1线性群体 13 1 2直接访问群体 数组类 指针转换运算符的作用举例 includeusingnamespacestd voidread int p intn for inti 0 i p i intmain inta 10 read a 10 return0 include Array h includeusingnamespacestd voidread int p intn for inti 0 i p i intmain Arraya 10 read a 10 return0 14 13 1线性群体 13 1 2直接访问群体 数组类 Array类的应用 例13 2 教材例9 4 求范围2 N中的质数 N在程序运行时由键盘输入 15 13 1线性群体 13 1 2直接访问群体 数组类 16 include include include Array h usingnamespacestd intmain Arraya 10 用来存放质数的数组 初始状态有10个元素 intn count 0 cout 2asupperlimitforprimenumbers cin n for inti 2 i n i boolisPrime true for intj 0 j count j if i a j 0 若i被a j 整除 说明i不是质数isPrime false break if isPrime if count a getSize a resize count 2 a count i for inti 0 i count i cout setw 8 a i cout endl return0 13 1线性群体 13 1 2直接访问群体 数组类 例13 2 续 13 1 3顺序访问群体 链表类 链表是一种动态数据结构 可以用来表示顺序访问的线性群体 链表是由系列结点组成的 结点可以在运行时动态生成 每一个结点包括数据域和指向链表中下一个结点的指针 即下一个结点的地址 如果链表每个结点中只有一个指向后继结点的指针 则该链表称为单链表 17 13 1线性群体 18 单链表 13 1线性群体 13 1 3顺序访问群体 链表类 19 单链表的结点类模板 templateclassNode private Node next public Tdata Node constT 13 1线性群体 13 1 3顺序访问群体 链表类 20 在结点之后插入一个结点 13 1线性群体 13 1 3顺序访问群体 链表类 data1 p data templatevoidNode insertAfter Node p p节点指针域指向当前节点的后继节点p next next next p 当前节点的指针域指向p 21 删除结点之后的结点 13 1线性群体 13 1 3顺序访问群体 链表类 data1 tempPtr Node Node deleteAfter void Node tempPtr next if next 0 return0 next tempPtr next returntempPtr 例13 3 教材例9 5 结点类模扳 Node h ifndefNODE H defineNODE H 类模板的定义templateclassNode private Node next 指向后继结点的指针public Tdata 数据域Node constT 22 13 1线性群体 13 1 3顺序访问群体 链表类 类的实现部分 构造函数 初始化数据和指针成员templateNode Node constT 23 13 1线性群体 13 1 3顺序访问群体 链表类 例13 3 续 在当前结点之后插入一个结点ptemplatevoidNode insertAfter Node p p next next p结点指针域指向当前结点的后继结点next p 当前结点的指针域指向p 删除当前结点的后继结点 并返回其地址templateNode Node deleteAfter Node tempPtr next 将欲删除的结点地址存储到tempPtr中if next 0 如果当前结点没有后继结点 则返回空指针return0 next tempPtr next 使当前结点的指针域指向tempPtr的后继结点returntempPtr 返回被删除的结点的地址 endif NODE H 24 13 1线性群体 13 1 3顺序访问群体 链表类 例13 3 续 链表的基本操作 生成结点插入结点查找结点删除结点遍历链表清空链表 25 13 1线性群体 13 1 3顺序访问群体 链表类 例13 4 教材例9 6 链表类模板 ifndefLINKEDLIST H defineLINKEDLIST H include Node h templateclassLinkedList private 数据成员 Node front rearNode prevPtr currPtr intsize intposition Node newNode constT LinkedList endif LINKEDLIST H 26 13 1线性群体 13 1 3顺序访问群体 链表类 例13 5 教材例9 7 链表类应用举例 9 7 cpp include include LinkedList h usingnamespacestd intmain LinkedListlist for inti 0 i item list insertFront item cout List list reset while list endOfList cout list data list next cout endl intkey cout key list reset while list endOfList if list data key list deleteCurrent list next cout List list reset while list endOfList cout list data list next cout endl return0 27 13 1线性群体 13 1 3顺序访问群体 链表类 例13 5 续 运行结果如下 36575245910List 10954257563Pleaseentersomeintegerneededtobedeleted 5List 10942763 28 13 1线性群体 13 1 3顺序访问群体 链表类 13 1 4栈类 栈是只能从一端访问的线性群体 可以访问的这一端称栈顶 另一端称栈底 29 13 1线性群体 栈的应用举例 表达式处理 30 13 1线性群体 13 1 4栈类 栈的基本状态 栈空栈中没有元素栈满栈中元素个数达到上限一般状态栈中有元素 但未达到栈满状态 31 13 1线性群体 13 1 4栈类 32 13 1线性群体 13 1 4栈类 栈的基本操作 初始化入栈出栈清空栈访问栈顶元素检测栈的状态 满 空 33 13 1线性群体 13 1 4栈类 例13 6 教材例9 8 栈类模板 Stack h ifndefSTACK H defineSTACK H includetemplateclassStack private Tlist SIZE inttop public Stack voidpush constT 34 13 1线性群体 13 1 4栈类 例13 6 续 模板的实现templateStack Stack top 1 templatevoidStack push constT 返回栈顶元素 templateboolStack isEmpty const returntop 1 templateboolStack isFull const returntop SIZE 1 templatevoidStack clear top 1 endif STACK H 35 13 1线性群体 13 1 4栈类 栈的应用 例13 7 教材例9 9 一个简单的整数计算器实现一个简单的整数计算器 能够进行加 减 乘 除和乘方运算 使用时算式采用后缀输入法 每个操作数 操作符之间都以空白符分隔 例如 若要计算 3 5 则输入 35 乘方运算符用 表示 每次运算在前次结果基础上进行 若要将前次运算结果清除 可键入 c 当键入 q 时程序结束 Calculator hCalculator cpp9 9 cpp 36 13 1线性群体 13 1 4栈类 37 例13 7 Calculator h ifndefCALCULATOR H defineCALCULATOR H include Stack h 包含栈类模板定义文件classCalculator 计算器类private Stacks 操作数栈voidenter doublenum 将操作数num压入栈 连续将两个操作数弹出栈 放在opnd1和opnd2中boolgetTwoOperands double endif CALCULATOR H 13 1线性群体 13 1 4栈类 38 例13 7 续 Calculator cpp include Calculator h include include includeusingnamespacestd 工具函数 用于将字符串转换为实数inlinedoublestringToDouble conststring 13 1线性群体 13 1 4栈类 39 例13 7 续 boolCalculator getTwoOperands double 13 1线性群体 13 1 4栈类 40 voidCalculator compute charop 执行运算doubleoperand1 operand2 boolresult 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 检查除数是否为0cerr Dividedby0 endl s clear 除数为0时清空栈 elses push operand2 operand1 break case s push pow operand2 operand1 break default cerr Unrecognizedoperator endl break cout s peek 输出本次运算结果 elses clear 操作数不够 清空栈 13 1线性群体 13 1 4栈类 例13 7 续 41 voidCalculator run 读入并处理后缀表达式stringstr while cin str str q switch str 0 case c s clear break case 遇 需判断是减号还是负号if str size 1 enter stringToDouble str elsecompute str 0 break case 遇到其它操作符时case case case compute str 0 default 若读入的是操作数 转换为整型后压入栈enter stringToDouble str break voidCalculator clear 清空操作数栈s clear 13 1线性群体 13 1 4栈类 例13 7 续 42 例13 7 续 9 9 cpp include Calculator h intmain Calculatorc c run return0 13 1线性群体 13 1 4栈类 13 1 5队列类 队列是只能向一端添加元素 从另一端删除元素的线性群体 43 13 1线性群体 队列的基本状态 队空队列中没有元素队满队列中元素个数达到上限一般状态队列中有元素 但未达到队满状态 44 13 1线性群体 13 1 5队列类 45 13 1线性群体 13 1 5队列类 元素移动方向 元素移动方向 45 循环队列 在想象中将数组弯曲成环形 元素出队时 后继元素不移动 每当队尾达到数组最后一个元素时 便再回到数组开头 46 13 1线性群体 13 1 5队列类 47 13 1线性群体 13 1 5队列类 47 例13 8 教材例9 10 队列类模板 Queue h ifndefQUEUE H defineQUEUE H include 类模板的定义templateclassQueue private intfront rear count 队头指针 队尾指针 元素个数Tlist SIZE 队列元素数组public Queue 构造函数 初始化队头指针 队尾指针 元素个数voidinsert constT 访问队首元素 48 13 1线性群体 13 1 5队列类 测试队列状态intgetLength const 求队列长度boolisEmpty const 判队队列空否boolisFull const 判断队列满否 构造函数 初始化队头指针 队尾指针 元素个数templateQueue Queue front 0 rear 0 count 0 templatevoidQueue insert constT 返回首元素值 49 13 1线性群体 13 1 5队列类 例13 8 续 templateconstT endif QUEUE H 50 13 1线性群体 13 1 5队列类 例13 8 续 13 2群体数据的组织 插入排序选择排序交换排序顺序查找折半查找 51 13 2群体数据的组织 排序 sorting 排序是计算机程序设计中的一种重要操作 它的功能是将一个数据元素的任意序列 重新排列成一个按关键字有序的序列 数据元素 数据的基本单位 在计算机中通常作为一个整体进行考虑 一个数据元素可由若干数据项组成 关键字 数据元素中某个数据项的值 用它可以标识 识别 一个数据元素 在排序过程中需要完成两种基本操作 比较两个数的大小调整元素在序列中的位置 52 13 2群体数据的组织 内部排序与外部排序 内部排序 待排序的数据元素存放在计算机内存中进行的排序过程 外部排序 待排序的数据元素数量很大 以致内存存中一次不能容纳全部数据 在排序过程中尚需对外存进行访问的排序过程 53 13 2群体数据的组织 内部排序方法 插入排序选择排序交换排序 54 13 2群体数据的组织 插入排序的基本思想 每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上 直到待排序元素插入完为止 55 13 2群体数据的组织 13 2 1插入排序 初始状态 5 41020123 4 12 45101220 3 直接插入排序 在插入排序过程中 由于寻找插入位置的方法不同又可以分为不同的插入排序算法 这里我们只介绍最简单的直接插入排序算法 例13 9 教材例9 11 直接插入排序函数模板 9 11 h 56 13 2群体数据的组织 13 2 1插入排序 57 例13 9直接插入排序函数模板 templatevoidinsertionSort Ta intn inti j Ttemp for inti 1 i0 13 2群体数据的组织 13 2 1插入排序 选择排序的基本思想 每次从待排序序列中选择一个关键字最小的元素 当需要按关键字升序排列时 顺序排在已排序序列的最后 直至全部排完 58 13 2群体数据的组织 13 2 2选择排序 3 41020125 34 1020125 第i次选择后 将选出的那个记录与第i个记录做交换 直接选择排序 在选择类排序方法中 从待排序序列中选择元素的方法不同 又分为不同的选择排序方法 其中最简单的是通过顺序比较找出待排序序列中的最小元素 称为直接选择排序 例13 10 教材例9 12直接选择排序函数模板 9 12 h 59 13 2群体数据的组织 13 2 2选择排序 60 例13 10直接选择排序函数模板 templatevoidmySwap T 13 2群体数据的组织 13 2 2选择排序 交换排序的基本思想 两两比较待排序序列中的元素 并交换不满足顺序要求的各对元素 直到全部满足顺序要求为止 61 13 2群体数据的组织 13 2 3交换排序 最简单的交换排序方法 起泡排序 对具有n个元素的序列按升序进行起泡排序的步骤 首先将第一个元素与第二个元素进行比较 若为逆序 a则将两元素交换 然后比较第二 第三个元素 依次类推 直到第n 1和第n个元素进行了比较和交换 此过程称为第一趟起泡排序 经过第一趟 最大的元素便被交换到第n个位置 对前n 1个元素进行第二趟起泡排序 将其中最大元素交换到第n 1个位置 如此继续 直到某一趟排序未发生任何交换时 排序完毕 对n个元素的序列 起泡排序最多需要进行n 1趟 62 13 2群体数据的组织 13 2 3交换排
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程力学 课件 力的性质
- 2025年产科妇科妇科护理常见问题考察试卷答案及解析
- 2025年病理科白细胞计数的实验操作模拟考试答案及解析
- 2025年麻醉药理学专业知识检测答案及解析
- 2025年护理学基本技能实操考核答案及解析
- 2025年消化内科十二指肠溃疡并发症预防评估试卷答案及解析
- 2025年病毒学HIV病毒的抗病毒治疗模拟考试卷答案及解析
- 2025年麻醉科无痛分娩操作技能考核模拟试卷答案及解析
- 2025年社会医学公共卫生与社会医学疫情防控综合模拟试卷答案及解析
- 2025年肝胆外科手术后并发症护理策略检测试卷答案及解析
- 《无人机组装与调试》-教学教案
- 环境卫生学与消毒灭菌效果监测
- 我的叔叔于勒省一等奖课件市公开课一等奖课件省赛课获奖课件
- 跨境电商物流与供应链管理PPT全套完整教学课件
- 初三化学家长会发言稿
- C语言试讲稿课件
- 收音机组装指导书
- 北京市房屋租赁合同(BF20230603)(2023版)
- 全国行政区域身份证代码表(EXCEL版)
- 新麻醉记录单
- 社区合理用药讲课
评论
0/150
提交评论