ImageVerifierCode 换一换
格式:PDF , 页数:18 ,大小:292.31KB ,
资源ID:16123644      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16123644.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构习题解析第2章资料下载.pdf)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构习题解析第2章资料下载.pdf

1、2、算法设计 静态数组对象的定义,动态数组对象的定义 数组中数组元素的原地逆置 递归计算数组长度、数组中所有元素的和及平均值 在顺序表中搜索值为 item 的元素,在有序顺序表中搜索值为 item 的元素 在有序顺序表中插入新元素 item 到第 i 个位置 在有序顺序表中删除第 i 个元素 两个有序顺序表的合并,m 个有序顺序表的合并二二、难点与重点难点与重点1、作为抽象数据类型的数组:数组的定义、数组的按行顺序存储与按列顺序存储确定数组元素的三要素:行号、列号、元素值数组元素的存放地址计算2、顺序表:顺序表的定义、搜索、插入与删除顺序表搜索算法、平均比较次数的计算插入与删除算法、平均移动次

2、数的计算3、字符串:字符串的定义及其操作的实现串重载操作的定义与实现三三、教材中习题的解析教材中习题的解析282-1 设 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局;然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局,如此反复直到所有的人全部出局为止。下面要解决的 Josephus 问题是:对于任意给定的 n,s 和 m,求出这 n 个人的出局序列。请以 n=9,s=1,m=5 为例,人工模拟 Josephus 的求解过程以求得问题的解。【解答】出局人的顺序为 5,1,7,4,3,6,9,2,8。2-2 试编写一个求解 Josephus 问题

3、的函数。用整数序列 1,2,3,n 表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。然后使用 n=9,s=1,m=5,以及 n=9,s=1,m=0,或者 n=9,s=1,m=10 作为输入数据,检查你的程序的正确性和健壮性。最后分析所完成算法的时间复杂度。【解答】函数源程序清单如下:void Josephus(int A,int n,s,m)int i,j,k,tmp;if(m=0)cerr m=0 是无效的参数!endl;return;for(i=0;i 1;i-)/逐个出局,执行 n-1 次if(i=k)i=0;i=(i+m-1)%k;/寻找出局位置if(i!=k-

4、1)tmp=Ai;/出局者交换到第 k-1 位置for(j=i;j k-1;j+)Aj=Aj+1;Ak-1=tmp;for(k=0;k n/2;k+)/全部逆置,得到出局序列tmp=Ak;Ak=An-k+1;An-k+1=tmp;例:n=9,s=1,m=5012345678k=9123456789第 5 人出局,i=4k=8123467895第 1 人出局,i=0k=7234678915第 7 人出局,i=4k=6234689715第 4 人出局,i=2k=5236894715第 3 人出局,i=1k=4268934715第 6 人出局,i=1k=3289634715第 9 人出局,i=2k=

5、2289634715第 2 人出局,i=029829634715第 8 人出局,i=0逆置517436928最终出局顺序例:n=9,s=1,m=0报错信息m=0 是无效的参数!n=9,s=1,m=10012345678k=9123456789第 1 人出局,i=0k=8234567891第 3 人出局,i=1k=7245678931第 6 人出局,i=3k=6245789631第 2 人出局,i=0k=5457892631第 9 人出局,i=4k=4457892631第 5 人出局,i=1k=3478592631第 7 人出局,i=1k=2487592631第 4 人出局,i=08475926

6、31第 8 人出局,i=0逆置136295748最终出局顺序当 m=1 时,时间代价最大。达到(n-1)+(n-2)+1=n(n-1)/2 O(n2)。2-3 设有一个线性表(e0,e1,en-2,en-1)存放在一个一维数组 AarraySize中的前 n 个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前 n 个原址内容置换为(en-1,en-2,e1,e0)。【解答】template void inverse(Type A,int n)Type tmp;for(int i=0;i=(n-1)/2;i+)tmp=Ai;Ai=An-i-1;An-i-1=tmp;2-4 假定数组

7、 AarraySize中有多个零元素,试写出一个函数,将 A 中所有的非零元素依次移到数组 A 的前端 Ai(0 i arraySize)。【解答】因为数组是一种直接存取的数据结构,在数组中元素不是像顺序表那样集中存放于表的前端,而是根据元素下标直接存放于数组某个位置,所以将非零元素前移时必须检测整个数组空间,并将后面变成零元素的空间清零。函数中设置一个辅助指针 free,指示当前可存放的位置,初值为 0。先给出作为抽象数据类型数组的类声明。#include/在头文件“array.h”中#include const int DefaultSize=30;template class Array

