• 扬州大学2022年858程序设计与数据结构试题参考答案


    扬 州 大 学
    2022年硕士研究生招生考试初试试题(A卷)参考答案
    科目代码:858 科目名称:程序设计与数据结构 满分:150分

    注意:答案为个人自制,非官方答案。

    一、应用题

    1. 参考答案
      例如,有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。每个学生的基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前驱和直接后继。学生记录之间的这种关系就确定了学生表的逻辑结构,即线性结构。这些学生记录在计算机中的存储表示就是存储结构。如果用连续的存储单元(如用数组表示))来存放这些记录,则称为顺序存储结构;如果存储单元不连续,而是随机存放各个记录,然后用指针进行链接,则称为链式存储结构。即相同的逻辑结构,可以对应不同的存储结构。

    2. 参考答案
      H(H(T(H(T(H(T(L)))))))。

    3. 参考答案
      (1) 或为空树,或为只有根结点的二叉树。
      (2) 或为空树,或为任一结点至多只有左子树的二叉树。
      (3) 或为空树,或为任一结点至多只有右子树的二叉树。
      (4) 或为空树,或为任一结点至多只有右子树的二叉树。

    4. 参考答案
      (1) 哈夫曼树如下图所示,其编码如下表所示。

      image-20220905103039737

      字母频率哈夫曼编码等长二进制编码
      0.071010000
      0.1900001
      0.0210000010
      0.061001011
      0.3211100
      0.0310001101
      0.2101110
      0.101011111

      (2) 二进制等长编码如上表所示。
      (3) 对于上述两种方案,等长编码的构造显然比哈夫曼编码的构造简单。但是,哈夫曼编码是最优前缀编码,其加权路径长度为2.61,而等长二进制编码的加权路径长度为3。

    5. 参考答案
      (1) 邻接矩阵如下
      { ∞ 4 3 ∞ ∞ ∞ ∞ ∞ 4 ∞ 5 5 9 ∞ ∞ ∞ 3 5 ∞ 5 ∞ ∞ ∞ 5 ∞ 5 5 ∞ 7 6 5 4 ∞ 9 ∞ 7 ∞ 3 ∞ ∞ ∞ ∞ ∞ 6 3 ∞ 2 ∞ ∞ ∞ ∞ 5 ∞ 2 ∞ 6 ∞ ∞ 5 4 ∞ ∞ 6 ∞ } \left\{ 4345593555557654973632526546

      4345593555557654973632526546
      \right\} 4345593555557654973632526546
      (2) 邻接表如下所示
      image-20220905104048342

      (3) 最小生成树如下所示
      image-20220905104203817

    6. 参考答案
      证明:
      假设 n 0 、 n 1 、 n 2 n_0、n_1、n_2 n0n1n2,分别是二叉树中度为0,1,2结点的个数。
      首先由二叉树的性质可得 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
      又因为二叉树为满二叉树,且有N个结点
      则可得 n 0 + n 1 + n 2 = N n_0+n_1+n_2=N n0+n1+n2=N n 1 = 0 n_1=0 n1=0,即 n 0 = N − n 2 n_0=N-n_2 n0=Nn2
      则可得 2 n 0 = N + 1 2n_0=N+1 2n0=N+1,即 n 0 = ( N + 1 ) / 2 n_0 =(N+1)/2 n0=(N+1)/2

    二、算法题

    1. 参考答案

      void Intersection(LinkList &La, LinkList &Lb, LinkList &Lc)
      {
          pa=La->next;
          pb=Lb->next;
          Lc=pc=La; 
          while(pa&&pb) 
          {
              if(pa->data==pb->data) 
              {
                  pc->next=pa; pc=pa; pa=pa->next; 
                  u=pb; pb=pb->next; delete u; 
              }
              else if (pa->data<pb->data)
              {
                  u=pa; pa=pa->next; delete u;
              }
              else 
              {
                  u=pb; pb=pb->next; delete u;
              }
          }
          while (pa) 
          {
              u=pa; pa=pa->next; delete u;
          }
          while(pb)
          {
              u=pb; pb=pb->next; delete u;
          }
          pc->next=NULL; 
          delete Lb;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
    2. 参考答案

      void Inverse(LinkList &L)
      {
          p=L->next;
          L->next=NULL;
          while(p!=NULL)
          {
              q-p->next; 
              p->next=L->next;
              L->next=p; 
              p=q;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    3. 参考答案

      (1) 算法实现

      int IsEqual(int a[m][n],int m,int n)
      {   int i,j,k,p;
          for(i=0;i<m;i++)
              for(j=0;j<n-1;j++)
              {
                  for(p=j+1;p<n; p++;)//和同行其他元素比较
                      if(a[i][j]==a[i][p])//只要有一个相同,则不是互不相同
                      {           
                          printf("no");
                          return 0;
                      }
                  for(k=i+1;k<m;k++)//和第i+1行及以后元素比较
                      for(p=0;p<n;p++)
                      {
                          if(a[i][j]==a[k][p])
                          printf("no");
                          return 0;
                      }   
              }
          printf("yes");
          return 1;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      (2) 算法分析

      二维数组中的每一个元素同其他元素都比较一次,数组总计包括m*n个元素,第1个元素同其她m*n-1个元素比较,第2个元素同其它m*n-2个元素比较…第m*n-1个元素同最后一个元素(m*n)比较一次。因此,在元素互不相等的情况下,总的比较次数为:(m*n-1)+(m*n-2)+…+2+1=(m*n)(m*n-1)/2。在存在相同元素的情况下,可能第一次比较时相同,也可能最后一次比较时相同,假设在每个位置上均可能相同,总计包括(m*n-1)个位置,这时的平均比较次数约为(m*n)(m*n-1)/4。因此,算法的时间复杂度是 O ( n 4 ) O(n^4) O(n4)

    4. 参考答案

      int Level(BiTree T)
      {
          num=0;
          if(T)
          {
              InitQueue(Q); 
              EnQueue(Q,T); 
              while(!QueueEmpty(Q))
              {
                  DeQueue(Q,p); 
                  printf("%d",p->data);//假设值为整数 
                  if((p->lchilds&!p->rchild)I1(p->lchild&&p->rchild))
                      num++;
                  if(p->lchild) EnQueue(Q,p->lchild);
                  if(p->rchild) EnQueue(Q,p->rchild);
              }
          }
          return num;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
    5. 参考答案

      void Process(int a[],int n)
      {
          low=0;
          high=n-1;
          while(low<high)
          {
              while(low<high&&a[low]<0)//找到从左向右的非负值记录
                  low++;
              while(low<high&&a [high]>0)//找到从右向左的负值记录
                  high--;
              if(low<high)//如果需要交换,即low
              {
                  temp=a[low];
                  a[low]=a[high];
                  a[high]=temp;//交换记录
                  low++;//继续向后找
                  high--;
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
    6. 参考答案

      (1) 算法思想

      • 求出各顶点的人度存人数组indegree[i]中,并将人度为0的顶点人栈。

      • 只要栈不空,则重复以下操作:

        • 将栈顶顶点vi出栈并保存在拓扑序列数组topo中;
        • 对顶点vi的每个邻接点vk的入度减1,如果v的入度变为0,则将vk入栈。
      • 如果输出顶点个数少于AOV网的顶点个数,则网中存在有向环,无法进行拓扑排序,否则拓扑排序成功。

      (2) 算法描述

      //有向图G采用邻接表存储结构
      //若G无回路,则生成c的一个拓扑序列topo[]并返回oK,否则ERROR
      Status TopologicalSort (ALGraph G,int topo [ ])
      {
          FindInDegree(G,indegree);//求出各顶点的入度存入数组indegree中
          InitStack(S);//栈S初始化为空
          for(i=0;i<G.vexnum;++i)
              if(!indegree[i]) Push(s,i);//入度为0者进栈
          m=O;//对输出顶点计数,初始为0
          while(!StackEmpty(S))//栈s非空
          {
              Pop (s,i);//将栈顶顶点vi出栈
              topo [m]=i;//将vi保存在拓扑序列数组topo中
              ++m;//对输出顶点计数
              p=G.vertices[i].firstarc;//p指向vi的第一个邻接点
              while(p!=NULL)
              {
                  k=p->adjvex;//vk为vi的邻接点
                  --indegree[k] ;//v;的每个邻接点的入度减1
                  if(indegree[k]==O) Push(S,k);//若入度减为0,则入栈
                  p=p->nextarc;//p指向顶点vi下一个邻接结点
              }
          }
          if(m<G.vexnum)return ERROR;//该有向图有回路
          else return OK;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26

      三、补充说明

      作者:@江上_酒
      扬州大学信息工程学院2022届考研情况分析
      扬州大学858程序设计与数据结构专业课(资料篇)
      扬州大学858程序设计与数据结构专业课(编程题篇)

  • 相关阅读:
    Redis数据类型(list\set\zset)
    毕业设计论文 免费领取源码 11819-SSM 球鞋资讯交流平台
    从零开始之了解电机及其控制(10)空间矢量理论
    数据结构第28节 字典树
    Unity il2cpp API 调用实践
    Windows批处理
    MFC中LISTCONTROL控件的相关操作
    ELK日志系统
    ROS导航——环境感知(激光雷达)
    算法与数据结构【30天】集训营——线性表的顺序查找、折半(二分)查找、分块查找(14)
  • 原文地址:https://blog.csdn.net/WHISTLE_ZXL/article/details/126700587