1、数据结构答案打印版1试卷参考答案1.填空题(1) N2 + 1 (2) 2N 1 (3) 2 (4) 队空条件:front = rear队满条件:(rear+1) % (m+1) = front 注:假设牺牲数组一个单元,只存放m个元素(6) 广度优先搜索 (8) 14 (9) 避免在插入和删除操作中将第一个结点看作是特殊结点,使程序编写简单。2.基本思想如下: (1) 存储结构:两个栈使用同一段内存空间,图示如下。栈1只做PUSH操作,对应队列的进队;栈2只做POP操作,对应队列出队操作。 (2) 队列定义: typedef structint dataM;int Top1;/栈1指针int
2、 Top2;/栈2指针SqQueue;队列初始化:SqQueue q;q.Top1= 1;q.Top2=0;(3) 进队操作: if(q.Top1=M-1)printf(“队满!”);else q.data+q.top1=e; (4) 出队操作: if (q.Top2=q.Top1+1) printf(“队空!”);else e=q.dataq. top2+;4.拓扑排序算法如下所示: void TopologicalSort(Graph g)/有向图g采用邻接表存储结构int indegreeMAX_VER;/定义各顶点入度数组indegreeint i,k,count;SqQueue q;
3、node *p;FindIndegree(indegree,g);/求出所有顶点的入度q=InitQueue();/建0入度顶点队列qfor(i=0;inext) -indegreep-no;/对k号顶点的每个邻接点的入度减1if(!indegreep-no)q=EnQueue(q,p-no);/若入度为0则进队列/for/whileif(countg.vexnum)/该有向图有回路printf(nThere is a circuit.);/ TopologicalSort对于有n个顶点,e条边的有向图的拓扑排序算法的时间复杂性为O(n+e)5.由于学号已经排好序,要求按学生成绩(总分)排名次
4、,若总分相同,则学号在前的,仍排在前面,即要求选择的排序算法具有稳定性,分析具有稳定性的排序算法有如下4种: 再从时间与空间去综合考虑,选择改进的冒泡排序好。算法如下:void bubble_sort(int a,int n)int t=0,done=0;int i,j;for(i=1;i=n-1&!done;i+)done=1;for(j=0;jaj+1)done=0; t=aj; aj=aj+1; aj+1=t; 6.归并排序算法如下: void Merge(int b,int a,int i,int m,int n) /将有序的bi.m和bm+1.n归并为有序的ai.nint j,k;f
5、or(j=m+1,k=i;(i=m)&(j=n);+k)cmp+;if(bibj)ak=bi+;change+;else ak=bj+;change+;while(i=m)ak+=bi+;change+;/将剩于的bi.m复制到awhile(j=n)ak+=bj+;change+;/将剩余的bj.n复制到a/ Mergevoid MSort(int a,int c,int s,int t)/将as.t归并排序为cs.tint m;int bMAX;if(s=t) cs=as;elsem=(s+t)/2;/将as.t平分为as.m和am+1.tMSort(a,b,s,m);/递归地将as.m归并
6、为有序的bs.mMSort(a,b,m+1,t);/递归地将am+1.t归并为有序的bm+1.tMerge(b,c,s,m,t);/将bs.m和bm+1.t归并到cs.t/ MSortvoid MergeSort(int a,int n)/对数组a做归并排序MSort(a,a,1,n);/ MergeSort7.解: 建立二叉排序树并计算平衡因子如下图: 2试卷参考答案1B2C3C4A5A6D7D8B二、填空题1O(log2N) 2(21,30,55,45,94,66,90,82) 3101 4635ab+c*ef*h-qr+/+3+6. done :=Falsej:=i DIV 2 i:=j
7、done:=TrueRi:=extra三、解答: IntRearrange(SeqList a; intn)i=0; j=n-1;t=a0;while(ij)while(i=0) j-; 若当前元素为大于等于零,指针前移if(ij)ai=aj;i+;将负数前移while(ij &ai0)i+; 当前元素为负数时指针后移if(ij) aj-=ai; 正数后移。ai=t;四解答:(1)邻接表(2)深度优先dfs广度优先bfs 五:二叉树层次遍历算法:void Levelorder(BTreeNode * BT)BTreeNode *qM;int front=0,rear=0;BTreeNode *
8、p;If(BT!=NULL) rear=(rear+1)%M;qrear=BT;while(front!=rear)front=(front+1)%M;p=qfront;coutdataleft!=NULL) rear=(rear+1)%M;qrear=p-left; if(p-right!=NULL) rear=(rear+1)%M;qrear=p-right; 六:求广义表深度算法:int Depth(GLNode *GL)if(GL=NULL) return 1;/空表深度为1if(GL-tag=false) return 0; /原子深度为0int max=0; while(GL!=N
9、ULL)if(GL-tag=True ) int dep=Depth(GL-sublist);if(depmax)max=dep;GL=GL-next;return max+1;/非空表深度为各元素的深度最大值加上13试卷参考答案一.填空题 1待排序的原始记录按关键字有序或“基本有序”排列O(n)218.4 318 4先序5第i列不为零的元素个数,第i行不为零的元素个数6AOE网中,从源点到汇点带权路径长度最长的路径。7P2 9100 10log(n-1) O(log n)二.根据要求解答下列问题.3. 中序线索二叉树为:4. 提供三种方法:(1)牺牲一个单元不用当(Q.front=Q.rea
10、r)时队列为空当((Q.rear+1) % MAXSIZE=Q.front)是为满(2)标志域法设置一个flag标志域,设(flag=0)时队列空,(flag=1)时队列满(3)计数法当(Q.length=MAXSIZE)时为满,当(Q.length=0)时为空 .当插入字母Y后,Y所形成的节点应为 X节点的右孩子,此时以Z为根的子树失去平衡,为满足平衡二叉树的要求,应进行LR型旋转,旋转后的结果为:三. 答:四.程序如下: #include #include int delduplicate(int a,int n)int i,j,k,count;i=0;while (in)j=i+1;co
11、unt=0;while (jn & aj=ai) j+;count+;if (count!=0)for(k=j;kn;k+)ak-count=ak;n=n-count;i+; return n;void main(void)int n;/元素个数int a100;/存放表中的元素int i;cout输入元素个数n;for (i=0;iai;coutaisetw(5);coutendl;n=delduplicate(a,n);cout现在元素的个数为n=nendl;for(i=0;in;i+)coutaisetw(5);coutlchild;if (p!=null) count+;while (
12、p-rchild!=null) count+;T-degree=count; if (T-lchild)DegreeOfTree(T-lchild);if (T-rchild)DegreeOfTree(T-rchild);retrun T;六.算法如下:#define MAX_VERTEX_NUM20Typedef struct ArcNodeInt adjvex;Struct ArcNode *nextarc;InfoType*info;ArcNode;Typedef struct VNodeVertexType data;ArcNode *firstarc;VNode,AdjListMAX
13、_VERTEX_NUM;Typedef structAdjListverticed;Intvexnum,arcnum;Intkind;ALGraph;Boolean visitedMAX;Status (*VisitFunc)(int v);Void BFSTraverse(ALGraph G,Status(* Visit)(int v)For(v=0;vG.vexnum;+v)visitedv=FALSE;InitQueue(Q); For(v=0;vlchild;p=p-rchild;二. 解答:3. 1)if(Q.rear+1)%maxqsize=Q.front)队列满 2) if(q.
14、rear=q.front) and (q.flag=1) 队列满5. 堆为:(12,38,25,50,76,66,49,98) 四. 解答:int partition(SqList &L,int low,int high)L.r0=L.rlow;Pivotkey=L.rlow.key;while(lowhigh)while(low=pivotkey) -high;L.rlow=L.rhigh;while(lowhigh&L.rlow.key=pivotkey) +low;L.rhigh=L.rlow;L.rlow=L.r0;Void qsort(sqlist &L,int low,int hi
15、gh)if(lowLChild);/* 求左子树的深度 */hr=computbal(bt-RChild);/* 求右子树的深度 */bt-bal=hl-hr;/*求出平衡因子*/max=hlhr?hl:hr;/* 得到左、右子树深度较大者*/return(max+1);/* 返回树的深度 */六.解答:Status topologicalsort(ALGraph G)findInDegree(G,indegree);initstack(s);for(i=0;inextarc)k=p-adjvex;if(!(-indegreek) push(s,k);if(countg.vexnum)retu
16、rn error;else return ok;七.解答:顺序栈类型定义:Typedef struct selemtype *base;selemtype *top;int stacksize;sqstack;循环队列的类型定义:Typedef structQelemtype *base;int front;int rear;squeue;二叉链表的类型定义Typedf struct BitNodeTElemType data;Struct BitNode *lchild,*rchild;BitNode,*BitTree;邻接表类型定义:#define MAX_VERTEX_NUM 20Typ
17、edef struct arcnodeint adjvex;struct arcnode *nextarc;infotype *info;arcnode;Typedef strcut vnodevertextype data;arcnode *firstarc;vnode,adjlistMAX_VERTEX_NUM;Typedef structAdjlist vertices;int vexnum,arcnum;int kind;algraph;5试卷参考答案一、填空题 1. 随机存取数据方便 2. 100 3. EDCBA 4. 插入 5. (rear-qulen+m+1)%(m+1)6.
18、m+n-1 7. P2 9. O(log10n) 10. 52二、 Prim算法:假设N=(V,E)是连通网,TE是N的最小生成树的边的集合。算法从U=u0(u0V),TE=开始,重复执行下述操作:在所有uU,vV-U的边(u, v) E 中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U=V为止。此时TE中有n-1条边,则T=(V,TE)为N的最小生成树。时间复杂度为O(n2),与边数无关,适合于求边稠密的网的最小生成树。 Kruskal算法从另一个途径求网的最小生成树。假设N=(V,E)是连通网,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,),图中
19、每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将该边加入到T中,否则舍去此边而选择下一条代价最小的边。依此类推,直到T中所有顶点都在同一个连通分量上为止。时间复杂度为O(eloge),与边数有关,适合于求边稀疏的网的最小生成树。 三、 四快速排序不稳定。例如: 3 5 5 3 1 排序后结果:1 3 3 5 5五 /统计字符串s中t的个数 #include #include /子串定位 int FindSubString(char s,char t, int pos)int i=pos,j=0;int slen = strlen(s);int tlen = strlen(t);while(islen & jtlen)if(si=tj)i+;j+;elsei= i-j+1;j = 0;if(j=tlen)return i-j;else return -1;/主程序 void main()char *s =abcdbcdefgbcdabcd;char *t = bcd;int pos = 0;int cnt
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1