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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构本科期末综合练习五算法设计题.docx

1、数据结构本科期末综合练习五算法设计题数据结构(本科)期末综合练习五(算法设计题)1. 设有一个线性表 (e0, e1, , en-2, en-1) 存放在一个一维数组AarraySize中的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n个元素内容置换为 (en-1, en-2, , e1, e0)。函数的原型为:template void inverse ( Type A , int n );2. 试编写一个函数,在一个顺序表A中找出具有最大值和最小值的整数。函数的原型如下所示,原型的参数表中给出顺序表对象为A,通过算法执行,从参数表中的引用参数Max中得到表中的最大整

2、数,Min中得到表中的最小整数。注意,函数中可使用顺序表的两个公有函数:Length( ) 求表的长度;getData(int k) 提取第k个元素的值。#include “SeqList.h” template void FindMaxMin ( SeqList& A, int& Max, int& Min );3. 设有两个整数类型的顺序表A(有 m个元素)和B(有n个元素),其元素均以升序排列。试编写一个函数,将这两个顺序表合并成一个顺序表C,要求C的元素也以升序排列(表中允许元素重复)。 函数的原型如下所示。原型中的参数表给出参加运算的三个顺序表A、B与C。从C中得到执行结果。函数中用

3、到顺序表的4个公有函数: Length( ) 求表的当前长度; maxLength( ) 求表的最大允许长度; getData(int k) 提取第k个元素的值; setData(int k, int val) 修改第k个元素的值为val。 template void merge(SeqList& A, SeqList& B, SeqList& C);4. 编写一个函数frequency,统计在一个输入字符串中各个不同字符出现的频度。函数返回两个数组:A 记录字符串中有多少种不同的字符,C 记录每一种字符的出现次数。此外,还要通过整数k返回不同字符数。 函数的原型如下所示: #include

4、#include void frequency( char* s, char A , int C , int &k );5. 根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。要求新生成的链表中不允许有重复元素,并要求返回新表的表头指针。填写程序中缺少的部分。ListNode * Merge ( ListNode *L1, ListNode *L2 ) /根据两个有序单链表L1和L2, 生成一个新的有序单链表ListNode *p1 = L1-link, *p2 = L2-link; ListNode *first=new ListNode;ListNode *p=first;wh

5、ile ( p1 != NULL & p2 != NULL ) /当两个链表都未检测完时while ( p1 != NULL ) /继续处理p1链表中剩余的结点。p=p-link = new ListNode; p-data = p1-data; p1 = p1-link; while ( p2 != NULL ) /继续处理p2链表中剩余的结点。p=p-link = new ListNode; p-data = p2-data; p2 = p2-link; p-link = NULL; return first-link;6. 假定在一个带表头结点的单链表L中所有结点的值按递增顺序排列,试补

6、充下面函数,功能是删除表L中所有其值大于等于min,同时小于等于max的结点。 void rangeDelete ( ListNode * L, ElemType min, ElemType max ) ListNode *q = L, *p = L-link; 7. 已知一个带表头附加结点的单链表LA中包含有三类字符:数字字符;字母字符;其他字符。试编写一个while循环补充下面Separate函数,其功能是构造三个新的单链表,使LA,LB,LC单链表各自指向同一类字符。要求使用原表的结点空间。Separate函数将调用如下两个函数: bool isdigit(char ch); /判断字符

7、是否为数字,若是则返回“真”,否则返回“假” bool isalpha(char ch); /判断字符是否为字母,若是则返回“真”,否则返回“假” void Separate ( ListNode *& LA, ListNode *& LB, ListNode *& LC ) /原来的单链表是LA, 新的三个单链表是LA,LB,LC,它们均需要带表头附加结点 ListNode *pa=LA; ListNode *pb=new ListNode, *pc=new ListNode; LB=pb; LC=pc; ListNode *p=LA-link; /p指向待处理的结点 /添加的while循环

8、位置 pa-link = NULL; pb-link = NULL; pc-link = NULL; /请把while循环内容写在此行下面8. 已知first为单链表的表头指针, 结点结构为(data,link),试根据下列每个函数声明和算法功能写出递归算法。 int Max(LinkNode *f); /递归算法: 求链表中的最大值,若链表为空则返回0 int Num(LinkNode *f); /递归算法: 求链表中结点个数9. 请分别写出在循环队列上进行插入和删除操作的算法。 循环队列定义如下: struct CyclicQueue ElemType elemM; /M为已定义过的整型常

