1、 int mid=(low+high)/2; if (k=s.elemmid.key) return mid; if (ks.elemmid.key) return f24(s,mid+1,high,k); else return f24(s,low,mid-1,k);25(6分)请对以下函数填空,实现求二叉树T中各结点的子孙总数,并填入结点的DescNum域中的算法。int f25(BiTree T) if ( ) return -1;else T-DescNum = f25(T-lchild) + + ;return T-DescNum;26(6分)图的邻接矩阵表示和算法f26描述如下:#
2、define MaxNum 5typedef struct char vexsMaxNum;int arcsMaxNumMaxNum; int n,e; MGraph;int f26(MGraph G, int i) int d=0;for (int j=0; jnext ;next = p ;在s中递归折半查找k。if ( !T ) return -1; f25(T-rchild) + 2 ; 已知一个图G的邻接矩阵如右所示, 5; 答:求图G第i顶点的度。void purge(LList L) / 删除链表中的“冗余”元素 LList s, q, p = L- while ( p ) /
3、p 指向当前被考察的结点 q = p; while (q-next) / 考察 q 所指后继结点 if (q-next-data != p-data) q = q- else / 修改指针并释放结点空间 s=q- q-next=s- free(s); p = p- / while p/purge1(10分)己知有向图G定义如下: G=(V,E) V=a,b,c,d,e,f E=,a,dc,bc,ed,ef,df,e (1)画出图G。 (2)画出图G的邻接矩阵。 (3)写出G的全部拓扑有序序列。afcbde afcdbe afcdeb afdcbe afdcebfacbde facdbe fac
4、deb fadcbe fadcebacbfde acfbde acfdbe acfdeb4(10分)设哈希函数为H(key)=key MOD 11,用线性探测再散列的方法处理冲突。请画出依次插入元素29,15,48,47,23,41,73,37后,该哈希表的状态,并在各元素下面标出其冲突次数。 冲突次数:4(10分)2347154837294173四、算法设计题(共20分)1(10分)写出在带头结点的单链表上实现线性表操作LENGTH(L)的算法。1. LENGTH(L) (10分)int LENGTH(L) int length = 0; Nodt * p = L-head; while (
5、p) length+; p = p- return length;每行语句1分2(10分)填空完成先序遍历建立二叉树的如下算法。Status CreateBiTree(BiTree &T) scanf(&ch); if (ch= ) T = NULL; else / 生成根结点 CreateBiTree(); / 构造左子树 / 构造右子树 return OK;2(10分) T = new Node(ch); / 生成根结点 (4分) CreateBiTree(T-lchild); / 构造左子树 (3分)rchild); / 构造右子树 (3分)2(10分)以顺序表为存储结构,写出折半插入排
6、序的算法。void BiInsertionSort ( SqList &L ) for ( i=2; i=L.length; +i ) L.r0 = L.ri; / 将 L.ri 暂存到 L.r0low = 1; high = i-1;while (low=high) m = (low+high)/2; / 折半if (L.r0.key =high+1; -j ) L.rj+1 = L.rj; / 记录后移L.rhigh+1 = L.r0; / 插入 / for / BInsertSort每条指令1分1. void AE(Stack& S) InitStack(S); Push(S,3); P
7、ush(S,4); int x=Pop(S)+2*Pop(S); Push(S,x); int i,a5=1,5,8,12,15; for(i=0;i5;i+) Push(S,2*ai); while(!StackEmpty(S) coutPop(S)left,c1,c2); c1+; if (BT-left=NULL&BT-right=NULL) c2+;right,c1,c2); /if 该函数执行的功能是什么?一、 算法填空(共8分)向单链表的末尾添加一个元素的算法。Void InsertRear(LNode*& HL,const ElemType& item)LNode* newptr
8、;newptr=new LNode;If (_)cerrnext=NULL;if (HL=NULL) HL=_;elseLNode* P=HL;While (P-next!=NULL) _;next=newptr;二、 编写算法(共8分)编写从类型为List的线性表L中将第i个元素删除的算法,(假定不需要对i的值进行有效性检查,也不用判别L是否为空表。)void Delete(List& L, int i)一、 阅读算法(每题7分,共14分)1. 30 24 16 10 2 102. 该函数的功能是:统计出BT所指向的二叉树的结点总数和叶子总数 二、 算法填空(共8分,每一空2分)newptr
9、=NULL newptr-=data newptr p=p-next三、 编写算法(8分) void Delete(List& for(int j=i-1;jlink; h-link=_ NULL ;或者 0 ;(2分) while(p! s=p; p=p- _ s-link=h-_(2分)link=s;什么是表头结点?如果该链表无表头结点,则原程序该做怎样的修改?(4分)2、 (13分)对以下函数填空,实现以带头结点的单链表h为存储结构的直接选择排序。单链表的结点结构定义为typedef struct nodeint key; struct node *next;JD;void zjxzpx
10、(JD *h) JD *p,*q,*m;int x;p=h-while(p! q=p- m=p; while(q! if (m-keyq-key) _; _; if (p!=m) x=p-key; p-key=m- m-key=x;_; 直接选择排序属于_(稳定/不稳定)排序。 该排序算法总的键值比较次数为_。并分析什么情况下有最小移动记录次数?什么情况下有最大移动记录次数?算法的平均时间复杂度为多少?(3分 )3、 (13分)对以下函数填空,实现以带头结点的单链表h为存储结构的直接选择排序。1、struct node *link; NULL ; s- 什么是表头结点?表头结点是有时为了操作方
11、便而在链表的第一结点之前添加的一个结点,该结点结构与表中结点相同,但数据域不存放表中数据,或者闲置不用,或者存放特殊信息。表头结点的链域存放指向链表中第一个结点的指针。(2分,回答对点给1分;点0.5分;点0.5分。如果该链表无表头结点该做怎样的修改?修改如下: p=h;(1分) h=NULL; while(p! s-link=h; h =s; 2、m=q; q=q- p=p- 不稳定(2分) n(n-1)/2(2分) 当待排序序列为“正序”时,有最小移动次数0; 当待排序序列为“逆序”时,有最大移动次数3(n-1); 算法的平均时间复杂度为O(n2)。 3、p-rchild; q-LTag!
12、=1; 1 (1分); NULL; 1、(6分)已知二叉树的层次序列为ABCDEFGHIJK,中序序列为DBGEHJACIKF,请构造一棵二叉树,并写出其后序序列。 2、(10分)已知二叉树的先序、中序和后序序列如下,其中有一些看不清的字母用*表示,请先补充*处的字母,再构造一棵符合条件的二叉树(画出图示),最后画出带头结点的中序线索链表。 前序序列:*BC*G* 中序序列:CB*EAGH* 后序序列:*EDB*FA 3、(6分)将下列二叉树还原成森林,并写出先序遍历森林序列。5、 (8分)已知图G=(V,E),其中V=a,b,c,d,e,E=d,cb,e要求:(1) 画出图G;(2) 给出图
13、G的邻接矩阵;(3) 给出图G的邻接表;(4) 给出图G的一种拓扑序列。三、应用题: 1、 (4分,画对根结点1分,左子树正确1.5分,右子树正确1.5分)后序序列为:DGJHEBKIFCA(2分)2、前序序列补充完整为:ABCDEFGH(1分) 中序序列补充完整为:CBDEAGHF(1分) 后序序列补充完整为:CEDBHGFA(1分)(3分,画对根结点1分,左子树正确1分,右子树正确1分)(4分)画对各结点线索指针得2分,标志位正确得1分,表头结点正确得3、 (4分,画对各树根结点2分, 画对各子树子女结点2分) 该森林的先序序列为: ABCMNSDEFGHKIJ(2分)4、 (1) (2分,如果画的是无向图不給分)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1