• 【2021届】数据结构期末实验考试


    一、选择题

    选择题是随机的!我这只记录我错的三道

    1、一个有n个结点的图,最多有( A )个连通分量。

    A.n

    B.1

    C.0

    D.n-1

    最多n个点 一个点就是一个连通图 

    最少1个连通图

     

    二、程序填空题

    1、要求建立一个无向图,采用邻接矩阵做为存储结构。
    例如

    输入信息为

    第一行给出图的顶点数n和边数e。

    第二行给出n个字符,表示n个顶点的数据元素的值。

    后面是e行,给出每一条边的两个顶点编号。

    输出每个顶点的值以及各顶点的邻接点的值。
    输入样例

    1. 7 9
    2. 0123456
    3. 0 2
    4. 0 3
    5. 0 4
    6. 1 3
    7. 1 5
    8. 2 3
    9. 2 5
    10. 4 5
    11. 5 6

    输出样例

    1. 0: 2 3 4
    2. 1: 3 5
    3. 2: 0 3 5
    4. 3: 0 1 2
    5. 4: 0 5
    6. 5: 1 2 4 6
    7. 6: 5
    1. #include <stdio.h>
    2. #define MVNum 100 //最大顶点数
    3. typedef struct{
    4. char vexs[MVNum]; //存放顶点的一维数组
    5. int arcs[MVNum][MVNum]; //邻接矩阵
    6. int vexnum,arcnum; //图的当前顶点数和边数
    7. }MGraph;
    8. void CreatMGraph(MGraph *G);/* 创建图 */
    9. void printGraph(MGraph G);/*输出图 */
    10. int main()
    11. {
    12. MGraph G;
    13. CreatMGraph(&G);
    14. printGraph(G);
    15. return 0;
    16. }
    17. void CreatMGraph(MGraph *G)
    18. {
    19. int i,j,k;
    20. char a;
    21. scanf("%d%d",&G->vexnum,&G->arcnum);
    22. getchar();
    23. for(i=0;i<G->vexnum;i++)
    24. scanf("%c",&G->vexs[i]); //第一空
    25. for(i=0;i<G->vexnum;i++)
    26. for(j=0;j<G->vexnum;j++)
    27. G->arcs[i][j]=0; //第二空
    28. for(k=0;k<G->arcnum;k++)
    29. {
    30. scanf("%d%d",&i,&j);
    31. G->arcs[i][j]=1; //第三空
    32. G->arcs[j][i]=1; //第四空
    33. }
    34. }
    35. void printGraph(MGraph G)
    36. {
    37. int i,j;
    38. for(i=0;i<G.vexnum;i++)
    39. {
    40. printf("%c:",G.vexs[i]);
    41. for(j=0;j<G.vexnum;j++)
    42. if (G.arcs[i][j]) printf(" %c",G.vexs[j]);
    43. printf("\n");
    44. }
    45. }

    2、请把一个十进制数N转换为d进制数,并输出。

    1. #include<iostream>
    2. #include<stack>
    3. using namespace std;
    4. int main()
    5. {
    6. stack <int>s;
    7. int e;
    8. int N,d;
    9. cin>>N>>d;
    10. if(d==2 ||d==8|| d==16)
    11. {
    12. while(N)
    13. {
    14. s.push(N%d); //第一空 将N与d求余得到的d进制数压入栈
    15. N=N/d;
    16. }
    17. }
    18. while(!s.empty())
    19. {
    20. e=s.top(); //第二空 获取栈顶元素e
    21. s.pop(); //第三空 弹出栈顶元素
    22. if(e>=10)
    23. cout<<char('a'+e-10);
    24. else
    25. cout<<e;
    26. }
    27. cout<<endl;
    28. return 0;
    29. }

    3、计算二叉树深度。

    1. #include<iostream>
    2. using namespace std;
    3. typedef struct BiNode
    4. {
    5. char data;
    6. struct BiNode *lchild,*rchild;
    7. }BiTNode,*BiTree;
    8. void CreateBiTree(BiTree &T)
    9. {
    10. char ch;
    11. cin >> ch;
    12. if(ch=='#') T=NULL;
    13. else{
    14. T=new BiTNode;
    15. T->data=ch;
    16. CreateBiTree(T->lchild);
    17. CreateBiTree(T->rchild);
    18. }
    19. }
    20. int Depth(BiTree T)
    21. {
    22. int m,n;
    23. if(!T) return 0; //第一空
    24. else
    25. {
    26. m=Depth(T->lchild); //第二空
    27. n=Depth(T->rchild); //第三空
    28. if(m>n) return(m+1);
    29. else return (n+1);
    30. }
    31. }
    32. int main()
    33. {
    34. BiTree tree;
    35. CreateBiTree(tree);
    36. cout<<Depth(tree);
    37. return 0;
    38. }

    4、本题目要求以头插法建立单链表。

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. typedef int ElemType;
    4. typedef struct LNode
    5. {
    6. ElemType data;
    7. struct LNode *next;
    8. }LNode,*LinkList;
    9. LinkList Create();
    10. void print( LinkList L);
    11. int main()
    12. {
    13. LinkList L = Create();
    14. print(L);
    15. return 0;
    16. }
    17. LinkList Create()
    18. {
    19. LinkList L,s;
    20. ElemType e;
    21. L = (LinkList)malloc(sizeof(LNode));
    22. L->next=NULL; //第一空
    23. scanf("%d",&e);
    24. while(e!=-1)
    25. {
    26. s = (LinkList)malloc(sizeof(LNode));
    27. s->data=e;
    28. s->next=L->next; //第二空
    29. L->next=s; //第三空
    30. scanf("%d",&e);
    31. }
    32. return L; //第四空
    33. }
    34. void print(LinkList L)
    35. {
    36. LinkList p;
    37. p=L->next;
    38. while (p)
    39. {
    40. printf("%d ", p->data);
    41. p =p->next;
    42. }
    43. }

    三、函数题

    R6-1 计算二叉树的叶子数

    本题是计算二叉树中叶子结点的个数。

    函数接口定义:

    int num (Bptr p);

    裁判测试程序样例:

    1. #include <stdio.h>
    2. #include <malloc.h>
    3. typedef struct node
    4. {
    5. int data;
    6. struct node *Lson,*Rson;
    7. }Bnode,*Bptr;
    8. int num (Bptr p);
    9. Bptr creat()
    10. {
    11. Bptr p;
    12. int x;
    13. scanf("%d",&x);
    14. if(x==0)
    15. return NULL;
    16. p=(Bptr)malloc(sizeof(Bnode));
    17. p->data=x;
    18. p->Lson=creat();
    19. p->Rson=creat();
    20. return p;
    21. }
    22. int main()
    23. {
    24. Bptr root;
    25. int k;
    26. root=creat();
    27. k=num(root);
    28. printf("%d\n", k);
    29. return 0;
    30. }
    31. /* 请在这里填写答案 */
     

    输入样例:

    3 4 1 0 0 0 2 0 0
    

    输出样例:

    2
    1. int num (Bptr p)
    2. {
    3. if(p)
    4. {
    5. if(!p->Lson&&!p->Rson)
    6. return 1+num(p->Lson)+num(p->Rson);
    7. else return num(p->Lson)+num(p->Rson);
    8. }
    9. return 0;
    10. }

    R6-2 实现基于邻接矩阵表示的深度优先遍历 

    实现基于邻接矩阵表示的深度优先遍历。

    函数接口定义:

    void DFS(Graph G, int v);

    其中 G 是基于邻接矩阵存储表示的无向图,v表示遍历起点。

    裁判测试程序样例:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define MVNum 10
    4. int visited[MVNum];
    5. typedef struct{
    6. char vexs[MVNum];
    7. int arcs[MVNum][MVNum];
    8. int vexnum,arcnum;
    9. }Graph;
    10. void CreateUDN(Graph &G);//实现细节隐藏
    11. void DFS(Graph G, int v);
    12. void DFSTraverse(Graph G){
    13. int v;
    14. for(v = 0; v < G.vexnum; ++v) visited[v] = 0;
    15. for(v = 0; v < G.vexnum; ++v)
    16. if(!visited[v]) DFS(G, v);
    17. }
    18. int main(){
    19. Graph G;
    20. CreateUDN(G);
    21. DFSTraverse(G);
    22. return 0;
    23. }
    24. /* 请在这里填写答案 */

    输入样例:

    输入第1行为结点数vexnum和边数arcnum。第2行为结点的值,依次输入arcnum行,每行输入两个结点的值表示该两个结点互为邻接点。

    1. 8 8
    2. ABCDEFGH
    3. A B
    4. A C
    5. B D
    6. B E
    7. C F
    8. C G
    9. D H
    10. E H

    输出样例:

    遍历序列。

    A B D H E C F G 
    

    1. void DFS(Graph G, int v)
    2. {
    3. visited[v]=1;
    4. printf("%c ",G.vexs[v]);
    5. for(int i=0;i<G.vexnum;i++)
    6. {
    7. if(G.arcs[v][i]==1&&visited[i]==0)
    8. DFS(G,i);
    9. }
    10. }

    四、编程题

    R7-1 冒泡排序

    输入格式:

    输入在第1行中给出N(1<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔,并保证数字没有重复的出现。

    输出格式:

    给出冒泡排序每一遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。注意:当排序完成时应立即停止

    输入样例1:

    1. 7
    2. 4 5 7 6 3 2 1

    输出样例1:

    1. 4 5 6 3 2 1 7
    2. 4 5 3 2 1 6 7
    3. 4 3 2 1 5 6 7
    4. 3 2 1 4 5 6 7
    5. 2 1 3 4 5 6 7
    6. 1 2 3 4 5 6 7

    输入样例2:

    1. 6
    2. 1 2 3 6 5 4

    输出样例2:

    1. 1 2 3 5 4 6
    2. 1 2 3 4 5 6
    1. #include <iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int n,a[101];
    6. cin>>n;
    7. for(int i=0;i<n;i++) cin>>a[i];
    8. for(int i=0;i<n-1;i++)
    9. {
    10. int flag=0;
    11. for(int j=0;j<n-1-i;j++)
    12. if(a[j]>a[j+1])
    13. swap(a[j],a[j+1]),flag=1;
    14. if(!flag) break;
    15. cout<<a[0];
    16. for(int k=1;k<n;k++) cout<<' '<<a[k];
    17. if(i!=n-2) cout<<endl;
    18. }
    19. }

    R7-2 查找最接近的元素

    在非降序排列的序列中,查找最接近x的元素。

    输入格式:

    第一行是n值;(1<=n<=105)

    第二行是n个元素; (元素值<=109)

    第三行是m值,表示有m次查询;
    第四行有m个数,分别是要查询的x.

    输出格式:

    对于每次查询,输出最接近x的元素值。若有多个,输出最小那个。

    输入样例:

    1. 5
    2. 0 1 7 8 9
    3. 2
    4. 3 8

    输出样例:

    1. 1
    2. 8

    不是二分的解法 最后一个点喜闻乐见的运行超时 这题用二分就不会 我第一次在考场上写的就是这

    1. #include <iostream>
    2. #include <cmath>
    3. using namespace std;
    4. const int N=1e5+10;
    5. int main()
    6. {
    7. int n,a[N],m,x,t,res;
    8. cin>>n;
    9. for(int i=0;i<n;i++) cin>>a[i];
    10. cin>>m;
    11. while(m--)
    12. {
    13. cin>>x;
    14. int minx=0x3f3f3f3f;
    15. for(int i=0;i<n;i++)
    16. {
    17. t=abs(a[i]-x);
    18. if(t<=minx)
    19. {
    20. minx=t;
    21. res=a[i];
    22. }
    23. }
    24. cout<<res<<endl;
    25. }
    26. }

    二分——教材

    1. #include <iostream>
    2. #include <cmath>
    3. using namespace std;
    4. const int N=1e5+10;
    5. int n,a[N],m,x;
    6. int dic(int a[],int x)
    7. {
    8. int l=0,r=n-1;
    9. while(l<r)
    10. {
    11. int mid=l+r>>1;
    12. if(a[mid]==x) return x;
    13. else if(a[mid]>x) r=mid-1;
    14. else l=mid+1;
    15. }
    16. if(abs(a[l]-x) < abs(a[r]-x)) return a[l];
    17. else if(abs(a[l]-x) >= abs(a[r]-x)) return a[r];
    18. }
    19. int main()
    20. {
    21. cin>>n;
    22. for(int i=0;i<n;i++) cin>>a[i];
    23. cin>>m;
    24. while(m--)
    25. {
    26. cin>>x;
    27. cout<<dic(a,x)<<endl;
    28. }
    29. }

    二分——acw模板 

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N=1e5+10;
    4. int a[N];
    5. int n,q,x;
    6. void solve()
    7. {
    8. cin>>x;
    9. int l=1,r=n;
    10. while(l<r) //res1为大于x的最小值
    11. {
    12. int mid=l+r>>1;
    13. if(a[mid]>=x)r=mid;
    14. else l=mid+1;
    15. }
    16. int res1=a[r];
    17. l=1,r=n;
    18. while(l<r) //res2为小于x的最大值
    19. {
    20. int mid=l+r+1>>1;
    21. if(a[mid]<=x)l=mid;
    22. else r=mid-1;
    23. }
    24. int res2=a[r];
    25. if(abs(x-res1) < abs(x-res2)) cout<<res1<<endl;
    26. else cout<<res2<<endl;
    27. }
    28. signed main()
    29. {
    30. cin>>n;
    31. for(int i=1;i<=n;i++)cin>>a[i];
    32. cin>>q;
    33. while(q--)
    34. {
    35. solve();
    36. }
    37. return 0;
    38. }

  • 相关阅读:
    2020金融密码杯
    C++基础知识(十二)--- STL基本概念
    元宇宙产业委风语筑董事长李晖:到更多城市探索元宇宙“虚实结合”
    c++飞机大战架构
    Spring5 框架新功能
    Vuejs
    Docker Hub使用
    ve-plus:基于 vue3.x 桌面端UI组件库|vue3组件库
    小程序多少钱?一个小程序多少钱?
    Java 原生编译的 Solon 回忆录
  • 原文地址:https://blog.csdn.net/weixin_61639349/article/details/125412748