9、量,表示队列长度 int rear,front ; / rear指向队尾元素后一个位置,front 指向队头元素 int tag ; / 当 front=rear且tag=0时,队列空,当front=rear且tag=1时,队列满 ; bool EnCQueue( CyclicQueue& Q, ElemType x ) / Q 是一个循环队列,最多可存储M个元素,若队列不满, /将x插入至队尾并返回 true;否则返回 false。 bool DelCQueue( CyclicQueue& Q, ElemType& x ) / Q 是一个循环队列,若队列不空,则删除队头元素并由 x 带回,

10、/且返回 true,否则返回 false 10. Q 是一个由其尾指针和队列长度标识的循环队列,请写出插入和删除一个元素的算法。 struct CyclicQueue / 循环队列定义 ElemType elemM; /M为已定义过的整型常量 int rear; / rear指向队尾元素的后一个位置 int length; / length 指示队列中元素个数 ; bool EnCQueue( CyclicQueue& Q, ElemType x ) /Q是一个循环队列,若队列不满,则将x插入并返回true;否则返回false bool DelCQueue( CyclicQueue& Q, E

11、lemType& x ) /Q 是一个循环队列,若队列不空,则删除队头元素并由x带回, /且返回true;否则返回false 11. 计算多项式 Pn (x) = a0 xn + a1 xn-1 + a2 xn-2 + + an-1 x + an 通常使用的方法是一种递推的方法。它可以描述为如下的递推形式: pn (x) = x * pn-1 (x) + an (n0)此处 Pn-1 (x) = a0 xn-1 + a1 xn-2 + + an-2 x + an-1 P0=an这也是问题的递归形式。多项式的递归求解形式为:poly(x, 0) = A0poly(x, n) = x * poly

12、(x, n-1) + An, n 0试编写一个递归函数,计算这样的多项式的值。float poly ( float x, float A, int n ) 12. 从n个自然数1, 2, 3, , n中任取k个数的所有组合数用C(n, k) 表示。求C(n, k)的递归公式为 0 (n=0, n0, k=0或k=n) n (n0, k=1) C(n-1, k) + C(n-1, k-1) (n1, 0kn)试写出计算C(n, k)的递归函数:int combine ( int n, int k) 13. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode

13、 char data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域。根据下面函数声明编写出求一棵二叉树高度的算法,该高度由函数返回。假定树根的层次为0,参数BT初始指向这棵二叉树的根结点。 int BTreeHeight(BinTreeNode* BT); 14. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode char data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据

14、下面函数声明编写出求一棵二叉树中结点总数的算法,该总数值由函数返回。假定参数BT初始指向这棵二叉树的根结点。 int BTreeCount(BinTreeNode* BT); 15. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode char data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树中叶子结点总数的算法,该总数值由函数返回。假定参数BT初始指向这棵二叉树的根结点。 int BTreeLeafCount(BinTreeN

15、ode* BT); 16. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode char data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出删除一棵二叉树中所有结点的算法,并使树根指针为空。假定引用参数BT初始指向这棵二叉树的根结点。 void ClearBTree(BinTreeNode*& BT); 17. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode char data; BinTreeNo

16、de *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出判断两棵二叉树是否相等的算法,若相等则返回1否则返回0。算法中参数T1和T2为分别指向这两棵二叉树根结点的指针。当两棵树的结构完全相同并且对应结点的值也相同时才被认为相等。 int BTreeEqual(BinTreeNode* T1,BinTreeNode* T2); 18. 已知二叉树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode char data; BinTreeNode *left, *right;其中dat

17、a为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出交换一棵二叉树中所有结点的左、右指针域值的算法,算法中参数BT初始指向这棵二叉树的根结点。 void BTreeSwop(BinTreeNode* BT) 19. 已知二叉树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode char data; BinTreeNode *left, *right; 其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出复制一棵二叉树的算法,并返回复制得到的二叉树的根结点指针。算法中参数

18、BT初始指向待复制二叉树的根结点。 BinTreeNode* BTreeCopy(BinTreeNode* BT); 20. 已知二叉树中的结点类型BinTreeNode定义为: struct BinTreeNode char data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出从一棵二叉树中求出结点值大于X的结点个数的算法,并返回所求结果。算法中参数BT初始指向一棵二叉树的根结点。 int BTreeCount(BinTreeNode* BT, ElemType x); 21. 假

19、定元素类型为ElemType的一维数组Rn中保存着按关键码升序排列的n个记录,记录的关键码域key的类型为KeyType,试按照下面的函数声明编写一个非递归算法,从一维数组Rn中折半搜索出关键码等于K的记录,若搜索成功则返回记录位置(即元素下标),否则返回-1。 int BinSearch(ElemType R, int n, KeyType K); 22. 已知二叉搜索树中的结点类型BinTreeNode定义为: struct BinTreeNode ElemType data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右

