




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
32第六章 模板与数据结构题第六章 模板与数据结构习题一、.基本概念与基础知识自测题6.1 填充题6.1.1 模板是为了实现代码的 (1) ,它把数据类型改为一个 (2) ,称为 (3) 程序设计。模板包括 (4) 和 (5) 。答案:(1)重用(2)设计参数(3)参数化(parameterize)(4)函数模板(function template)(5)类模板(class template)6.1.2 调用函数模板时,可以显式指定模板参数类型,也可以隐式进行,称为 (1) ,这是根据 (2) 来决定的。答案:(1)模板实参推演(template argument deduction)(2)一组实际类型或(和)值6.1.3 顺序查找可以用于 (1) 线性表,而对半查找可以用于 (2) 线性表。答案:(1)无序的(所有)(2)有序的6.1.4 最常见的排序方式有 (1) 、 (2) 和 (3) 。如果现有一个已排好序的线性表,在表尾添加了一个元素,采用 (4) 排序法使它重新成为有序的所需工作量最小。答案:(1)选择(2)插入(3)交换(4)交换(可利用原来的有序性)6.1.5 给出以下指针的说明方式:指向一个4元素整型数组的指针为 (1) ;指向一个返回整型数,参数为两个整型数的函数的指针 (2) ;指向一个数组的指针,而该数组元素都是指向一个返回整型指针的无参函数 (3) 。答案:(1)int(*p)4(2)int(*p)(int,int)(3)以指向6元素数组为例:int*(*)() (*p)66.2简答题6.2.1 需要编写一个对多维数组通用的算法(即各维的大小未定),怎样才能把实参多维数组的信息全部传递到函数中去?答:最佳方法是用函数模板,多维数组用模板类型参数传递,各维的大小作为参数传递。也可以用一维数组加各维的大小都作为参数传递。6.2.2 什么叫函数模板?什么叫模板函数?什么叫类模板?什么叫模板类?答:不受数据类型限制的通用型的函数使代码的可重用性大大提高。把数据类型改为一个设计参数是一个可行的方案。这种程序设计类型称为参数化(Parameterize) 程序设计。这样的软件模块由模板(Template) 构造。包括函数模板和类模板。函数模板定义如下:template 返回类型 函数名(形式参数表);/函数体模板参数主要是模板类型参数。模板类型参数代表一种潜在的内置或用户定义的类型,由关键字typename或class后加一个标识符构成。函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。由调用函数模板(functron template) 而生成的函数,称为模板函数(template function)。类模板定义如下:template class 类名;/类声明体;模板参数有两种:模板类型参数和模板非类型参数。模板类型参数(template type parameter),它代表一种类型,由关键字 typename或class后加一个标识符。模板非类型参数由一个普通的参数声明构成。模板非类型参数表示该参数名代表了一个潜在的常量。如数组类模板,可以有一个数组长度的非类型参数。为通用的类模板定义中的模板类型参数指定了具体类型而生成的类称为模板类。6.2.3 什么叫线性表?其基本操作包括哪些?其中插入一个元素的关键在哪儿?答:线性表是数据结构中的概念:每两个相邻元素之间都有直接前驱和直接后继的关系。这里除第一个元素外,其他元素有且仅有一个直接前驱,第一个元素没有前驱;除最后一个元素外,其他元素有且仅有一个直接后继,最后一个元素无后继。这样的特性称为线性关系。基本操作包括:计算表长度,寻找变量或对象x(其类型与表元素相同)在表中的位置(下标值),判断x是否在表中,删除x,将x插入列表中第i个位置,寻找x的后继,寻找x的前驱,判断表是否空,判断表是否满,取第i个元素的值等。当需要在顺序表的指定位置i插入一个数据x时,必须为它腾出这个位置,把从该位置开始向后的所有元素数据,后移一个位置,最后才插入。关键是后移时从最后一个元素开始。否则先移的数据会冲掉未移的数据。6.2.4 采用索引查找有哪些优点?它需要被查找数据有序吗?答:索引,就象一本书的目录,找到标题,再看一下页号,立即可以翻到。索引查找不要求被查找数据有序,只要求索引有序。6.2.5 简单叙述阅读理解复杂指针的方法。设Node为类,下面两个标识符fa和pa分别代表什么?Node* (*fa(int)(); Node* (*(*pa)();答:理解和构造对象说明的方法是:先撇开标识符,按从右到左的顺序逐个解释每个说明符,如果有括号则改变解释的先后,先解释括号内再解释括号外。fa是有一个整型参数的函数,其返回值是指针,该指针是指向无参函数的指针,而该无参函数的返回值是指向Node类的指针。pa是指向数组的指针,该数组的元素均为函数指针,所指向的函数无参、返回值是指向Node类的指针。 二、.编程与综合练习题6.3 使用自定义字符串类,编写求数组元素中最大值的函数模板。解:函数模板有三种应用方式:1类模板的成员函数,在模板类型参数中重载函数和运算符,直接访问私有数据成员,实现通用算法。这是标准的面向对象的方法。2函数模板处理模板类,以类模版为参数,用模板类型参数中重载的函数或运算符,实现通用算法。但调用类模板的接口函数间接访问私有数据成员,也是常见的。3函数模板处理普通数据,往往要用函数作为参数,实现通用算法。这是面向过程的方法。解:使用独立的函数模板,相对简单。#includeusing namespace std;const int n=256;class mystring/为简单只保留用到的函数char strn; /存放字符串的数组容器int maxsize; /最大可用元素数,可防止数组出界,提高健壮性int last; /已用元素数public:mystring()last=-1;maxsize=n;str0=0;cout缺省构造函数endl;mystring(char *s)/当C字符串过长,初始化时采用截尾处理last=-1;maxsize=n;dolast+;strlast=slast;while(slast!=0&lastmaxsize-1);strlast =0; /截尾处理时,必须加串结束符cout构造函数endl;mystring(mystring & ms)last=-1;maxsize=n;dolast+;strlast=ms.strlast;while(lastms.last);cout拷贝构造函数endl;mystring()cout析构函数endl;void show()/如需重载,则请参见9.3节,暂时未学到,替代方法是改用show()函数coutstrendl;mystring & operator=(char * ms);/这里重载的=是把C风格字符串赋给mystringmystring& operator=(mystring &);bool operator(mystring &);mystring & mystring:operator=(char* ms) /用C字符串赋值自定义字符串last=-1;dolast+;strlast=mslast;while(mslast!=0&lastmaxsize-1);strlast =0; /截尾处理时,必须加串结束符return *this;/这里返回值为引用,不调用拷贝构造函数mystring& mystring:operator=(mystring & ms)last=-1;dolast+;strlast=ms.strlast;while(lastms.last);cout赋值函数endl;return *this;bool mystring:operator(mystring & ms)int i=0,k;dok=stri-ms.stri;i+;while(k=0&ilast&ims.last);if(k0) return true;if(i=last&i!=ms.last) return true;return false;template Groap max(Groap *r_array,int size)/这里是一个独立的函数模板Groap max_val=r_array0;for (int i=1;isize; +i) if(max_valr_arrayi) max_val=r_arrayi;return max_val;int main()int i;char sp610=南京大学,东南大学,交通大学,清华大学,天津大学,复旦大学;mystring ms6;/ 对象数组 for(i=0;i6;i+) msi=spi;cout打印学校名称:endl;for(i=0;i6;i+) msi.show();cout按字典序查找校名:endl;(max(ms,6).show();return 0;6.4 将自定义字符串类用于对半查找的函数模板。解1:为简化,使用独立的函数模板#includeusing namespace std;const int n=256;/class mystring定义略template int BinarySearch(T *array,T & x,int size)/独立的函数模板int high=size-1 ,low=0,mid; / size 当前有序表元素数量while(low=high)mid=(low+high)/2;if(xarraymid) high=mid-1; /左缩查找区间,这里只有重载的小于号else if(arraymidx) low=mid+1;/ 右缩查找区间 else return mid;return mid;int main()/此例为了简化未用对象数组类模板int i;char sp610=东南大学,复旦大学,交通大学,南京大学,清华大学,天津大学;mystring ms6,x=交通大学,y=南京大学;for(i=0;i6;i+) msi=spi;for(i=0;i6;i+) msi.show();i=BinarySearch(ms,x,6);coutiendl;i=BinarySearch(ms,y,6);coutiendl;return 0;解2:函数模板使用成员函数(ep6_4_0.cpp)#includeusing namespace std;const int n=256;/class mystring定义略template class Orderedlistint maxsize;int last;T slistsize;public:int getlast()return last;T getslist(int k)return slistk;void putslist(T t,int k)slistk=t;Orderedlist()last=-1;maxsize=size;bool Insert(T & elem,int i);void print();int BinarySearch(T);/ 无关成员函数省略,缺省的=等不必定义;/再次指出分号不可少template bool Orderedlist:Insert(T & elem ,int i)if (ilast+1|last=maxsize-1) return false;elselast+;for (int j=last;ji;j-) slistj=slistj-1;slisti=elem;return true;template void Orderedlist:print()int i;for(i=0;i=last;i+)slisti.show();if(i%5=4) coutendl; /打印5个名称换行else coutt;coutendl;template int Orderedlist:BinarySearch(T x)/成员函数模板int high=last,low=0,mid; /size当前有序表元素数量while(low=high)mid=(low+high)/2;if(xslistmid) high=mid-1; /左缩查找区间,这里只有重载的小于号else if(slistmidx) low=mid+1;/ 右缩查找区间 else return mid;return mid;int main()const int h=8;int i;Orderedlist ordlist;mystring nh;char sph10=东南大学,复旦大学,交通大学,南京大学,清华大学,天津大学,同济大学,浙江大学;for(i=0;ih;i+) ni=spi;for(i=0;ih;i+) ordlist.Insert(ni,i); /建立顺序表cout排序表:endl;ordlist.print();mystring x(交通大学),y(东南大学);i=ordlist.BinarySearch(x);coutiendl;i=ordlist.BinarySearch(y);coutiendl;return 0;6.5 编一个冒泡排序的成员函数模板实现降序排序。可用小于比较,冒泡采用从上往下;也可用大于比较,冒泡采用从下往上。解:用小于比较,冒泡采用从上往下。使用字符串类string。#include#includeusing namespace std;template class Orderedlistint maxsize;int last;T slistsize;public:Orderedlist()last=-1;maxsize=size;void BubbleSort();bool Insert(T & elem,int i);void print();/ 无关成员函数省略,缺省的=等不必定义;/再次指出分号不可少/Insert(T & elem ,int i)和print()不再重复定义template void Orderedlist:BubbleSort()/降序bool noswap;int i,j;T temp;for (i=last;i0;i-)/从上往下冒泡,对比例6.8有何不同?noswap=true;/未交换标志为真for(j=0;ji;j+)if(slistjslistj+1)/关键字比较只用小于号!temp=slistj;slistj=slistj+1;slistj+1=temp;noswap=false;if(noswap) break;/本趟无交换,则终止算法。int main()const int h=8;int i;Orderedlist ordlist;string nh;string sph=南京大学,东南大学,交通大学,清华大学,天津大学,复旦大学,浙江大学,同济大学;for(i=0;ih;i+) ni=spi;for(i=0;ih;i+) ordlist.Insert(ni,i); /建立顺序表cout未排序表:endl;ordlist.print();ordlist.BubbleSort();cout已排序表:endl;ordlist.print();return 0;6.6 现有两个已升序排好的数组,将它们合并为一个升序排序的数组(归并),请用函数模板实现。该方法可以演变成归并排序。算法:两数组合并时,可为每个数组各安排一个指针,从第一个元素开始比较两数组对应元素,小的取下来,顺序放入新的数组;取下所指元素的指针后移,再比较,依此类推;直到其中一个数组的元素已全部放入新数组,再把另一数组余下的元素全部顺序放入新数组,归并完成。解:此处是面向对象的方法#include#includeusing namespace std;template class Orderedlistint maxsize;int last;T slistsize;public:Orderedlist()last=-1;maxsize=size;void BubbleSort();bool Insert(T & elem,int i);void print();void Merge(Orderedlist &,Orderedlist &);/ 无关成员函数省略,缺省的=等不必定义;/再次指出分号不可少/Insert(T & elem ,int i)和print()不再重复定义template void Orderedlist:BubbleSort()/升序bool noswap;int i,j;T temp;for (i=last;i0;i-)/从上往下冒泡,对比例6.8有何不同?noswap=true;/未交换标志为真for(j=0;ji;j+)if(slistj+1slistj)/关键字比较只用小于号!temp=slistj;slistj=slistj+1;slistj+1=temp;noswap=false;if(noswap) break;/本趟无交换,则终止算法。template void Orderedlist:Merge(Orderedlist & ls1,Orderedlist & ls2)int i=0,j=0,k=0;while(i=ls1.last)&(j=ls2.last)if(ls1.slistils2.slistj) slistk=ls1.slisti;i+;else slistk=ls2.slistj;j+;k+;last+;while(i=ls1.last) /复制第一个表的剩余元素slistk=ls1.slisti;i+;k+;last+;while(j=ls2.last) /复制第二个表的剩余元素slistk=ls2.slistj;j+;k+;last+;int main()const int h=15;int i,h1=8,h2=5;Orderedlist ordlist,ordlist1,ordlist2;string nh,mh;char sp1h10=南京大学,东南大学,交通大学,清华大学,天津大学,复旦大学,浙江大学,同济大学;for(i=0;ih1;i+) ni=sp1i;for(i=0;ih1;i+) ordlist1.Insert(ni,i); /建立顺序表cout未排序表:endl;ordlist1.print();ordlist1.BubbleSort();cout已排序表:endl;ordlist1.print();char sp2h10=南开大学,吉林大学,中山大学,武汉大学,科技大学;for(i=0;ih2;i+) mi=sp2i;for(i=0;ih2;i+) ordlist2.Insert(mi,i); /建立顺序表cout未排序表:endl;ordlist2.print();ordlist2.BubbleSort();cout已排序表:endl;ordlist2.print();ordlist.Merge(ordlist1,ordlist2);cout归并已排序表:endl;ordlist.print();return 0;6.7 希尔排序(shell sort),又称缩小增量排序(diminishing increment sort)。其思想如下:设线性表L长度为n,取增量gap=n/2,即以L0和Lgap为一组,L1和Lgap+1为一组,L2和Lgap+2为一组,Ln-gap和Ln为一组,分别进行插入排序。再取gap=gap/2,则分组成为L0,Lgap,L2gap,为一组,L1,Lgap+1,L2gap+1,为一组,等等,分别进行插入排序。直到gap=1,这时分组成为整个表,并只有一个组,再插入排序,完成全部任务。参见下图:全部采用函数模板,包括希尔插入子程序。分组直接用增量控制在原线性表中进行插入排序。解:本解希尔排序是成员函数,是C+的标准用法,标准模板库(STL)就是如此用的。是纯面向对象的方法#include#includeusing namespace std;template class Orderedlistint maxsize;int last;T slistsize;void Shellinsert(const int);public:int getlast()return last;T getslist(int k)return slistk;void putslist(T t,int k)slistk=t;Orderedlist()last=-1;maxsize=size;bool Insert(T & elem,int i);void print();void Shellsort();/ 无关成员函数省略,缺省的=等不必定义;/再次指出分号不可少template bool Orderedlist:Insert(T & elem ,int i)if (ilast+1|last=maxsize-1) return false;elsefor (int j=last;ji;j-) slistj=slistj-1;slisti=elem;last+;return true;template void Orderedlist:print()int i;for(i=0;i=last;i+)coutslisti;if(i%5=4) coutendl;else coutt;coutendl;template void Orderedlist:Shellsort()/成员函数int gap=(last+1)/2;while(gap)Shellinsert(gap);/一趟排序gap/=2;template void Orderedlist:Shellinsert(const int gap)int i,j;T temp;/注意每一趟排序包含若干子序列,其中第一个子序列第一个元素是0号,第二个元素是gap号,/插入排序认为单个元素是排好序的,所以从每个子序列的第二个元素开始插入排序。for(i=gap;i=gap&tempslistj-gap)/升序slistj=slistj-gap;/找的元素,只要比temp大,就后移,空出位置j-=gap;slistj=temp;/将temp插入正确的空位int main()const int h=8;int i;Orderedlist ordlist;string nh;char sph10=南京大学,东南大学,交通大学,清华大学,天津大学,复旦大学,浙江大学,同济大学;for(i=0;ih;i+) ni=spi;for(i=0;ih;i+) ordlist.Insert(ni,i); /建立顺序表cout未排序表:endl;ordlist.print();ordlist.Shellsort();cout已排序表:endl;ordlist.print();return 0;解2:这里希尔排序是独立的函数,而线性类模板作为形参,也是一种常见的用法。#include#includeusing namespace std;template class Orderedlistint maxsize;int last;T slistsize;public:int getlast()return last;T getslist(int k)return slistk;void putslist(T t,int k)slist
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 狼疮肾炎课件
- 牵引变电站课件
- 农业废弃物资源化利用项目技术创新与产业协同创新研究报告
- 牧童的课件教学课件
- 辽宁工厂面试题库及答案
- 粮食储存面试题库及答案
- 乐清国企面试题库及答案
- 篮球教师面试题库及答案
- 跨境电商面试题库及答案
- 安全教育培训财务岗位课件
- 医院门诊急救体系构建
- 2025年箱变考试题库
- 2025年G2电站锅炉司炉理论考试试题(1000题)含答案
- 第3课 学习有方法 第2课时(课件)2025-2026学年道德与法治三年级上册统编版
- 2025年幼儿园膳食工作计划
- 2025年中国电信校招试题及答案
- 《建筑工程资料管理》高职土建类相关专业全套教学课件
- 消防队伍管酒治酒课件
- 2025年中铁特货物流股份有限公司招聘笔试参考题库附带答案详解
- 职业等级考评员培训课件
- 2025至2030全球及中国细胞培养行业产业运行态势及投资规划深度研究报告
评论
0/150
提交评论