8、/数组是数据类型相同的 n(size)个元素的一个集合,下标范围从 0 到 n-1。对数组中元素/可按下标所指示位置直接访问。private:30Type*elements;/数组int ArraySize;/元素个数public:Array(int Size=DefaultSize);/构造函数Array(const Array&x);/复制构造函数Array()delete elements;/析构函数Array&operator=(const Array&a);/数组整体赋值(复制)Type&operator (int i);/按下标访问数组元素int Length()const ret

9、urn ArraySize;/取数组长度void compact();/数组压缩void ReSize(int sz);/修改数组长度template void Array:compact()int free=0;/非零元素存放地址for(int i=0;i ArraySize;i+)/检测整个数组if(elementsi!=0)/发现非零元素elementsfree=elementsi;/前移free+;elementsi=0;2-5 顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下,对有 127 个元素的顺序表进行插入,平均需要移动多少个元素?删除一个元素,又平均需要移动

10、多少个元素?【解答】若设顺序表中已有 n=last+1 个元素,last 是顺序表的数据成员,表明最后表项的位置。又设插入或删除表中各个元素的概率相等,则在插入时因有 n+1 个插入位置(可以在表中最后一个表项后面追加),每个元素位置插入的概率为 1/(n+1),但在删除时只能在已有 n 个表项范围内删除,所以每个元素位置删除的概率为 1/n。插入时平均移动元素个数 AMN(Averagy Moving Number)为删除时平均移动元素个数 AMN 为根据上述推导,插入时平均移动 127/2=63.5 个元素,删除时平均移动(127-1)/2=63 个元素。2-6 若矩阵 Amn中的某一元素

11、 Aij是第 i 行中的最小值,同时又是第 j 列中的最大值,则称此元素为该矩阵的一个鞍点。假设以二维数组存放矩阵,试编写一个函数,确定鞍点在数组中的位置(若鞍点存在时),并分析该函数的时间复杂度。【解答】int minmax(int A ,const int m,const int n)/在二维数组 Amn中求所有鞍点,它们满足在行中最小同时在列中最大int*row=new intm;int*col=new intn;int i,j;2n21)n(n1n1)01)1n(n(1n1in1n1AMNn0i1n0i21n21)n(nn10)12)(n1)(nn11)i(nn1AMN31for(i=

12、0;i m;i+)/在各行中选最小数组元素,存于 rowirowi=Ai0;for(j=1;j n;j+)if(Aij rowi)rowi=Aij;for(j=0;j+)/在各列中选最大数组元素,存于 coljcoli=A0j;for(i=1;i colj)colj=Aij;i+)/检测矩阵,寻找鞍点并输出其位置for(j=0;j+)if(rowi=colj)cout “The saddle point is:(”i “,”j “)”endl;delete row;delete col;此算法有 3 个并列二重循环,其时间复杂度为 O(mn)。2-7 设有一个二维数组 Amn,假设 A00存放

13、位置在 644(10),A22存放位置在 676(10),每个元素占一个空间,问 A33(10)存放在什么位置?脚注(10)表示用 10 进制表示。【解答】设数组元素 Aij存放在起始地址为 Loc(i,j)的存储单元中。Loc(2,2)=Loc(0,0)+2*n+2=644+2*n+2=676.n=(676-2-644)/2=15 Loc(3,3)=Loc(0,0)+3*15+3=644+45+3=692.2-8 利用顺序表的操作,实现以下的函数。(1)从顺序表中删除具有最小值的元素并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。(2)从顺序表中

14、删除第 i 个元素并由函数返回被删元素的值。如果 i 不合理或顺序表为空则显示出错信息并退出运行。(3)向顺序表中第 i 个位置插入一个新的元素 x。如果 i 不合理则显示出错信息并退出运行。(4)从顺序表中删除具有给定值 x 的所有元素。(5)从顺序表中删除其值在给定值 s 与 t 之间(要求 s 小于 t)的所有元素,如果 s 或 t 不合理或顺序表为空则显示出错信息并退出运行。(6)从有序顺序表中删除其值在给定值 s 与 t 之间(要求 s 小于 t)的所有元素,如果 s 或 t不合理或顺序表为空则显示出错信息并退出运行。(7)将两个有序顺序表合并成一个新的有序顺序表并由函数返回结果顺序表。(8)从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。【解答】顺序表的类定义#ifndef SEQLIST_H/定义在头文件“seqlist.h”中#define SEQLIST_H#include#include template class SeqList 32private:Type*data;/顺序表的存放数组int MaxSize;/顺序表的最大可容纳项数int last;/顺序表当前已存表项的最后位置int current;/顺序表的当前指针(最近处理的表项)public:SeqLis

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1