1、1根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。要求新生成的链表中不允许有重复元素。算法如下ListNode * Merge ( ListNode * L1, ListNode * L2 ) /根据两个带表头结点的有序单链表 L1 和 L2, 生成一个新的有序单链表ListNode *first = new ListNode;ListNode *p1 = L1-link, *p2 = L2-link, *p = first, *q;while ( p1 != NULL if ( p1-data = p2-data ) q-data = p1-data; p2 = p2-link
2、; p1 = p1-link; else if ( p1-data data ) q-data = p1-data; p1 = p1-link; else q-data = p2-data; p2 = p2-link; p-link = q; p = q;while ( p1 != NULL ) q = new ListNode; q-data = p1-data; p1 = p1-link;p-link = q; p = q;while ( p2 != NULL ) q = new ListNode; q-data = p2-data; p2 = p2-link;p-link = q; p
3、= q;p-link = NULL; return first;2设有一个线性表 (e0, e1, , en-2, en-1) 存放在一个一维数组 Aarraysize中的前 n 个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前 n 个原址内容置换为 (en-1, en-2, , e1, e0)。数组原地逆置算法参数表中给出数组 A 及指定的数组中前 n 个元素,函数执行后从 A 中得到数组原地逆置后的结果。Template void inverse ( T A , int n ) T tmp;for ( int I = 0; I void merge ( SeqListif
4、( mpn C.maxLength( ) ) cerr link;ListNode * pa = LA, * pb = LB, * pc = LC;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;pa-link = NULL; pb-link = NULL; pc-link = NULL;5一颗具有 n 个结点的完全二叉树以顺序方式存储在数组
5、 A 中,设计一个算法构造该二叉树的二叉链存储结构。算法如下void ctree(BTNode *else t=(BTNode*)malloc(sizeof(BTNode);t-data=ai-1;ctree(t-lchild,a,2*i,n);ctree(t-rchild,a,2*i+1,n);6编写一个算法 frequency,统计在一个输入字符串中各个不同字符出现的频度。算法返回两个数组:A 记录字符串中有多少种不同的字符,C 记录每一种字符的出现次数。此外,还要返回不同字符数。求输入字符串中各种不同字符出现频度的算法由于需要返回多种信息,参数表中引入引用参数:A 中记录字符串中有多少种
6、不同的字符,C 中记录每一种字符的出现次数, k 返回不同字符数。#include #include “string1.h“void frequency( Stringif ( !len ) cout leftChild ); /计算左子树的高度,int h2 = BTreeHeight (BT-rightChild ); /计算右子树的高度, if ( h1 h2 ) return h1+1; else return h2+1; /返回树的高度, 8已知二叉树中的结点类型用 BinTreeNode 表示,被定义为 :struct BTreeNode char data; BinTreeNod
7、e *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树中结点总数的算法,该总数值由函数返回。假定参数 BT初始指向这棵二叉树的根结点。Int BTreeCount ( BinTreeNode* BT );算法如下int BTreeCount ( BinTreeNode* BT ) if ( BT = NULL ) return 0; else return BTreeCount ( BT-leftChild ) + BTreeCount ( BT-ri
8、ghtChild ) + 1;9已知二叉树中的结点类型用 BinTreeNode 表示,被定义为 :struct BinTreeNode char data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树中叶子结点总数的算法,该总数值由函数返回。假定参数 BT 初始指向这棵二叉树的根结点。 Int BTreeLeafCount ( BinTreeNode* BT );算法如下int BTreeLeafCount ( Bin
9、TreeNode* BT ) if ( BT = NULL ) return 0; else if (BT-leftChild = NULL else return BTreeLeafCount ( BT-leftChild ) + BTreeLeafCount ( BT-rightChild ); 10已知二叉树中的结点类型用 BinTreeNode 表示,被定义为 :struct BinTreeNode char data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右
10、子女结点的指针域,根据下面函数声明编写出删除一棵二叉树中所有结点的算法,并使树根指针为空。假定引用参数 BT 初始指向这棵二叉树的根结点。 Void ClearBinTree ( BinTreeNode*算法如下void ClearBinTree ( BinTreeNode* /递归删除左子树,ClearBinTree ( BT-rightChild ); /递归删除右子树, delete BT; /回收根结点,BT = NULL; /置根指针为空, 11已知二叉树中的结点类型用 BinTreeNode 表示,被定义为 :struct BinTreeNode char data; BinTre
11、eNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域,根据下面函数声明编写出复制一棵二叉树的算法,并返回复制得到的二叉树的树根指针。算法中参数 BT 初始指向待复制二叉树的根结点。 BinTreeNode* BTreeCopy ( BinTreeNode* BT );算法如下BinTreeNode* BtreeCopy ( BinTreeNode* BT ) if ( BT = NULL ) return NULL; /1 分else BinTreeNode* pt = new
12、 BinTreeNode; /得到新结点,pt-data = BT-data; /复制根结点值, pt-leftChild = BtreeCopy ( BT-leftChild ); /复制左子树, pt-rightChild = BTreeCopy ( BT-rightChild ); /复制右子树, return pt; /返回新树的树根指针, 12已知二叉树中的结点类型用 BinTreeNode 表示,被定义为 :struct BinTreeNode char data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftCh
13、ild 和 rightChild 分别为指向左、右子女结点的指针域,根据下面函数声明编写出从一棵二叉树中求出结点值大于 x 的结点个数的算法,并返回所求结果。算法中参数 BT 初始指向二叉树的根结点。 Int BTreeCount ( BinTreeNode* BT, ElemType x );算法如下/统计出二叉树中大于给定值 x 的结点个数,该统计值由函数返回int BtreeCount ( BinTreeNode* BT, ElemType x ) if ( BT = NULL ) return 0; else if ( BT-data x ) return BtreeCount ( B
14、T-leftChild, x ) + BtreeCount ( BT-rightChild, x ) + 1;elsereturn BtreeCount ( BT-leftChild, x ) + BtreeCount ( BT-rightChild, x );13试编写函数用邻接表存储结构实现template int AdjTable :GetFirstNeighbor ( int v );/给出顶点位置为 v 的第一个邻接顶点的位置,如果找不到,则函数返回 -1算法实现如下template int AdjTable :GetFirstNeighbor ( int v ) /给出顶点位置为
15、v 的第一个邻接顶点的位置,如果找不到,则函数返回 -1if ( v != -1 ) Edge *p = NodeTable (v).adj; if ( p != NULL ) return p-dest; return 1;14试编写函数用邻接表存储结构实现template int AdjTable :GetNextNeighbor ( int v, int w );给出顶点 v 的邻接顶点 w 的下一个邻接顶点的位置,若没有下一个邻接顶点,则函数返回-1算法实现如下template int AdjTable :GetNextNeighbor ( int v, int w ) /*给出顶点
16、v 的邻接顶点 w 的下一个邻接顶点的位置,若没有下一个邻接顶点,则函数返回-1*/if ( v != -1 ) Edge * p = NodeTablev.adj;while ( p != NULL ) if (p-dest = w else p = p-link;return 1;15假定元素类型为 ElemType 的一维数组 Rn 中保存着按关键码升序排列的 n 个对象,对象的关键码域 key 的类型为 KeyType,试按照下面的函数声明编写一个非递归算法,从一维数组 Rn中用折半搜索法找出关键码等于 k 的对象,若搜索成功则返回对象位置(即元素下标) ,否则返回-1。Int Bin
17、Search ( ElemType R , int n, KeyType k );算法如下:int BinSearch ( ElemType R , int n, KeyType k ) int low = 0, high = n-1; /赋初值 2 分while ( low data ) return BST; /成功返回 2 分else if ( x data )BST = BST-leftChild; /向左孩子查找 2 分else BST = BST-rightChild; /向右孩子查找 2 分return NULL; /失败返回 1 分17试设计一个算法,改造一个带表头结点的双向循
18、环链表,所有结点的原有次序保持在各个结点的右链域 rLink 中,并利用左链域 lLink 把所有结点按照其值从小到大的顺序连接起来。算法如下void OrderedList ( DblNode * L ) /利用左链域 llink 把所有结点按照其值从小到大的顺序连接起来DblNode * endp = L, * pr, * p, *s, *q = L-llink;s = q-llink; q-llink = endp; /2 分while ( s != endp ) pr = endp; p = pr-llink; /2 分while ( p != endp )if ( p-data s-
19、data ) break; else pr = p; p = p-llink; q = s-llink; pr-llink = s; s-llink = p; /3 分s = q; /1 分18编写一个程序实现直接插入排序算法。void InsertSort(RecType R,int n) /*对 R0n-1按递增有序进行直接插入排序*/ int i,j,k;RecType tmp;for (i=1;i=0 /*定义关键字类型*/typedef char InfoType10;typedef struct /*记录类型 */ KeyType key; /*关键字项*/InfoType dat
20、a; /*其他数据项 ,类型为 InfoType*/ RecType; /*排序的记录类型定义*/void BubbleSort1(RecType R,int n) int i,j,k,exchange;RecType tmp;for (i=0;ii;j-) /*比较,找出最小关键字的记录 */if (Rj.keyadjlistv.firstarc; /*p 指向顶点 v 的第一条弧的弧头结点*/while (p!=NULL) if (visitedp-adjvex=0) /*若 p-adjvex 顶点未访问,递归访问它*/DFS(G,p-adjvex); p=p-nextarc; /*p 指
21、向顶点 v 的下一条弧的弧头结点*/21编写算法实现图 G 的邻接矩阵的存储结构。MGraph creat_mg() int i,j,k,h;char b,t;MGraph mg;printf(“input vex and arc:“);scanf(“%d,%d“,mg.n=i; mg.e=j;for (i=0;img.n|jmg.n) printf(“input error,repeat input:“);scanf(“%d,%d“,printf(“the value is:“);scanf(“%d“,mg.edgesij=h;return mg;22编写程序实现二叉树的先序、中序、后序遍历
22、的递归算法。void PreOrder(BTNode *b) /*先序遍历的递归算法*/ if (b!=NULL) printf(“%c “,b-data); /*访问根结点 */PreOrder(b-lchild);PreOrder(b-rchild);void InOrder(BTNode *b) /*中序遍历的递归算法*/ if (b!=NULL) InOrder(b-lchild);printf(“%c “,b-data); /*访问根结点 */InOrder(b-rchild);void PostOrder(BTNode *b) /*后序遍历递归算法*/ if (b!=NULL) P
23、ostOrder(b-lchild);PostOrder(b-rchild);printf(“%c “,b-data); /*访问根结点 */23设计一个算法,对于给定的二叉排序树中的结点*p,找出其左子树中的最大结点和右子树中的最小结点。KeyType maxnode(BSTNode *p) /*返回一棵二叉排序树中的最大结点*/ while (p-rchild!=NULL)p=p-rchild;return(p-key);KeyType minnode(BSTNode *p) /*返回一棵二叉排序树中的最小结点 */ while (p-lchild!=NULL)p=p-lchild;ret
24、urn(p-key);void maxminnode(BSTNode *p) if (p!=NULL) if (p-lchild!=NULL)printf(“左子树的最大结点为:%dn“,maxnode(p-lchild);if (p-rchild!=NULL)printf(“右子树的最小结点为:%dn“,minnode(p-rchild);24设二叉树以二叉链表为其存储结构,其定义如下:typedef struct BiTNodeTElemType data;struct BiTNode lc,rc; /lc 指向左子树 BiTNode, *BiTree; /rc 指向右子树试编写一个求二叉树上度为 2 的结点个数的递归算法。Int count(BiTree T) if (T!=NULL) if (T-lc!=NULL count(T-lc);count(T-rc);return n;