第九章 群体类和群体数据的组织.ppt
《第九章 群体类和群体数据的组织.ppt》由会员分享,可在线阅读,更多相关《第九章 群体类和群体数据的组织.ppt(76页珍藏版)》请在麦多课文档分享上搜索。
1、第九章 群体类 和群体数据的组织,成都信息工程学院计算机系,C+语言程序设计,2,本章主要内容,模板 群体类 群体数据的组织,3,第一部分:模板,函数模板 类模板,4,函数模板,函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明方法: template 函数声明,函 数 模 板,5,求绝对值函数的模板,#include using namespace std; template T abs(T x) return x0?-x:x; int main() int n=-5;double d=-5.5;coutabs(n)endl;coutabs(d
2、)endl; ,函 数 模 板,运行结果: 5 5.5,6,求绝对值函数的模板分析,编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。 当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数: int abs(int x) return x0?-x:x; ,函 数 模 板,7,类模板的作用,使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。,类 模 板,8,类模板的声明,类模板: t
3、emplate class 类名 类成员声明 如果需要在类模板以外定义其成员函数,则要采用以下的形式: template 类型名 类名:函数名(参数表),类 模 板,9,例9-2 类模板应用举例,#include #include using namespace std; / 结构体Student struct Student int id; /学号float gpa; /平均分 ;,类 模 板,template /类模板:实现对任意类型数据进行存取 class Store private:T item; /用于存放任意类型的数据int haveValue;/用于标记item是否已被存入内容p
4、ublic:Store(void); /默认形式(无形参)的构造函数GetElem(void); /提取数据函数void PutElem(T x);/存入数据函数 ; / 默认形式构造函数的实现 template Store:Store(void): haveValue(0) ,10,template / 提取数据函数的实现 T Store:GetElem(void) / 如果试图提取未初始化的数据,则终止程序if (haveValue = 0) cout / 存入数据函数的实现 void Store:PutElem(T x) / 将haveValue 置为 TRUE,表示item中已存入数值
5、 haveValue+; item = x; / 将x值存入item ,11,int main() Student g= 1000, 23; Store S1, S2; Store S3;Store D; S1.PutElem(3); S2.PutElem(-7); cout S1.GetElem() “ “ S2.GetElem()endl; S3.PutElem(g); cout “The student id is “ S3.GetElem().idendl;cout “Retrieving object D “ ;cout D.GetElem() endl; /输出对象D的数据成员/
6、由于D未经初始化,在执行函数D.GetElement()时出错 ,12,13,第二部分:群体数据,线性群体 线性群体的概念 直接访问群体-数组类 顺序访问群体-链表类 栈类 队列类,14,群体的概念,群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。 线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。 非线性群体不用位置顺序来标识元素。,15,线性群体的概念,线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照访问元素的不同方法分为直接访问、顺序访问和索引访问。 在本章我们只介绍直接访问和顺序访问。,16,数组,静态数组是具有固定元素
7、个数的群体,其中的元素可以通过下标直接访问。 缺点:大小在编译时就已经确定,在运行时无法修改。 动态数组由一系列位置连续的,任意数量相同类型的元素组成。 优点:其元素个数可在程序运行时改变。 动态数组类模板:例9-3(9_3.h),直接访问的线性群体,#ifndef ARRAY_CLASS #define ARRAY_CLASS using namespace std; #include #include #ifndef NULL const int NULL = 0; #endif / NULL enum ErrorType invalidArraySize, memoryAllocatio
8、nError, indexOutOfRange ; char *errorMsg = “Invalid array size“, “Memory allocation error“,“Invalid index: “ ;,动态数组类模板程序,17,template class Array private:T* alist; int size; void Error(ErrorType error,int badIndex=0) const;public:Array(int sz = 50); Array(const Array,18,19,数组类模板的构造函数,/ 构造函数 template
9、Array:Array(int sz) if (sz=0)/sz为数组大小(元素个数),若小于0则输出错误信息Error(invalidArraySize);size=sz;/ 将元素个数赋值给变量sizealist=new Tsize;/动态分配size个T类型的元素空间if (alist=NULL) /如果分配内存不成功,输出错误信息Error(memoryAllocationError); ,直接访问的线性群体,20,数组类的拷贝构造函数,template Array:Array(const Array ,直接访问的线性群体,21,浅拷贝,int main() Array A(10);A
10、rray B(A);,template Array:Array(const Array ,22,深拷贝,23,数组类的重载“=“运算符函数,template Array ,直接访问的线性群体,24,数组类的重载下标操作符函数,template T ,直接访问的线性群体,25,为什么有的函数返回引用,如果一个函数的返回值是一个对象的值,它就被认为是一个常量,不能成为左值。 如果返回值为引用。由于引用是对象的别名,所以通过引用当然可以改变对象的值。,直接访问的线性群体,26,重载指针转换操作符,template Array:operator T* (void) const /返回当前对象中私有数组
11、的首地址return alist; ,直接访问的线性群体,27,指针转换运算符的作用,#include using namespace std; int main() int a10;void read(int *p, int n);read(a, 10); void read(int *p, int n) for (int i=0; ipi; ,int main() Array a(10);void read(int *p, n);read(a, 10); void read(int *p, int n) for (int i=0; ipi; ,直接访问的线性群体,28,Array类的应用,
12、例9-4求范围2N中的质数,N在程序运行时由键盘输入。,直接访问的线性群体,#include #include #include “9_3.h“ using namespace std; int main() Array A(10);int n; int primecount = 0, i, j;cout = 2 as upper limit for prime numbers: “;cin n; Aprimecount+ = 2; / 2是一个质数for(i = 3; i i/2) Aprimecount+ = i;for (i = 0; i primecount; i+) cout set
13、w(5) Ai;if (i+1) % 10 = 0) cout endl; cout endl; ,29,30,链表,链表是一种动态数据结构,可以用来表示顺序访问的线性群体。 链表是由系列结点组成的,结点可以在运行时动态生成。 每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点中只有一个指向后继结点的指针,则该链表称为单链表。,顺序访问的线性群体,31,单链表,顺序访问的线性群体,32,单链表的结点类模板,template class Node private:Node *next;public:T data; Node(const T,顺序访问的线性群体
14、,33,在结点之后插入一个结点,data1,p,data,template void Node:InsertAfter(Node *p) /p节点指针域指向当前节点的后继节点p-next = next; next = p; /当前节点的指针域指向p ,顺序访问的线性群体,34,删除结点之后的结点,顺序访问的线性群体,data1,Node *Node:DeleteAfter(void) Node *tempPtr = next; if (next = NULL) return NULL;next = tempPtr-next; return tempPtr; ,tempPtr,35,链表的基本操
15、作,生成结点 插入结点 查找结点 删除结点 遍历链表 清空链表,顺序访问的线性群体,36,链表类模板(例9-6),顺序访问的线性群体,/9_6.h #ifndef LINKEDLIST_CLASS #define LINKEDLIST_CLASS #include #include using namespace std; #ifndef NULL const int NULL = 0; #endif / NULL #include “9_5.h“ template class LinkedList private:Node *front, *rear;Node *prevPtr, *curr
16、Ptr;int size;int position;Node *GetNode(const T,public:LinkedList(void);LinkedList(const LinkedList #endif / LINKEDLIST_CLASS,37,链表类应用举例(例9-7),顺序访问的线性群体,#include #include “9_6.h“ #include “9_6.cpp“ using namespace std; int main() LinkedList Link;int i, key, item;for (i=0;i item;Link.InsertFront(item
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 群体 数据 组织 PPT