20、子女结点的指针域。参数BST指向一棵二叉搜索树的根结点。试根据下面的函数声明编写一个非递归算法,从BST树中搜索出具有item参数值的结点,若搜索成功则返回该结点的地址,否则返回NULL。 BinTreeNode* Find(BinTreeNode* BST, const ElemType& item); 23. 已知二叉搜索树中的结点类型BinTreeNode定义为: struct BinTreeNode ElemType data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域。参数BST指向一棵二叉搜索树

21、的根结点。试根据下面的函数声明编写一个递归算法,向BST树中插入值为item的结点,若树中不存在item结点则进行插入并返回1表示插入成功,若树中已存在item结点则不插入并返回0表示插入失败。 Int Insert(BinTreeNode*& BST, const ElemType& item); 24. 已知二叉搜索树中的结点类型BinTreeNode定义为: struct BinTreeNode ElemType data; BinTreeNode *left, *right;其中data为结点值域,left和right分别为指向左、右子女结点的指针域。参数BST指向一棵二叉搜索树。试根

22、据下面的函数声明编写一个非递归算法,向BST树中插入值为item的结点,若树中不存在item结点则进行插入并返回1表示插入成功,若树中已存在item结点则不插入并返回0表示插入失败。 Int Insert(BinTreeNode*& BST, const ElemType& item); 25. 有一种简单的排序算法,叫做计数排序(count sorting)。这种排序算法对一个数据互不相同的表进行排序,并将排序结果存放到另一个新表中。针对表中的每个数据,计数算法都要扫描一趟表,统计出表中有多少个数据比它小。假设针对某个数据,统计出的计数值为c,则这个数据在新表中的合适存放位置应为c。 在下面

23、的函数模板countsort中,数组src中存放的是要排序的数据;数组dest用于存放排序的结果;size为这两个数组的大小。请补充完整countsort的函数体中遗漏部分,使其能够完成计数排序任务。templatevoid countsort(T src, T dest, int size) int i, j, c; for(i=0; isize; i+) /此处遗漏了若干语句,请将这些语句插入到下面 destc=srci; 26. 假定函数reArrange通过扫描一遍data数组达到重新排列数据的目的, 使得所有负值数据位于所有非负值和0值数据之前。请补充完整reArrange函数体中遗

24、漏部分,使其能够完成所要求的功能。(提示:从两端向中间扫描)templatevoid reArrange(T data,int size) int i=0,j=size-1; T temp; while(ij) /此处遗漏了若干语句,请将它们插入到下面 算法设计题参考解答1. template void inverse(Type A, int n) Type tmp; /变量名任意 for(int i=0; i=(n-1)/2; i+) /或把i=(n-1)/2改为in/2 tmp=Ai; Ai=An-i-1; An-i-1=tmp; 2. #include “SeqList.h”templa

25、te void FindMaxMin ( SeqList& A, int& Max, int& Min ) Max = Min = A.getData(0); for ( int i = 1; i Max ) Max = A.getData(i); else if ( A.getData(i) Min ) Min = A.geyData(i); 3. templatevoid merge(SeqList& A, SeqList& B, SeqList& C) int m=A.Length(), n=B.Length(), mpn=m+n; if(mpnC.maxLength() cerr“合并

26、后表的长度超出表C的最大允许长度”endl; exit(1); int i=0, j=0, k=0, av=A.getData(i), bv=B.getData(j); while(im & jn) if(av=bv)C.setData(k+, bv); bv=B.getData(+j); if(im) while(kmpn)C.setData(k+, av); av=A.getData(+i); else while(kmpn)C.setData(k+, bv); bv=B.getData(+j); 4. #include #include string1.hvoid frequency(

27、char* s, char A , int C , int &k ) int i, j, len =strlen(s); if ( !len ) cout The string is empty. endl; k = 0; return; A0 = s0; C0 = 1; k = 1; for ( i = 1; i len; i+ ) Ci = 0; for ( i = 1; i len; i+ ) for ( j = 0; j link = new ListNode; if ( p1-data = p2-data ) p-data = p1-data; p1 = p1-link; p2 =

28、p2-link; else if ( p1-data data ) p-data = p1-data; p1 = p1-link; else p-data = p2-data; p2 = p2-link; 6. while ( p != NULL) /2分 if(p-data = min & p-data link=p-link; delete p; p=q-link; /4分 else q=p; p=p-link; /2分 7. while(p!=NULL) if(isdigit(p-data) pa-link=p; pa=p; else if(isalpha(p-data) pb-link=p; pb=p; else pc-link=p; pc=p; p=p-link; 8. int Max(LinkNode *f) /递归算法: 求链表中的最大值 if(f=NULL) return 0; if(f-link=NULL) return f-data; int temp=Max(f-link); if

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

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