![2023年人武学院数据结构课后习题答案及期末综合练习_第1页](http://file4.renrendoc.com/view/95622685e03d3d39046875f7356f3cef/95622685e03d3d39046875f7356f3cef1.gif)
![2023年人武学院数据结构课后习题答案及期末综合练习_第2页](http://file4.renrendoc.com/view/95622685e03d3d39046875f7356f3cef/95622685e03d3d39046875f7356f3cef2.gif)
![2023年人武学院数据结构课后习题答案及期末综合练习_第3页](http://file4.renrendoc.com/view/95622685e03d3d39046875f7356f3cef/95622685e03d3d39046875f7356f3cef3.gif)
![2023年人武学院数据结构课后习题答案及期末综合练习_第4页](http://file4.renrendoc.com/view/95622685e03d3d39046875f7356f3cef/95622685e03d3d39046875f7356f3cef4.gif)
![2023年人武学院数据结构课后习题答案及期末综合练习_第5页](http://file4.renrendoc.com/view/95622685e03d3d39046875f7356f3cef/95622685e03d3d39046875f7356f3cef5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章内部排序一、基本知识题答案1.排序:将一组杂乱无序的数据按一定的规律顺次排列起来叫做排序。内部排序:数据存储在内存中,并在内存中加以解决的排序方法叫内部排序。堆:堆是一个完全二叉树,它的每个结点相应于原始数据的一个元素,且规定假如一个结点有儿子结点,此结点数据必须大于或等于其儿子结点数据。稳定排序:一种排序方法,若排序后具有相同关键字的记录仍维持本来的相对顺序,则称之为稳定的,否则称为不稳定的。2.回答下面问题(1)5000个无序的数据,希望用最快速度挑选出其中前10个最大的元素,在快速排序、堆排序、归并排序和基数排序中采用哪种方法最佳?为什么?(2)大多数排序算法都有哪两个基本操作?答:(1)采用堆排序最佳。由于以上几种算法中,快速排序、归并排序和基数排序都是在排序结束后才干拟定数据元素的所有顺序,而无法知道排序过程中部分元素的有序性。堆排序则每次输出一个最大(或最小)的元素,然后对堆进行调整,保证堆顶的元素总是余下元素中最大(或最小)的。根据题意,只要选取前10个最大的元素,故采用堆排序方法是合适的。(2)两个基本操作:比较两个关键字的大小、改变指向记录的指针或移动记录自身。3.3.已知序列{17,25,55,43,3,32,78,67,91},请给出采用冒泡排序法对该序列作递增排序时每一趟的结果。答:采用冒泡排序法排序时的各趟结果如下:初始:17,25,55,43,3,32,78,67,91第1趟:17,25,43,3,32,55,67,78,91第2趟:17,25,3,32,43,55,67,78,91第3趟:17,3,25,32,43,55,67,78,91第4趟:3,17,25,32,43,55,67,78,91第5趟:3,17,25,32,43,55,67,78,91第5趟无元素互换,排序结束。4.已知序列{491,77,572,16,996,101,863,258,689,325},请分别给出采用快速排序、堆排序和基数排序法对该序列作递增排序时每一趟的结果。答:采用快速排序法排序时的各趟结果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟:[325,77,258,16,101]491[863,996,689,572]第2趟:[101,77,258,16]325,491[863,996,689,572]第3趟:[16,77]101[258]325,491[863,996,689,572]第4趟:16[77]101[258]325,491[863,996,689,572]第5趟:16,77,101[258]325,491[863,996,689,572]第6趟:16,77,101,258,325,491[863,996,689,572]第7趟:16,77,101,258,325,491[572,689]863[996]第8趟:16,77,101,258,325,491,572[689]863[996]第9趟:16,77,101,258,325,491,572,689,863[996]第10趟:16,77,101,258,325,491,572,689,863,996采用堆排序法排序时各趟的结果如下图所示:(a)初始堆(b)建堆(c)互换996和77,输出996(d)筛选调整采用基数排序法排序时各趟的结果如下:初始:491,77,572,16,996,101,863,258,689,325第1趟(按个位排序):491,101,572,863,352,16,996,77,258,689第2趟(按十位排序):101,16,352,258,863,572,77,689,491,996第3趟(按百位排序):16,77,101,258,352,491,572,689,863,9965.已知序列{86,94,138,62,41,54,18,32},请给出采用插入排序法对该序列作递增排序时,每一趟的结果。答:采用插入排序法排序时各趟的结果如下:初始:(86),94,138,62,41,54,18,32第1趟:(86,94),138,62,41,54,18,32第2趟:(86,94,138),62,41,54,18,32第3趟:(62,86,94,138),41,54,18,32第4趟:(41,62,86,94,138),54,18,32第5趟:(41,54,62,86,94,138),18,32第6趟:(18,41,54,62,86,94,138),32第7趟:(18,32,41,54,62,86,94,138)6.已知序列{27,35,11,9,18,30,3,23,35,20},请给出采用归并排序法对该序列作递增排序时的每一趟的结果。答:采用归并排序法排序时各趟的结果如下:初始:27,35,11,9,18,30,3,23,35,20第1趟:[27,35][9,11][18,30][3,23][20,35]第2趟:[9,11,27,35][3,18,23,30][20,35]第3趟:[9,11,27,35][3,18,20,23,30,35]第4趟:[3,9,11,18,20,23,27,30,35,35]二、算法设计题答案1.二、算法设计题1.一个线性表中的元素为所有为正或者负整数,试设计一算法,在尽也许少的时间内重排该表,将正、负整数分开,使线性表中所有负整数在正整数前面。解:本题的算法思想是:设立两个变量分别指向表的首尾,它们分别向中间移动,指向表首的ﻫ假如碰到正整数,指向表尾的假如碰到负整数则互相互换,然后继续移动直至两者相遇。实现本ﻫ题功能的算法如下:voidpart(intarray[],intn){ﻩinti,j;ﻩi=1; j=n;while(i<j) {while(i<j&&array[i]<0) ﻩﻩi++;ﻩ while(i<j&&array[j]>=0)ﻩﻩ j--; ﻩif(i<j) {array[0]=array[i]; ﻩﻩarray[i]=array[j];ﻩﻩﻩarray[j]=array[0];ﻩ }ﻩ}}2.设计一个用单链表作存储结构的直接插入排序算法。解:实现本题功能的算法如下:voidinsertsort(node*head){ﻩnode*p,*q,*pre;ﻩpre=head;ﻩp=head->next;/*p指向待插入的元素*/ﻩwhile(p!=NULL)ﻩ{ﻩﻩq=head; ﻩif(p->key<q->key)/*插到表首*/{pre->next=p->next;ﻩ p->next=head;ﻩﻩﻩhead=p;ﻩ }ﻩ elseﻩﻩ{ﻩﻩwhile(q->next!=p&&q->next->key<p->key) ﻩﻩq=q->next; ﻩif(q->next==p) ﻩ{ ﻩﻩpre=p;p=p->next; }ﻩﻩﻩelseﻩ ﻩ{pre->next=p->next;ﻩ ﻩp->next=q->next; ﻩ q->next=p;ﻩ ﻩﻩp=pre->next;ﻩﻩﻩ}ﻩﻩ}ﻩ}}3.试设计一个算法实现双向冒泡排序。(双向冒泡排序就是在排序的过程中交替改变扫描方向。)解:实现本题功能的算法如下:voiddbubblesort(sqlistr,intn){ inti,j,flag; flag=1; i=1;ﻩwhile(flag!=0)ﻩ{ﻩ flag=0; for(j=i;j<n-i;j++){ ﻩif(r[j]>r[j+1]) ﻩ{ ﻩ ﻩflag=1;ﻩﻩ r[0]=r[j]; ﻩﻩ r[j]=r[j+1];ﻩﻩ r[j+1]=r[0];ﻩﻩ }ﻩﻩ}ﻩﻩfor(j=n-i;j>i;j--){ ﻩ if(r[j]<r[j-1])ﻩﻩ {flag=1;ﻩﻩ ﻩr[0]=r[j];ﻩﻩﻩﻩr[j]=r[j-1]; ﻩr[j-1]=r[0];ﻩ ﻩ} }ﻩﻩ i++;ﻩ}}4.设一个一维数组A[n]中存储了n个互不相同的整数,且这些整数的值都在0到n-1之间,即A中存储了从0到n-1这n个整数。试编写一算法将A排序,结果存放在数组B[n]中,规定算法的时间复杂性为O(n)。解:实现本题功能的算法如下:voidsort(intA[n],intB[n]){ﻩinti; for(i=0;i<n;i++) ﻩB[A[i]]=A[i];}第九章一、基础知识题1.(1)查找:查找又称为查询或检索,是在一批记录中依照某个域的指定域值,找出相应的记录的操作。(2)树型查找:将原始数据表达成二叉排序树,树的每个结点相应一个记录,运用此二叉排序树进行类似于二分查找思想的数据查找,这种查找方法称为树型查找。(3)平衡因子:二叉树中每一结点的左子树高度减右子树高度为该结点的平衡因子。(4)散列函数:根据关键字求存储地址的函数称为散列函数。(5)两个不同的关键字,其散列函数值相同,因而被映射到同一个表位置上的现象称为冲突。2.设有序表为{a,b,c,d,e,f,g},请分别画出对给定值f,g和h进行拆半查找的过程。答:查找f的过程如下:查找成功,找到k=f值查找g的过程如下:查找成功,找到k=g值查找h的过程如下:试述顺序查找法、二分查找法和分块查找法对被查找表中元素的规定,每种查找法对长度为n的表的等概率查找长度是多少答:顺序查找法:表中元素可以任意存放。查找成功的平均查找长度为(n+1)/2。二分查找法:表中元素必须以关键字的值递增或递减地存放且只能以顺序表存放。查找成功的平均查找长度为log2(n+1)-1。分块查找法:表中每块内的元素可以任意存放,但块与块之间必须按关键字的大小递增或递减地存放,即前一块内所有元素的关键字不能大(或小)于后一块内任意一个元素的关键字。若用顺序查找拟定所在块,平均查找长度为1/2(n/s+s)+1;若用二分查找拟定所在块,平均查找长度为log2(n/s+1)+s/2。4.设散列表长m=14,哈希函数为H(k)=kmod11,表中一共有8个元素{15,27,50,73,49,61,37,60},试画出采用二次探测法解决冲突的散列表。答:采用二次探测法解决冲突的散列表如下:5.线性表的关键字集合为{113,12,180,138,92,67,94,134,252,6,70,323,60},共有13个元素,已知散列函数为:H(k)=kmod13,采用链接表解决冲突,试设计这种链表结构。答:由题意,可得:H(113)=113%13=9H(12)=12%13=12H(180)=180%13=11H(138)=138%13=8H(92)=92%13=1H(67)=67%13=2H(94)=94%13=3H(134)=134%13=4H(252)=252%13=5H(6)=6%13=6H(70)=70%13=5H(323)=323%13=11H(60)=60%13=8链接表法的散列表如下图所示:6.设关键字集合为{27,49,79,5,37,1,56,65,83},散列函数为:H(k)=kmod7,散列表长度m=10,起始地址为0,分别用线性探测和链接表法来解决冲突。试画出相应的散列表。答:线性探测法的散列表如下图所示:链接表法的散列表如下图所示:二、算法设计题1.从小到大排列的,试写出对此链表的查找算法,并说明是否可以采用折半查找。解:实现本题功能的算法如下,假如查找成功,则返回指向关键字为x的结点的指针,否则返回NULL。node*sqsearch(node*head,intx){node*p=head;ﻩwhile(p!=NULL)ﻩ if(x>p->key) ﻩﻩp=p->link;elseif(x==p->key)ﻩ ﻩreturnp;else{p=NULL;returnp;ﻩﻩ}}虽然链表中的结点是按递增顺序排列的,但是其存储结构为单链表,查找结点时只能从头指针开始逐步进行搜索,所以不能用折半查找。2.假如线性表中各结点查找概率不等,则可以使用下面的策略提高顺序表的查找效率:假如找到指定的结点,则将该结点和其前趋(若存在)结点互换,使得经常被查找的结点尽量位于表的前端。试对线性表的顺序存储结构和链式存储结构写出实现上述策略的顺序查找算法(注意查找时必须从表头开始向后扫描)。解:采用顺序存储结构的算法如下,设记录存储在线性表的1~n单元中。假如查找成功,返回关键字为k的记录在线性表中的位置,假如失败则返回0。intseqsearch(sqlistr,intn,intk){ inti,j;ﻩi=1;ﻩwhile((r[i].key!=k)&&(i<=n)) i++;ﻩif(i<=n){ r[0]=r[i]; r[i]=r[i-1];r[i-1]=r[i];ﻩﻩi--; return(i); }ﻩelse ﻩreturn(0);}采用链式存储结构的算法如下。假如查找成功,则返回指向关键字为k的结点的指针,否则返回NULL。node*seqsearch(node*head,intk){ﻩif(head->key==k)return(head);ﻩelse{ﻩﻩnode*p,*q;intx;p=head; ﻩq=head->link;ﻩ while(q!=NULL&&q->key!=k)ﻩﻩ{ﻩﻩﻩp=q;ﻩ ﻩq=q->link; } if(q!=NULL){ ﻩx=p->key;ﻩ ﻩp->key=q->key; ﻩ q->key=x; ﻩq=p; ﻩ} return(q);ﻩ}}3.试设计一个在用开放地址法解决冲突的散列表上删除一个指定结点的算法。解:本题的算法思想是:一方面计算要删除的关键字为k的记录所在的位置,将其置为空(即删除),然后运用线性探测法查找是否有与k发生冲突而存储到下一地址的记录,假如有则将记录移到本来k所在的位置,直至表中没有与k冲突的记录为止。实现本题功能的算法如下:voiddelete(sqlistr,intn,intk){inth,h0,h1;ﻩh=k%n;ﻩwhile(r[h].key!=k)ﻩ h=(h+1)%n;r[h]=NULL;ﻩh0=h; h1=(h+1)%n;ﻩwhile(h1!=h)ﻩ{while(r[h1].key%n!=h)ﻩ h1=(h1+1)%n; r[h0]=r[h1]; r[h1]=NULL; h0=h1; h1=(h1+1)%n;ﻩ}}4.设给定的散列表存储空间为H[1~m],每个单元可存放一个记录,H[i](1≤i≤m)的初始值为零,选取散列函数为H(R.key),其中key为记录R的关键字,解决冲突方法为线性探测法,编写一个函数将某记录R填入到散列表H中。解:本题的算法思想:先计算地址H(R.key),假如没有冲突,则直接填入;否则运用线性探测法求出下一地址,直到找到一个为零的地址,然后填入。实现本题功能的函数如下:voidinsert(recordH,intm,recordR){ inti;ﻩi=H(R.key);ﻩif(H[i]==NULL)ﻩ H[i]=R;else { while(H[i]!=NULL) {ﻩﻩ i=(i+1)%(m+1); }ﻩﻩH[i]=R; }}第七章一、基本知识题1.图的逻辑结构特点是什么?什么是无向图和有向图?什么是子图?什么是网络?答:图是比树更为复杂的一种非线性数据结构,在图结构中,每个结点都可以和其它任何结点相连接。无向图:对于一个图G,若边集合E(G)为无向边的集合,则称该图为无向图。有向图:对于一个图G,若边集合E(G)为有向边的集合,则称该图为有向图。子图:设有两个图G=(V,E)和G’=(V’,E’),若V(G’)是V(G)的子集,且E(G’)是E(G)的子集,则称G’是G的子图(Subgraph)。网络:有些图,相应每条边有一相应的数值,这个数值叫做该边的权。边上带权的图称为带权图,也称为网络。2.什么是顶点的度?什么是途径?什么是连通图和非连通图?什么是非连通图的连通分量?答:顶点的度:图中与每个顶点相连的边数,叫该顶点的度。在一个图中,若从某顶点Vp出发,沿一些边通过顶点V1,V2,…,Vm到达,Vq,则称顶点序列(Vp,V1,V2,…,Vm,Vq)为从Vp到Vq的途径。在无向图中,假如从顶点Vi到顶点Vj之间有途径,则称这两个顶点是连通的。假如图中任意一对顶点都是连通的,则称此图是连通图。非连通图的连通分量:非连通图的每一个连通的部分叫连通分量。3.给出图6.25所示的无向图G的邻接矩阵和邻接表两种存储结构。答:图G所相应的邻接矩阵如下:图G所相应的邻接表如下:图254.假设图的顶点是A、B……请根据下面的邻接矩阵画出相应的无向图或有向图。答:(a)所相应的无向图如下图(a)所示,(b)所相应的有向图如下图(b)所示:5.5.分别给出图6.26所示G图的深度优先搜索和广度优先搜索得到的顶点访问序列。图26答:深度优先搜索得到的顶点访问序列:0、1、3、7、8、4、9、5、6、2;ﻩ广度优先搜索得到的顶点访问序列:0、1、2、3、4、5、6、7、8、9。6.应用prim算法求图6.27所示带权连通图的最小生成树。答:该图的最小生成树如下:ﻩﻩﻩﻩﻩ ﻩ ﻩ ﻩ 图27ﻩ7.写出图6.28所示有向图的拓朴排序序列答:该有向图的拓朴排序序列为:3、1、4、5、2、6。二、算法设计题 ﻩ ﻩ ﻩ 图28二、算法设计题答案1.如图6.29所示图G,试给出其相应的邻接表,并写出深度优先算法。解:该图相应的邻接表如下:深度优先算法:voiddfsgraph(adjlistadj,intn)/*深度优先遍历整个图*/{ inti; for(i=1;i<=n;i++) ﻩvisited[i]=0; for(i=1;i<=n;i++)ﻩﻩif(!visited[i])ﻩﻩ dfs(adj,i);}voiddfs(adjlistadj,intv)/*以v为出发点,对图进行dfs遍历*/{structedgenode*p;visited[v]=1;printf("%d",v);p=adj[v]→link;while(p!=NULL){if(visited[p→adjvex]==0)ﻩﻩ dfs(adjlist,p→adjvex);ﻩﻩp=p→next;ﻩ}}2.如图6.29所示图G,试给出其相应的邻接矩阵,并写出广度优先算法。解:该图相应的邻接矩阵如下:广度优先算法:voidbfsgraph(intadjarray[n][n],intn)/*广度优先遍历整个图*/{ﻩinti;ﻩfor(i=0;i<n;i++)ﻩﻩvisited[i]=0;ﻩfor(i=0;i<n;i++) 图29ﻩ if(!visited[i]) bfs(adjarray,i);}voidbfs(intadjarray[][],intv)/*以v为出发点,对图进行bfs遍历*/{ inti,j; queueq;ﻩprintf("%d",v);ﻩvisited[v]=1;ﻩenqueue(&q,v); while(!queueemty(&q))ﻩ{ ﻩi=dequeue(&q);for(j=0;j<n;j++)ﻩ if(adjarray[i][j]==1&&!visited[j]) ﻩ {ﻩﻩﻩ printf("%d",j);ﻩﻩ ﻩvisited[j]=1;ﻩﻩﻩﻩenqueue(&q,j);ﻩ }ﻩ}}3.编写一个函数通过与用户交互建立一个有向图的邻接表。解:实现本题功能的算法如下:voidcreategraph(adjlistg){ﻩinte,i,s,d,n;structedgenode*p; printf("请输入结点数(n)和边数(e):\n"); scanf("%d,%d",&n,&e); for(i=1;i<=n;i++){printf("\n请输入第%d个顶点信息:",i);scanf("%c",&g[i].data);g[i].link=NULL;ﻩ} for(i=1;i<=e;i++)ﻩ{printf("\n请输入第%d条边起点序号,终点序号:",i);ﻩﻩscanf("%d,%d",&s,&d);ﻩ p=(structedgenode*)malloc(sizeof(edgenode));ﻩ p→adjvex=d; p→next=g[s].link;ﻩ g[s].link=p;ﻩ}}4.编写一个无向图的邻接矩阵转换成邻接表的算法。解:本题的算法思想是:逐个扫描邻接矩阵的各个元素,如第i行第j列的元素为1,则相应的邻接表的第i个单链表上增长一个j结点。实现本题功能的算法如下:voidtransform(intadjarray[n][n],adjlistadj){ﻩinti,j;ﻩedgenode*p; for(i=0;i<n;i++) {ﻩﻩadj[i].data=i;adj[i].link=NULL;}for(i=0;i<n;i++) for(j=0;j<n;j++) ﻩ{if(adjarray[i][j]==1)ﻩﻩﻩ{p=(edgenode*)malloc(sizeof(edgenode));ﻩ p→adjvex=j;ﻩ ﻩp→next=adj[i].link; ﻩ adj[i].link=p;ﻩﻩ } }}5.已知一个有n个顶点的有向图的邻接表,设计算法分别实现1)求出图中每个顶点的出度。2)求出图中每个顶点的入度。3)求出图中出度最大的一个顶点,输出其顶点序号。4)计算图中出度为0的顶点个数。解:(1)本题的算法思想是:计算出邻接表中第i个单链表的结点数,即为i顶点的出度。求顶点的出度数的算法如下:intoutdegree(adjlistadj,intv){intdegree=0; edgenode*p; p=adj[v].link;ﻩwhile(p!=NULL)ﻩ{degree++;p=p->next;ﻩ}returndegree;}voidprintout(adjlistadj,intn){ﻩinti,degree;ﻩprintf("Theoutdegreesare:\n"); for(i=0;i<n;i++)ﻩ{ﻩdegree=outdegree(adj,i); ﻩprintf("(%d,%d)",i,degree); }}(2)本题的算法思想是:计算出整个邻接表中所具有的结点为i的结点数,这就是i顶点的入度。求顶点的入度数的算法:intindegree(adjlistadj,intn,intv){ inti,j,degree;ﻩedgenode*p; for(i=0;i<n;i++)ﻩ{ ﻩp=adj[i].link; ﻩwhile(p!=NULL){ ﻩ if(p->adjvex==v) ﻩdegree++;ﻩ ﻩp=p->next;ﻩ } }ﻩreturndegree;}voidprintin(adjlistadj,intn){ inti,degree; printf("Theindegreesare:\n"); for(i=0;i<n;i++) {ﻩdegree=indegree(adj,n,i); printf("(%d,%d)",i,degree); }}(3)求最大出度的算法:voidmaxoutdegree(adjlistadj,intn){ intmaxdegree=0,maxv=0,degree,i;ﻩfor(i=0;i<n;i++)ﻩ{ﻩﻩdegree=outdegree(adj,i);if(degree>maxdegree) {ﻩﻩﻩmaxdegree=degree; ﻩ maxv=i; ﻩ} } printf("maxoutdegree=%d,maxvertex=%d",maxdegree,maxv);}(4)求出度数为0的顶点数的算法:intoutzero(adjlistadj,intn){ intnum=0,i; for(i=0;i<n;i++) { ﻩif(outdegree(adj,i)==0)ﻩﻩﻩnum++;ﻩ} returnnum;}第六章一、基础知识题1.就如图5.21所示的树回答下面问题:1)哪个是根结点?2)哪些是叶子结点?3)哪个是E的父结点?4)哪些是E的子孙结点?5)哪些是E的兄弟结点?哪些是C的兄弟结点?6)结点B和结点I的层数分别是多少?7)树的深度是多少?8)以结点G为根的子树的深度是多少?9)树的度是多少?答:1)A是根结点2)D、H、I、J、F、G是叶子结点3)B是E的父结点4)H、I、J是E的子孙结点5)D是E的兄弟结点,B是C的兄弟结点6)B的层数是2,I的层数是47)树的深度是48)以结点G为根的子树的深度是19)树的度是32.分别画出含3个结点的树与二叉树的所有不同形态。答:3个结点的树: 3个结点的二叉树:3.高度为h的完全二叉树至少有多少个结点?最多有多少个结点?答:高度为h的完全二叉树至少有个结点,最多有个结点。4.采用顺序存储方法和链式存储方法分别画出图5.22所示二叉树的存储结构。答:该二叉树的顺序存储:该二叉树的链式存储:5.分别写出图5.22所示二叉树的前序、中序和后序遍历序列。图22答:先序遍历序列:1、2、4、7、3、5、8、6、9中序遍历序列:7、4、2、1、8、5、3、6、9后序遍历序列:7、4、2、8、5、9、6、3、16.若二叉树中各结点值均不相同。1)已知一个二叉树的中序和后序遍历序列分别为GDHBAECIF和GHDBEIFCA,请画出此二叉树。2)已知一个二叉树的前序和中序分别为ABCDEFGH和BDCEAFHG,请画出此二叉树。答:7.一个二叉树如图5.23所示,分别写出其前序、中序、后序的遍历序列。答:先序遍历序列:A、B、D、E、F、C、G中序遍历序列:D、F、E、B、A、G、C后序遍历序列:F、E、D、B、G、C、A8.输入一个正整数序列{55,34,18,88,119,11,76,9,97,99,46},试构造一个二叉排序树。9.有一份电文中共使用5个字符:a、b、c、d、e,它们的出现频率依次为5、2、1、6、4。试画出相应的哈夫曼树,并求出每个字符的哈夫曼编码。第8题 各字符相应的哈夫曼编码如下:a:10,b:001,c:000,d:11,e:01二、算法设计题答案1.一个二叉树以链式结构存储,分别给出求二叉树结点总数和叶子结点总数的算法。解:求二叉树结点总数的算法如下:intCountNode(btree*t,intnum)/*num初值为0*/{if(t!=NULL)ﻩ{num++;ﻩﻩnum=CountNode(t->left,num);ﻩﻩnum=CountNode(t->right,num); }ﻩreturnnum;}求二叉树叶子结点总数的算法如下:intCountLeaf(btree*t,intnum)/*num初值为0*/{if(t!=NULL)ﻩ{if(t->left==NULL&&t->right==NULL) ﻩ num++;ﻩ num=CountLeaf(t->left,num);ﻩﻩnum=CountLeaf(t->right,num);ﻩ} returnnum;}2.2.一个二叉树以链式结构存储,写出在二叉树中查找值为x的结点的算法。解:本题可以用先序、中序和后序遍历中的任意一种遍历,只要将遍历算法中的访问根结点改为判断其值是否等于x。下面是用中序遍历求解的算法,函数返回值为x的结点的地址,若没有找到则返回空。btree*search(btree*t,intx,btreep)/*p的初值为NULL*/{ if(t!=NULL){ p=search(t->left,x,p); ﻩif(t->data==x)ﻩﻩﻩp=t;/*找到x的地址放在p中*/ﻩ p=search(t->right,x,p);ﻩ}returnp;}3.设计一个算法将一个以链式存储结构的二叉树,按顺序方式存储到一维数组中。解:这是一个递归算法,如下:voidcreate(btree*t,inttree[],inti){ if(t!=NULL) { ﻩtree[i]=t->data; create(t->left,tree,2*i); ﻩcreate(t->right,tree,2*i+1); }}4.假设二叉排序树t的各元素值均不相同,设计一个算法按递增顺序打印各元素值。解:按中序序列遍历二叉排序树即按递增顺序遍历,所以递增打印二叉排序树各元素值的函数如下:voidinorder(btree*t){ﻩif(t!=NULL) {ﻩﻩinorder(t->left); ﻩprintf("%d",t->data);ﻩﻩinorder(t->right); }}5.已知一个中序线索二叉树,试编写中序遍历的非递归算法。解:在中序线索二叉树中进行非递归中序遍历,只要从头结点出发,反复找到结点的后继,直至结束即可。在中序线索二叉树中求结点后继的算法如下:tbtree*succ(tbtree*p){ btree*q; if(p->rtag==1) return(p->right);elseﻩ{ q=p->right;ﻩ while(q->ltag==0) ﻩq=q->left; return(q);ﻩ}}由此得到中序遍历线索二叉树的非递归算法如下:voidthinorder(tbtree*p){if(p!=NULL) {while(p->ltag==0) ﻩﻩp=p->left;ﻩ do{ﻩﻩﻩprintf("%d",p->data); ﻩﻩp=succ(p); }while(p!=NULL);ﻩ}}第五章A[10][20]采用列为主序存储,每个元素占1个单元,A[0][0]的地址为200,则A[6][12]的地址是多少?3262.稀疏矩阵m×n采用三元组顺序表存储结构,非零元个数tu满足什么条件时,该存储结构才故意义?tu<m*n/33.二维数组A[10..20][5..10]采用行为主序存储,每个元素占4个单元,A[10][5]的地址为1000,则A[18][9]的地址是多少?(1208)4.稀疏矩阵的三元组顺序表存储结构是随机存储结构吗?为什么?(不是)5.广义表((a,b,c,d))的表头和表尾分别是什么?((a,b,c,d);空表)6.广义表((a),((b),c),(((d))))的长度和深度分别是多少?(3,4)第一章数据物理结构算法二、简答一、名词解释数据:就是一切可以由计算机接受和解决的对象。数据项:是数据的不可分割的最小单位,在有些场合下,数据项又称为字段或域。数据元素:是数据的基本单位,在程序中作为一个整体加以考虑和解决,也称为元素、顶点或记录。它可以由若干个数据项组成。数据结构:指的是数据之间的互相关系,即数据的组织形式,它涉及数据的逻辑结构、数据的存储结构和数据的运算三个方面的内容。数据逻辑结构:是指数据元素之间的逻辑关系,是从逻辑上描述数据,与数据的存储无关,独立于计算机。数据物理结构:是指数据元素及其关系在计算机存储器内的表达,是数据的逻辑结构用计算机语言的实现,是依赖于计算机语言的。算法:是对特定问题求解环节的一种描述。它是一个有穷的规则序列,这些规则决定了解决某一特定问题的一系列运算。由此问题相关的一定输入,计算机依照这些规则进行计算和解决,通过有限的计算环节后能得到一定的输出。算法的时间复杂性:是该算法的时间花费,它是该算法所求解问题规模n的函数。当n趋向无穷大时,我们把时间复杂性T(n)的数量级称为算法的渐进时间复杂性。二、简答题1.算法分析的目的是什么?答:对算法进行分析的目的有两个:第一个目的是可以从解决同一问题的不同算法中区分相对优劣,选出较为合用的一种;第二个目的是有助于设计人员考虑对现有算法进行改善或设计出新的算法。2.什么是算法的最坏和平均时间复杂性?答:算法的最坏时间复杂性是研究各种输入中运算最慢的一种情况下的运算时间;平均时间复杂性是研究同样的n值时各种也许的输入,取它们运算时间的平均值。三、答案1.三、分析下列算法的时间复杂性:1.sum=0;for(i=1;i<=n;i++){sum=sum+i;}答:该程序段的时间复杂性为T(n)=O(n)。2.2.i=1;while(i<=n)i=i*10;1*10for(j=0;j<n;j++)答:该程序段的时间复杂性T(n)=O(log10n)。3.3.sum=0;for(i=0;i<n;i++)ﻩﻩﻩsum=sum+Array[i][j];答:该程序段的时间复杂性(n)=O(n2)。第二章一、基础知识题一、基本知识题答案1.1.试比较顺序表与链表的优缺陷。的操作。答:顺序表用结点物理位置的相邻性来反映结点间的逻辑关系,其优点是:节省存储、随机存取,当表长变化较小,重要操作是进行查找时,宜采用顺序表。链表用附加的指针来反映结点间的逻辑关系,插入和删除操作相对比较方便,当表长变化较大,重要操作是进行插入和删除时,宜采用链表。2.2.试分析单链表与双链表的优缺陷。答:双链表比单链表多增长了一个指针域以指向结点的直接前趋,它是一种对称结构,因此在已知某个结点之前或之后插入一个新结点、删除该结点或其直接后继都同样方便,操作的时间复杂度为O(1);而单链表是单向结构,对于找一个结点的直接前趋的操作要从开始结点找起,其时间复杂度为O(n)。3.3.为什么在单循环链表中设立尾指针比设立头指针更好?答:由于对表的操作经常在表的两端进行,所以对单循环链表,当知道尾指针rear后,其另一端的头指针是rear->next->next(表中带头结点)。这会使操作变的更加容易。4.4.写出在循环双链表中的p所指结点之后插入一个s所指结点答:s->prior=p;s->next=p->next;p->next->prior=s;p->next=s;5.5.写出在单链表中的p所指结点之前插入一个s所指结点的操作。答:s->next=p->next;p->next=s;temp=p->data;p->data=s->data;s->data=temp;6.6.请运用链表来表达下面一元多项式A(x)=4*x^11+9*x^8+11*x^3+8*x+7答:多项式A(x)用链表表达如下:head_A-->4,11-->9,8--.11,3-->8,1-->7,0^二、算法设计题答案1.1.有一个有n个结点的单链表,设计一个函数将第i-1个结点与第i个结点互换,但指针不变。解:本题的算法思想是:要使结点互换而指针不变,只要将两个结点的数据进行互换即可。实现本题功能的函数如下:voidexchange(node*head,inti,n){ﻩnode*p,*q;ﻩintdata; if(i>n)ﻩ printf("error!\n");elseﻩ{ p=head;ﻩﻩfor(intj=1;j<i;j++) p=p->next;ﻩq=p->next;ﻩdata=q->data;ﻩq->data=p->data; p->data=data; }}2.2.设计一个函数,查找单链表中数值为x的结点。解:实现本题功能的函数如下:voidsearch(node*head,intx){ﻩnode*p;ﻩp=head; while(p->data!=x&&p!=NULL)ﻩ p=p->next;ﻩif(p!=NULL)ﻩﻩprintf("结点找到了!\n");ﻩelse ﻩprintf("结点未找到!\n");}3..已知一个单链表,编写一个删除其值为x的结点的前趋结点的算法。解:本题的算法思想是:先找到值为x的结点*p和它的前趋结点*q,要删除*q,只需把*p的值x放到*q的值域中,再删除结点*p即可。实现本题功能的函数如下:voiddelete(node*head,intx){node*p,*q; q=head;ﻩp=head->next;ﻩwhile((p!=NULL)&&(p->data!=x)){q=p;ﻩp=p->next;}ﻩif(p==NULL) ﻩprintf("未找到x!\n");elseif(q==head)ﻩ printf("x为第一个结点,无前趋!\n");else{ q->data=x; q->next=p->next; free(p);}}4.4.已知一个单链表,编写一个函数从此单链表中删除自第i个元素起的length个元素。解:实现本题功能的函数如下:voiddeletelength(node*head,inti,intlength){node*p,*q;ﻩintj; if(i==1) for(j=1;j<=length;j++)/*删除前k个元素*/ﻩﻩ{p=head;/*p指向要删除的结点*/ head=head->next;ﻩﻩ free(p);ﻩ }ﻩelse解:实现本题功能的函数如下:voiddeletelength(node*head,inti,intlength){node*p,*q;ﻩintj;ﻩif(i==1) ﻩfor(j=1;j<=length;j++)/*删除前k个元素*/ﻩ {p=head;/*p指向要删除的结点*/ ﻩ head=head->next;ﻩﻩﻩfree(p);ﻩﻩ} else{p=head; ﻩfor(j=1;j<=i-2;j++) p=p->next;/*p指向要删除的结点的前一个结点*/ﻩﻩfor(j=1;j<=length;j++)ﻩ { ﻩq=p->next;/*q指向要删除的结点*/ﻩﻩ p->next=q->next; ﻩfree(q);ﻩ } }}5.已知一个递增有序的单链表,编写一个函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然递增有序。解:本题算法的思想是:先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,然后插入该结点。实现本题功能的函数如下:voidinsert(node*head,intx){ node*s,*p,*q;ﻩs=(node*)malloc(sizeof(node));/*建立一个待插入的结点*/ s->data=x; s->next=NULL;if(head==NULL||x<head->data)/*若单链表为空或x小于第一个结点data域*/{ s->next=head;/*插入到表头后面*/ head=s; } elseﻩ{ q=head;ﻩ p=q->next; ﻩwhile(p!=NULL&&x>p->data){ ﻩﻩq=p; ﻩﻩp=p->next; ﻩ}ﻩﻩs->next=p;/*插入结点*/ﻩﻩq->next=s;ﻩ}}6.已知一个单链表,编写一个函数将此单链表复制一个拷贝。解:本题算法的思想是依次查找原单链表(其头指针为head1)中的每个结点,对每个结点复制一个新结点并链接到新的单链表(其头指针为head2)中。实现本题功能的函数如下:voidcopy(node*head1,node*head2){ﻩnode*p,*q,*s;ﻩhead2=(node*)malloc(sizeof(node));ﻩq=head2;q->data=head1->data;p=head1->next; while(p!=NULL) {ﻩ s=(node*)malloc(sizeof(node));ﻩﻩs->data=p->data;ﻩﻩq->next=s; q=s;ﻩ p=p->next;ﻩ} q->next=NULL;}7.有一个共10个结点的单链表,试设计一个函数将此单链表分为两个结点数相等的单链表。解:本题的算法思想是:在原单链表一半处将其分开,第5个结点的next域置为空,为第一个单链表的表尾。第二个单链表的表头指针指向原单链表的第6个结点。实现本题功能的函数如下,函数返回生成的第二个单链表的表头指针,第一个单链表仍然使用原单链表的表头指针。node*divide(node*head1){ node*head2,*prior; head2=head1;ﻩfor(inti=1;i<=5;i++) { prior=head2;ﻩhead2=head2->next; } prior->next=NULL;ﻩreturnhead2;}8.与上题相同的单链表,设计一个函数,将此单链表提成两个单链表,规定其中一个仍以原表头指针head1作表头指针,表中顺序涉及原线性表的第一、三等奇数号结点;另一个链表以head2为表头指针,表中顺序涉及原单链表第二、四等偶数号结点。解:本题算法的思想是将第一个链表中的所有偶数序号的结点删除,同时把这些结点链接起来构成第二个单链表。实现本题功能的函数如下:voidsplit(node*head1,node*head2){ node*temp,*odd,*even;ﻩodd=head1; head2=head1->next; temp=head2;while(odd!=NULL&&odd->next!=NULL) { ﻩeven=odd->next;/*even指向偶数序号的结点*/ﻩﻩodd->next=even->next; ﻩtemp->next=even;ﻩ temp=even;ﻩ odd=odd->next;/*odd指向奇数序号的结点*/ } even->next=NULL;}9.已知一个指针p指向单循环链表中的一个结点,编写一个对此单循环链表进行遍历的算法。解:本题的算法思想是:由于是单循环链表,所以只要另设一指针q指向p用来帮助判断是否已经遍历一遍即可。实现本题功能的函数如下:voidtravel(node*p){node*q=p;ﻩwhile(q->next!=p) { printf("%4d",q->data);ﻩ q=q->next; }ﻩprintf("%4d",q->data);}10.已知一个单循环链表,编写一个函数,将所有箭头方向取反。解:本题算法的思想是:从头到尾扫描该循环链表,将第一个结点的next域置为NULL,将第二个结点的next域指向第一个结点,如此直到最后一个结点,便用head指向它。由于是循环链表,所以鉴定最后一个结点时不能用p->next=NULL作为条件,而是用q指向第一个结点,以p!=q作为条件。实现本题功能的函数如下:voidinvert(node*head){ﻩnode*p,*q,*r;p=head;q=p->next;ﻩwhile(p!=q) {ﻩﻩr=head;ﻩ while(r->next!=p) ﻩ r=r->next;ﻩﻩp->next=r;ﻩ p=p->next;ﻩ} q->next=head;}11.在双链表中,若仅知道指针p指向某个结点,不知头指针,能否根据p遍历整个链表?若能,试设计算法实现。解:能。本题的算法思想是:分别从p开始沿着next以及prior向右、向左扫描直至各自的链为空即可遍历整个链表。实现本题功能的函数如下:voidtravellist(node*p){node*q;ﻩq=p;ﻩwhile(q!=NULL)ﻩ{ printf("%4d",q->data); q=q->next;ﻩ}q=p->prior; while(q!=NULL)ﻩ{ﻩﻩprintf("%4d",q->data);ﻩﻩq=q->prior;ﻩ}}12.试编写一个在循环双向链表中进行删除操作的算法,规定删除的结点是指定结点p的前趋结点。解:实现本题功能的算法如下:voiddeleteprior(node*p){ node*pri,q;ﻩpri=p->prior;ﻩq=pri->prior;ﻩif(pri==p) ﻩprintf("p结点无前趋!\n");第三章二、算法设计题习题解答(3)一、基本知识题答案1.什么是栈?什么是队列?它们各自的特点是什么?答:栈是限定在表的一端进行插入或删除操作的线性表;队列是元素的添加在表的一端进行,而元素的删除在表的另一端进行的线性表;栈的特点是后进先出,队列的特点是先进先出。2.线性表、栈、队列有什么异同?答:栈和队列都是线性表,但是是受限的线性表,对插入、删除运算加以限制。栈是只允许在一端进行插入、删除运算,因而是后进先出表;而队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表。3.简述栈的入栈、出栈操作的过程。答:栈的入栈、出栈操作均在栈顶进行,栈顶指针指向栈顶元素的下一个位置。入栈操作先将入栈元素放到栈顶指针所指示的位置上,然后将栈顶指针加1。出栈操作先将栈顶指针减1,然后从栈顶指针指向位置取值。4.在循环队列中简述入队、出队操作的过程。答:在循环队列中,设队首指针指向队首元素,队尾指针指向队尾元素后的一个空闲元素。在队列不满时,可执行入队操作,此时先送值到队尾指针指向的空闲元素,队尾指针再加1(要取模)。在队列不空时,可执行出队操作,此时先从队首指针指向处取值,队首指针再加1(要取模)。二、算法设计题答案1.设用一维数组stack[n]表达一个堆栈,若堆栈中一个元素需占用length个数组单元(length>1),试写出其入栈、出栈操作的算法。解:用一整型变量top表达栈顶指针,top为0时表达栈为空。假如栈不空,则从stack[1]开始存放元素。实现本题功能的函数如下:入栈算法:voidPush(EleTypex){ if((top+length)>n) printf("上溢出\n");ﻩelse{ﻩif(top==0)/*为空栈*/{ top++;ﻩﻩﻩstack[top]=x;ﻩ } elseﻩ {ﻩﻩ top=top+length;ﻩ ﻩstack[top]=x; }ﻩ}}出栈算法:voidPop(EleTypex){ﻩif(top==0) printf("为空栈\n"); elseﻩ{ﻩﻩif(top==1) { x=stack[top];top--;ﻩﻩ} elseﻩﻩ{ x=stack[top]; ﻩﻩtop=top-length; }ﻩ}}2.试编写一个遍历及显示队列中元素的算法。解:设表达式在字符数组a[]中,使用一堆栈S来帮助判断。实现本题功能的函数如下:intcorrect(chara[]){StackS; InitStack(S);ﻩfor(i=0;i<strlen(a);i++)ﻩﻩif(a[i]=='(')ﻩﻩ Push(S,'(');ﻩ elseif(a[i]==')'){ﻩ ﻩif(StackEmpty(S)) ﻩﻩreturn0; else ﻩﻩPop(S);ﻩ } if(StackEmpty(S)) return1;/*配对对的*/ ﻩelsereturn0;/*配对错误*/}3.设一循环队列Queue,只有头指针front,不设尾指针,另设一个内含元素个数的计数器,试写出相应的入队、出队算法。解:实现本题功能的函数如下:voidtravel(Queue,intfront,rear){ﻩinti; for(i=front;i<=rear;i++){ﻩ printf("%4d",Queue[i]);ﻩ}}4.设计一算法能判断一个算术表达式中的圆括号配对是否对的。(提醒:对表达式进行扫描,凡碰到“(”就进栈,碰到“)”就退出栈顶的“(”,表达式扫描完毕时栈若为空则圆括号配对对的。)解:用一个循环数组Queue[0,n-1]表达该循环队列,头指针为front,计数器count用来记录队列中结点的个数。入队算法如下:voidenqueue(intx){ﻩinttemp; if(count==n) ﻩprintf("队列上溢出\n");ﻩelse{ ﻩcount++;ﻩﻩtemp=(front+count)%n; Queue[temp]=x; }}出队算法如下:intdequeue(){inttemp;if(count==0) printf("队列下溢出\n"); else {temp=Queue[front]; front=(front+1)%n;count--; ﻩreturntemp;ﻩ}}数据结构(本科)期末综合练习一(单选题)单选题1.一个数组元素a[i]与(A)的表达等价。A.*(a+i)B.a+iC.*a+iD.&a+i2.若需要运用形参直接访问实参,则应把形参变量说明为(B)参数。A.指针B.引用C.传值D.常值3.下面程序段的时间复杂度为(C)。for(inti=0;i<m;i++)for(intj=0;j<n;j++)a[i][j]=i*j;A.O(m2)B.O(n2)C.O(m*n)D.O(m+n)4.执行下面程序段时,执行S语句的次数为(D)。for(inti=1;i<=n;i++)for(intj=1;j<=i;j++)S;A.n2B.n2/2C.n(n+1)D.n(n+1)/25.下面算法的时间复杂度为(B)。intf(unsignedintn){if(n==0||n==1)return1;elsereturnn*f(n-1);}A.O(1)B.O(n)C.O(n2)D.O(n!)6.一种抽象数据类型涉及数据和(B)部分。A.数据类型B.操作C.数据抽象D.类型说明7.当一个作为实际传递的对象占用的存储空间较大并也许被修改时,应最佳说明为(B),以节省参数值的传输时间和存储参数的空间。A.基本类型B.引用型C.指针型D.常值引用型8.当需要进行标准I/O操作时,则应在程序文献中包含iostream.h头文献,当需要进行文献I/O操作时,则应在程序文献中包含(A)头文献。A.fstream.hB.stdlib.hC.iomanip.hD.string.h9.一个记录r理论上占有的存储空间的大小等于所有域类型长度之和,事实上占有的存储空间的大小即记录长度为(D)。A.所有域长度之和B.最大域所占字节长度C.任意一个域长度D.sizeof(r)的值10.输出一个二维数组b[m][n]中所有元素值的时间复杂度为(D)。A.O(n)B.O(m+n)C.O(n2)D.O(m*n)11.一个算法的时间复杂度为(3n2+2nlog2n+4n-7)/(5n),其数量级形式的复杂度表达为(A)。A.O(n)B.O(nlog2n)C.O(n2)D.O(log2n)12.某算法的时间代价为T(n)=100n+10nlog2n+n2+10,其时间复杂度为(C)。A.O(n)B.O(nlog2n)C.O(n2)D.O(1)13.某算法仅含程序段1和程序段2,程序段1的执行次数3n2,程序段2的执行次数为0.01n3,则该算法的时间复杂度为(C)。A.O(n)B.O(n2)C.O(n3)D.O(1)14.以下说法错误的是(C)。A.抽象数据类型具有封装性。B.抽象数据类型具有信息隐蔽性。C.使用抽象数据类型的用户可以自己定义对抽象数据类型中数据的各种操作。D.抽象数据类型的一个特点是使用与实现分离。15.在二维数组中,每个数组元素同时处在(C)个向量中。A.0个ﻩ B.1个ﻩﻩC.2个 D.n个16.多维数组事实上是由嵌套的(A)实现的。A.一维数组B.多项式C.三元组表D.简朴变量17.在一个长度为n的顺序表中顺序搜索一个值为x的元素时,在等概率的情况下,搜索成功时的数据平均比较次数为(C)。A.nB.n/2C.(n+1)/2D.(n-1)/218.在一个长度为n的顺序表中向第i个元素(0≤i≤n-1)位置插入一个新元素时,需要从后向前依次后移(A)个元素。A.n-iB.n-i+1C.n-i-1D.i19.在一个长度为n的顺序表中删除第i个元素(0≤i≤n-1)时,需要从前向后依次前移(C)个元素。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025委托招标代理合同
- 2025【合同范本】建筑工程施工合同示本
- 2025二手空调购销合同范本
- 长城遗址修缮方案
- 促销活动合同范例
- 2024年六年级品社下册《去中学看看》说课稿2 苏教版
- 配件报价实施方案
- 2024年五年级英语下册 Unit 4 Did You Have a Nice Trip Lesson 19 Li Ming Goes Home说课稿 冀教版(三起)
- 贵州笼式球场护栏施工方案
- 砂石加工账目处理方案
- 医药高等数学智慧树知到课后章节答案2023年下浙江中医药大学
- 城市道路智慧路灯项目 投标方案(技术标)
- 水泥采购投标方案(技术标)
- 医院招标采购管理办法及实施细则(试行)
- 初中英语-Unit2 My dream job(writing)教学设计学情分析教材分析课后反思
- 广州市劳动仲裁申请书
- 江西省上饶市高三一模理综化学试题附参考答案
- 23-张方红-IVF的治疗流程及护理
- 顶部板式吊耳计算HGT-20574-2018
- 因数和倍数复习思维导图
- LY/T 2986-2018流动沙地沙障设置技术规程
评论
0/150
提交评论