1、1数据结构(本科)期末综合练习(算法设计题)1. 设有一个线性表 (e0, e1, , en-2, en-1) 存放在一个一维数组 AarraySize中的前 n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前 n个元素内容置换为 (e n-1, en-2, , e1, e0)。函数的原型为:template void inverse ( Type A , int n );2. 试编写一个函数,在一个顺序表 A中找出具有最大值和最小值的整数。函数的原型如下所示,原型的参数表中给出顺序表对象为 A,通过算法执行,从参数表中的引用参数 Max中得到表中的最大整数,Min 中得到表中
2、的最小整数。注意,函数中可使用顺序表的两个公有函数:Length( ) 求表的长度;getData(int k) 提取第 k个元素的值。#include “SeqList.h”template void FindMaxMin ( SeqList3. 设有两个整数类型的顺序表 A(有 m个元素)和 B(有 n个元素) ,其元素均以升序排列。试编写一个函数,将这两个顺序表合并成一个顺序表 C,要求 C的元素也以升序排列(表中允许元素重复) 。函数的原型如下所示。原型中的参数表给出参加运算的三个顺序表 A、B 与 C。从 C中得到执行结果。函数中用到顺序表的 4个公有函数:Length( ) 求表的
3、当前长度;maxLength( ) 求表的最大允许长度;getData(int k) 提取第 k个元素的值;setData(int k, int val) 修改第 k个元素的值为 val。templatevoid merge(SeqList4. 编写一个函数 frequency,统计在一个输入字符串中各个不同字符出现的频度。函数返回两个数组:A 记录字符串中有多少种不同的字符,C 记录每一种字符的出现次数。此外,还要通过整数 k返回不同字符数。函数的原型如下所示:#include #include 2void frequency( char* s, char A , int C , int 5
4、. 根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。要求新生成的链表中不允许有重复元素,并要求返回新表的表头指针。填写程序中缺少的部分。ListNode * Merge ( ListNode *L1, ListNode *L2 ) /根据两个有序单链表 L1和 L2, 生成一个新的有序单链表ListNode *p1 = L1-link, *p2 = L2-link; ListNode *first=new ListNode;ListNode *p=first;while ( p1 != NULL p-data = p1-data; p1 = p1-link;while ( p2
5、!= NULL ) /继续处理 p2链表中剩余的结点。p=p-link = new ListNode; p-data = p2-data; p2 = p2-link;p-link = NULL; return first-link;6. 假定在一个带表头结点的单链表 L中所有结点的值按递增顺序排列,试补充下面函数,功能是删除表 L中所有其值大于等于 min,同时小于等于 max的结点。void rangeDelete ( ListNode * L, ElemType min, ElemType max ) ListNode *q = L, *p = L-link; 37. 已知一个带表头附加结
6、点的单链表 LA中包含有三类字符:数字字符;字母字符;其他字符。试编写一个 while循环补充下面 Separate函数,其功能是构造三个新的单链表,使 LA,LB,LC单链表各自指向同一类字符。要求使用原表的结点空间。Separate 函数将调用如下两个函数:bool isdigit(char ch); /判断字符是否为数字,若是则返回“真” ,否则返回“假”bool isalpha(char ch); /判断字符是否为字母,若是则返回“真” ,否则返回“假”void Separate ( ListNode *ListNode *pb=new ListNode, *pc=new ListNo
7、de;LB=pb; LC=pc;ListNode *p=LA-link; /p指向待处理的结点/添加的 while循环位置pa-link = NULL; pb-link = NULL; pc-link = NULL;/请把 while循环内容写在此行下面8. 已知 first为单链表的表头指针, 结点结构为(data,link) ,试根据下列每个函数声明和算法功能写出递归算法。int Max(LinkNode *f); /递归算法: 求链表中的最大值,若链表为空则返回 0int Num(LinkNode *f); /递归算法: 求链表中结点个数49. 请分别写出在循环队列上进行插入和删除操作的
8、算法。循环队列定义如下:struct CyclicQueue ElemType elemM; /M为已定义过的整型常量,表示队列长度int rear,front ; / rear指向队尾元素后一个位置,front 指向队头元素int tag ; / 当 front=rear 且 tag=0时,队列空,当 front=rear且 tag=1时,队列满;bool EnCQueue( CyclicQueue /M为已定义过的整型常量5int rear; / rear指向队尾元素的后一个位置int length; / length 指示队列中元素个数;bool EnCQueue( CyclicQueu
9、efor(i=0; ivoid reArrange(T data,int size)int i=0,j=size-1;T temp;while(i void inverse(Type A, int n)10Type tmp; /变量名任意for(int i=0; i void FindMaxMin ( SeqListfor ( int i = 1; i Max ) Max = A.getData(i);else if ( A.getData(i) void merge(SeqListif(mpnC.maxLength()cerr=bv)C.setData(k+, bv); bv=B.getDa
10、ta(+j);if(i#include “string1.h“void frequency( char* s, char A , int C , int if ( !len ) cout link = new ListNode;if ( p1-data = p2-data ) p-data = p1-data; p1 = p1-link; p2 = 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)
11、 /2分if(p-data = min 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);i
12、f(f-datatemp) return f-data; else return temp;int Num(LinkNode *f); /递归算法: 求链表中结点个数if(f=NULL) return 0;return 1+Num(f-link);9. / 将 x插入至队尾12if (Q.rear = Q.front Q.elemQ.rear = x;Q.rear = (Q.rear+1) % M;if (Q.rear = Q.front) Q.tag = 1;return true;/ 删除队头元素if (Q.front = Q.rear x = Q.elemQ.front;Q.front
13、= (Q.front+1) % M;if (Q.front = Q.rear) Q.tag = 0;return true;10. /将 x插入至队尾 if(Q.length=M) return false;Q.elemQ.rear=x;Q.rear=(Q.rear+1)%M;Q.length+;return true;/删除队头元素if(Q.length=0) return false;x=Q.elem(Q.rear-Q.length+M)%M;Q.length-;return true;11. float poly ( float x, float A , int n ) if ( ! n
14、 ) return A0; else return x * poly( x, A, n-1 ) + An; 12. int combine (int n, int k)if(nleft); /计算右子树的高度int h2=BTreeHeight(BT-right); /返回树的高度if(h1h2) return h1+1; else return h2+1; 说明:函数体中的两个 else可以没有14. int BTreeCount(BinTreeNode* BT)if(BT=NULL)return 0; else return BTreeCount(BT-left)+BTreeCount(B
15、T-right)+1; 15. int BTreeLeafCount(BinTreeNode* BT)if(BT=NULL) return 0; else if(BT-left=NULL else return BTreeLeafCount(BT-left)+BTreeLeafCount(BT-right); 说明:函数体中的两个 else可以没有16. void ClearBTree(BinTreeNode* /递归删除右子树ClearBTree(BT-right); /回收根结点delete BT; 14/置根指针为空BT=NULL; 17. int BTreeEqual(BinTreeN
16、ode* T1,BinTreeNode* T2)/若两棵树均为空则返回 1表示相等if(T1=NULL /若一棵为空一棵不为空则返回 0表示不等else if(T1=NULL | T2=NULL) return 0; /若根结点值相等并且左、右子树对应相等则两棵树相等else if(T1-data=T2-data /若根结点值不等或左、右子树对应不等则两棵树不等elsereturn 0; 另一个参考答案:int BTreeEqual(BinTreeNode* T1,BinTreeNode* T2)/若两棵树均为空或实际上是同一棵树时返回 1表示相等if(T1=T2) return 1; /若一
17、棵为空一棵不为空则返回 0表示不等if(T1=NULL | T2=NULL) return 0; /若根结点值不等返回 0表示不等if(T1-data!=T2-data) return 0; /若根结点值相等则两棵树是否相等取决于它们的左、右子树是否对应相等return BTreeEqual(T1-left, T2-left) 18. void BTreeSwop(BinTreeNode* BT)if(BT!=NULL) /交换左右子女指针域的值 BinTreeNode* pt=BT-left; BT-left=BT-right;BT-right=pt; /对左子树进行同样处理15BTreeS
18、wop(BT-left); /对右子树进行同样处理BTreeSwop(BT-right); 19. BinTreeNode* BTreeCopy(BinTreeNode* BT)if(BT=NULL) return NULL; else /得到新结点BinTreeNode* pt=new BinTreeNode; /复制根结点值pt-data=BT-data; /复制左子树pt-left=BTreeCopy(BT-left); /复制右子树pt-right=BTreeCopy(BT-right); /返回新树的树根指针return pt;说明:函数体中的 else可以没有20. /统计出二叉树
19、中大于给定值 x的结点个数,该统计值由函数返回int BTreeCount(BinTreeNode* BT, ElemType x)if(BT=NULL) return 0; else if( BT-datax) return BTreeCount( BT-left, x)+BTreeCount( BT-right, x)+1; elsereturn BTreeCount( BT-left, x)+BTreeCount( BT-right, x); /3分说明:函数体中的两个 else可以没有21. int BinSearch(ElemType R, int n, KeyType K)int
20、low=0, high=n-1; while(lowdata) return BST; else if(itemdata) BST=BST-left; else BST=BST-right; return NULL; 说明:函数体中第一个 else可以没有23. int Insert(BinTreeNode*p-data=item; p-left=p-right=NULL;BST=p;return 1;else if(item=BST-data) return 0; else if(itemdata)return Insert(BST-left, item);else Insert(BST-r
21、ight, item);说明:函数体中的三个 else可以没有24. int Insert(BinTreeNode* while(t!=NULL) 17parent=t;if(item=t-data) return 0;else if(itemdata) t=t-left;else t=t-right;/建立值为 item,左、右指针域为空的新结点 BinTreeNode* p=new BinTreeNode;p-data=item; p-left=p-right=NULL;/将新结点插入到二叉搜索树中的确定位置上if(parent=NULL) BST=p; else if(itemdata) parent-left=p; else parent-right=p; 说明:while 循环体中的第一个 else可以没有25. c=0; for(j=0; j=0 if(ij) temp=dataj; dataj=datai; datai=temp; i+; j-;