《C++语言程序设计》第九章:群体类和群体数据的组织.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《《C++语言程序设计》第九章:群体类和群体数据的组织.ppt》由会员分享,可在线阅读,更多相关《《C++语言程序设计》第九章:群体类和群体数据的组织.ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章 群体类和群体数据的组织C+语言程序设计本章主要内容模板群体类群体数据的组织2第一部分模板函数模板类模板3函数模板函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。声明方法:template 函数声明 函 数 模 板4求绝对值函数的模板#includeusing namespace std;templateT abs(T x)return x0?-x:x;int main()int n=-5;double d=-5.5;coutabs(n)endl;coutabs(d)endl;函 数 模 板运行结果:运行结果:55.55求绝对值函数的模板分析编
2、译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x)return x0?-x:x;函 数 模 板6类模板的作用使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类 模 板7类模板的声明类模板:template class 类名类成员声明如果需要在类模板以外定义其成员函数,则要采用以下的形式:templat
3、e 类型名 类名:函数名(参数表)类 模 板8例9-2 类模板应用举例#include#include using namespace std;/结构体Studentstruct Student int id;/学号 float gpa;/平均分;类 模 板9template /类模板:实现对任意类型数据进行存取class Store private:T item;/用于存放任意类型的数据 int haveValue;/用于标记item是否已被存入内容 public:Store(void);/默认形式(无形参)的构造函数 T GetElem(void);/提取数据函数 void PutElem
4、(T x);/存入数据函数;/默认形式构造函数的实现template Store:Store(void):haveValue(0)1010template /提取数据函数的实现T Store:GetElem(void)/如果试图提取未初始化的数据,则终止程序 if(haveValue=0)cout No item present!endl;exit(1);return item;/返回item中存放的数据 template /存入数据函数的实现 void Store:PutElem(T x)haveValue+;/将haveValue 置为 TRUE,表示item中已存入数值 item=x;/
5、将x值存入item1111int 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().id endl;cout Retrieving object D ;cout D.GetElem()endl;/输出对象D的数据成员/由于D未经初始化,在执行函数D.GetElement()时出错1212第二部分群体数据线性群体线性群
6、体的概念直接访问群体-数组类顺序访问群体-链表类栈类队列类13群体的概念群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。非线性群体不用位置顺序来标识元素。14线性群体的概念线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照访问元素的不同方法分为直接访问、顺序访问和索引访问。在本章我们只介绍直接访问和顺序访问。第一个元素第二个元素第三个元素最后一个元素15数组静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。缺点:大小在编译时就已经确定,在运行时无法修改。动态数组由一
7、系列位置连续的,任意数量相同类型的元素组成。优点:其元素个数可在程序运行时改变。动态数组类模板:例9-3(9_3.h)直接访问的线性群体16#ifndef ARRAY_CLASS#define ARRAY_CLASSusing namespace std;#include#include#ifndef NULLconst int NULL=0;#endif /NULLenum ErrorType invalidArraySize,memoryAllocationError,indexOutOfRange;char*errorMsg=Invalid array size,Memory alloc
8、ation error,Invalid index:;动态数组类模板程序1717template class Array private:T*alist;int size;void Error(ErrorType error,int badIndex=0)const;public:Array(int sz=50);Array(const Array&A);Array(void);Array&operator=(const Array&rhs);T&operator(int i);operator T*(void)const;int ListSize(void)const;void Resize
9、(int sz);1818数组类模板的构造函数/构造函数template Array:Array(int sz)if(sz=0)/sz为数组大小(元素个数),若小于0,则输出错误信息 Error(invalidArraySize);size=sz;/将元素个数赋值给变量size alist=new Tsize;/动态分配size个T类型的元素空间 if(alist=NULL)/如果分配内存不成功,输出错误信息 Error(memoryAllocationError);直接访问的线性群体19数组类的拷贝构造函数template Array:Array(const Array&X)int n=X.
10、size;size=n;alist=new Tn;if(alist=NULL)Error(memoryAllocationError);T*srcptr=X.alist;/X.alist是对象X的数组首地址 T*destptr=alist;/alist是本对象中的数组首地址 while(n-)/逐个复制数组元素 *destptr+=*srcptr+;直接访问的线性群体20浅拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBint main()Array A(10);.Array B(A);.template Ar
11、ray:Array(const Array&X)size=X.size;alist=X.alist;21深拷贝 alist sizeAA的数组元素占用的内存拷贝前 alist sizeAA的数组元素占用的内存拷贝后 alist sizeBB的数组元素占用的内存22数组类的重载=运算符函数template Array&Array:operator=(const Array&rhs)int n=rhs.size;if(size!=n)delete alist;alist=new Tn;if(alist=NULL)Error(memoryAllocationError);size=n;T*destp
12、tr=alist;T*srcptr=rhs.alist;while(n-)*destptr+=*srcptr+;return*this;直接访问的线性群体23数组类的重载下标操作符函数template T&Array:operator(int n)/检查下标是否越界 if(n size-1)Error(indexOutOfRange,n);/返回下标为n的数组元素 return alistn;直接访问的线性群体24为什么有的函数返回引用如果一个函数的返回值是一个对象的值,它就被认为是一个常量,不能成为左值。如果返回值为引用。由于引用是对象的别名,所以通过引用当然可以改变对象的值。直接访问的线性
13、群体25重载指针转换操作符template Array:operator T*(void)const /返回当前对象中私有数组的首地址 return alist;直接访问的线性群体26指针转换运算符的作用#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(i
14、nt i=0;ipi;直接访问的线性群体27Array类的应用例9-4求范围2N中的质数,N在程序运行时由键盘输入。直接访问的线性群体28#include#include#include 9_3.husing 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 n;i+)if(primecount=A.ListSize()A.Resize(primecount+1
15、0);if(i%2=0)continue;j=3;while(j i/2)Aprimecount+=i;for(i=0;i primecount;i+)cout setw(5)Ai;if(i+1)%10=0)cout endl;cout endl;2929链表链表是一种动态数据结构,可以用来表示顺序访问的线性群体。链表是由系列结点组成的,结点可以在运行时动态生成。每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点中只有一个指向后继结点的指针,则该链表称为单链表。顺序访问的线性群体30单链表 data1 data2 data3 datan NULLheadr
16、ear顺序访问的线性群体31单链表的结点类模板template class Node private:Node*next;public:T data;Node(const T&item,Node*ptrnext=NULL);void InsertAfter(Node*p);Node*DeleteAfter(void);Node*NextNode(void)const;顺序访问的线性群体32在结点之后插入一个结点 data1 data2 p datatemplate void Node:InsertAfter(Node*p)/p节点指针域指向当前节点的后继节点节点指针域指向当前节点的后继节点 p
17、-next=next;next=p;/当前节点的指针域指向当前节点的指针域指向p 顺序访问的线性群体33 删除结点之后的结点顺序访问的线性群体 data1 data2 data3Node*Node:DeleteAfter(void)Node*tempPtr=next;if(next=NULL)return NULL;next=tempPtr-next;return tempPtr;tempPtr34链表的基本操作生成结点插入结点查找结点删除结点遍历链表清空链表顺序访问的线性群体35链表类模板(例9-6)/9_6.h#ifndef LINKEDLIST_CLASS#define LINKEDLI
18、ST_CLASS#include#include using namespace std;#ifndef NULLconst int NULL=0;#endif /NULL#include 9_5.h顺序访问的线性群体36template class LinkedList private:Node*front,*rear;Node*prevPtr,*currPtr;int size;int position;Node*GetNode(const T&item,Node*ptrNext=NULL);void FreeNode(Node*p);void CopyList(const LinkedL
19、ist&L);3737 public:LinkedList(void);LinkedList(const LinkedList&L);LinkedList(void);LinkedList&operator=(const LinkedList&L);int ListSize(void)const;int ListEmpty(void)const;void Reset(int pos=0);void Next(void);int EndOfList(void)const;int CurrentPosition(void)const;3838 void InsertFront(const T&it
20、em);void InsertRear(const T&item);void InsertAt(const T&item);void InsertAfter(const T&item);T DeleteFront(void);void DeleteAt(void);T&Data(void);void ClearList(void);#endif /LINKEDLIST_CLASS3939链表类应用举例(例9-7)#include using namespace std;#include 9_6.h#include 9_6.cppint main()LinkedList Link;int i,k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+语言程序设计 C+ 语言程序设计 第九 群体 数据 组织
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内