目录

基本情况

具体题目

1 线性表1

2 线性表2

3 栈

4 二叉树

5 树

6 图

7 排序

自我练习

声明


基本情况

对应课程:程序设计与算法基础II(数据结构与算法基础)

考试时间:3小时

题型:函数题

2020年为程算II笔试,无机考;因此仅提供2021年的

每个题目均会完整给出 一、已知条件   二、任务描述   三、编码要求 (包括提示) 三个部分;

第四部分为编者的答案,可能不是最优,欢迎探讨。


具体题目

1 线性表1

(题目编号:176)

一、已知条件

有线性表的存储结构表示如下:

#define MAXLEN  128typedef struct {int elem[MAXLEN]; //存储数据的数组。下标从0开始。unsigned len;     //数组中数据的个数
} list;

二、任务描述

请设计一个算法,其功能是:

  • 在一个给定的线性表中,移除所有能被指定正整数整除的元素
  • 操作完成后的线性表中保留的元素呈连续存储的状态

三、编码要求

1. 算法函数原型

void remove_elem(list *L, unsigned f);
  • 功能:在线性表L中移除所有能被f整除的元素。
  • 参数:
    L:指向线性表的指针。线性表可能为空。
    f:整除因子。测试用例保证f不小于2。
  • 返回值:无

2. 编码约束

  • 时间复杂度:O(L->len)
  • 空间复杂度:O(1)

四、参考答案

/** 完成人 :**** 完成时间:**** 系统评分:100*/#include "176.h" //本题所需头文件,请勿删除!
/* * 功能:*      在线性表L中移除所有能被f整除的元素。* 参数:*      L:指向线性表的指针。线性表可能为空。*      f:整除因子。测试用例保证f不小于2。* 返回值:*      无*/
void remove_elem(list *L, unsigned f) {//TODOint tmp[1000]={0};int cou=0;for(int i=0;i<L->len;i++){if(L->elem[i]%f!=0)tmp[cou++]=L->elem[i];}for(int i=0;i<cou;i++){L->elem[i]=tmp[i];}L->len=cou;return;
}

2 线性表2

(题目编号:177)

一、已知条件

有单链表表示的线性表结构定义如下:

//定义节点类型
typedef struct _node {int data;           //数据域struct _node *next; //指针域
} node;//定义单链表类型
typedef struct {node *head;      //头指针unsigned len;    //链表中的节点数量
} list;

现已知有两个上述类型的线性表La和Lb,二者在某个结点处融合在一起。如图 q2.png 所示:

提示:该图只是一个示例,La不一定总是比Lb长;两个链表都可能为空。

二、任务描述

请设计一个算法,计算两个链表共享结点的数量。

三、编码要求

1. 算法函数原型

int list_shared(list *La, list *Lb);
  • 功能:计算并返回线性表La和Lb的共享结点的数量
  • 参数:La和Lb都是指向线性表的指针
  • 返回值:La和Lb共享结点的数目

2. 编码约束

  • 时间复杂度:O(max(La->len, Lb->len))
  • 空间复杂度:O(1)

四、参考答案

/** 完成人 :**** 完成时间:**** 系统评分:100*/#include "177.h" //本题所需头文件,请勿删除!
/* * 功能:*      统计两个线性表中共享结点的个数。* 参数:*      La和Lb:指向线性表的指针。* 返回值:*      La和Lb共享结点的数目。*///答案一(编者答案)
int list_shared(list *La, list *Lb) {//TODOif(La->head==NULL||Lb->head==NULL) return 0;node* p,*q;p=La->head;q=Lb->head;while(p->next!=NULL){p=p->next;}while(q->next!=NULL){q=q->next;}if(p!=q) return 0; p=La->head;q=Lb->head;//int num=0;while(p!=q){if(p->next==NULL){p=La->head;}else{p=p->next;}if(q->next==NULL){q=Lb->head;}else{q=q->next;}}int cou=1;while(p->next!=NULL){p=p->next;cou++;}return cou;
}//答案二(某同学答案)
//个人认为这个答案不满足时间复杂度要求,但是仍然通过
int list_shared(list *La, list *Lb) {node *p = La->head,*q = Lb->head;if(p==NULL||q == NULL)  return 0;int cnt = 0;for(;p!=NULL;p = p->next){for(;q!=NULL;q = q->next){if(p == q){cnt++;break;}}q = Lb->head;}return cnt;
}

3 栈

(题目编号:178)

一、已知条件

有一个递归函数如下:

void reverse() {char c = getchar();if (c == '.') return;reverse();putchar(c);
}

其功能是将输入的字符序列(以'.'结尾)倒序输出(不包括'.')。例如:
输入:abc123.
输出:321cba

另有可用的接口函数如下:

void push(stack *S, char x);    //将字符x压入栈S。S是指向栈的指针
char pop(stack *S);             //弹栈,返回S栈顶数据
bool empty(stack * S);          //测试栈S是否为空。如果为空,返回true,否则返回false

二、任务描述

请设计一个算法,利用栈,消除reverse()中的递归,但功能不变。

三、编码约束

1. 算法函数原型:

void reverse(stack *S);
  • 功能:将输入的字符序列倒序输出。输入以'.'结尾
  • 参数:S是指向栈的指针。栈S已经初始化
  • 返回值:无

2. 编码约束

  • 时间复杂度:无特别要求
  • 空间复杂度:O(1)(不计栈空间)

提示:常量空间复杂度意味着,除了使用栈和单个变量,你不能定义类似于数组这样的辅助存储。

四、参考答案

/** 完成人 :**** 完成时间:**** 系统评分:100*/#include "178.h" //本题所需头文件,请勿删除!
/* * 功能:*      将输入的字符序列(以'.'结尾)倒序输出。* 参数:*      S是指向栈的指针。栈S已经初始化。* 返回值:*      无。*/
void reverse(stack *S) {//TODO 输入字符请用getchar()char c = getchar();while(c!='.'){push(S,c);c=getchar();}while(!empty(S)){char x=pop(S);if(x=='.') continue;else{putchar(x);}}return;}

4 二叉树

(题目编号:179)

一、已知条件

设有两棵二叉树t1和t2。如果t2是t1左右翻转得到,如图 q4.png 所示:

那么称二叉树t1和t2互为镜像

二叉树的存储结构如下:

typedef struct _btree_node {char tag;   //二叉树结点的字符标签struct _btree_node *left, *right; //左子树和右子树
} btree_node, *btree;

二、任务描述

请设计一个算法,实现一棵二叉树的镜像翻转。

三、编码约束

1. 算法函数原型:

btree mirror(btree tree);
  • 功能:生成二叉树tree的镜像二叉树,返回镜像二叉树的根结点指针
  • 参数:tree是指向源二叉树根结点的指针
  • 返回值:指向二叉树tree的镜像二叉树根结点的指针

2. 编码约束

  • 时间复杂度:无特别要求
  • 空间复杂度:无特别要求

四、参考答案

/** 完成人 :**** 完成时间:**** 系统评分:100*/#include "179.h" //本题所需头文件,请勿删除!
/** 生成二叉树tree的镜像二叉树* 参数*      tree:源二叉树的根结点指针* 返回值*      镜像二叉树的根结点指针*/btree mirror(btree tree) {//TODOif (tree == NULL)  return NULL;btree left = mirro(tree->left);btree right = mirro(tree->right);tree->left = right;tree->right = left;return tree;}

5 树

(题目编号:180)

一、已知条件

设有如图 q5-1.png 的一棵树:

那么这棵树的 层次遍历 顺序就是:ABFGCDHE

如果这样的树的存储结构用如下 孩子-兄弟 表示法:

typedef struct csnode {char data;              //结点的字符标签struct csnode *first;   //指向结点的第一个孩子结点struct csnode *sibling; //指向结点的下一个兄弟结点
} csnode, *cstree;

利用以上存储结构的树可以形象地示意为图 q5-2.png:

其中,土黄色结点是其双亲结点的第一个孩子。

另有可用的 队列 操作的接口如下:

bool queue_enter(queue *Q, void *v); //数据v进队Q。参数Q是指向队列的指针,v的类型是任意类型指针。
void* queue_leave(queue *Q); //数据出队。该数据是函数的返回值,其类型是任意类型指针。
bool queue_empty(queue *Q); //测试队列Q是否为空,如果为空返回真,否则返回假。

再有访问树结点的函数如下:

void visit(cstree node);

其功能是输出结点node的字符标签。

二、任务描述

请设计一个算法,实现树的层次遍历

三、编码要求

1.算法函数原型

void layer(cstree root, queue *Q);
  • 功能:对树tree进行层次遍历。遍历到某个结点node时,调用visit(node)来访问该结点

    提示:如果是空树,则遍历没有输出。

  • 参数:
    root: 指向树根结点的指针
    Q: 指向已初始化的队列的指针
  • 返回值:无

2. 编码约束

  • 时间复杂度:无特别要求
  • 空间复杂度:无特别要求

四、参考答案

/** 完成人 :**** 完成时间:**** 系统评分:100*/#include "180.h" //本题所需头文件,请勿删除!
/** 功能*      层次遍历树* 参数*      root:树的根结点指针*      Q:    队列指针。队列Q已经初始化了* 返回值*      无*/
void layer(cstree root, queue *Q) {//TODOif(root==NULL)return;queue_enter(Q,root);while(!queue_empty(Q)){cstree p=(cstree)queue_leave(Q);visit(p);if(p->first!=NULL){queue_enter(Q,p->first);cstree tmp=p->first->sibling;while(tmp!=NULL){queue_enter(Q,tmp);tmp=tmp->sibling;}}}return;
}

6 图

(题目编号:181)

一、已知条件

设有两张 有向图 G1和G2,如图 q6-1.png 所示。

二者有一些 字符标签相同 的顶点(例中是B和D)。

现定义两张 图的焊接(weld) 是将二者的 标签相同的顶点合并,融合成一张图,其余顶点和边不变,如图 q6-2.png 所示。

有向图 用 邻接表 表示,结构如下:

//定义最大顶点数量
#define MAX_VERTEX_NUM 20typedef struct _arc_node {int adjvex;          //该弧指向顶点在顶点向量中的序号struct _arc_node *nextarc; //指向下一条弧的指针
} arc_node;typedef struct vertex_node {char tag;   //顶点字符标签arc_node *firstarc; //指向该顶点第一条弧的指针
} vertex_node;typedef struct Graph {vertex_node vertex[MAX_VERTEX_NUM]; //顶点向量。下标从0开始。int vexnum, arcnum; //图的顶点数和弧数
} adjlist;

用上述数据结构描述的有向图G2的存储结构可以用图 q6-3.png 所示意:

另有根据结点字符标签 v 定位该结点在 图G 顶点向量中的 序号 的函数:

int locate_vertex(adjlist* G, char v);

例如:locate_vertex(G2, 'F')返回的结果是3

二、任务描述

焊接算法分为几个子算法,其中除了合并边(弧)的子算法,其余都已经完成。
现请设计一个算法,实现焊接算法的子算法:合并两张图的边(弧)。

三、编码要求

  1. 算法函数原型:

    void merge_arcs(adjlist *G1, adjlist *G2);
    
    • 功能:将图G2的边(弧)合并到G1中,即将G2中所有的边复制到G1中;G2保持不变
      如果两张图中只要有一张为空图(即顶点数为0),那么算法不做任何操作,即G1和G2保持不变。
    • 参数:G1和G2都是指向图的指针。
    • 返回值:无

    注意:请用采用头插法处理链表的插入!

  2. 编码约束

  • 时间复杂度:无特别要求
  • 空间复杂度:无特别要求

提示:对图G2中顶点向量中的每一个顶点i,首先定位其在图G1顶点向量中的位置j,然后遍历i的邻接点链表,将其中每一个结点复制出一个副本(即生成新结点),再把副本(新结点)采用头插法插入到顶点j的邻接点链表中

四、参考答案

编者没做出来此题,故略

7 排序

(题目编号:182)

一、已知条件

有一个乱序的正整数数组,其长度为n,其中元素值在 1~m 之间。已知

  • n和m都不太大
  • n 小于 m
  • 元素没有重复值,即数组中没有两个数是相同的
  • 数组下标从0开始

二、任务描述

请设计一个算法,对上述数组进行从小到大升序排序。
注:1. 不能用基数排序。2. 不能为m预估一个预设值

三、编码要求

  1. 算法函数原型

    void xsort(unsigned *a, unsigned n);
    
  • 功能:将指定数组进行从小到大升序排序。如果数组长度为0,则函数什么都不做。
  • 参数:
    a:待排序数组
    n:数组长度。注意:长度可能为0。
  • 返回值:无
  1. 编码约束
  • 时间复杂度:O(m)
  • 空间复杂度:无特别要求

提示:利用数组中无重复值的特点,将数据散列到一个长度为m的一维数组中(这里hash(K)=K),然后再依次收集到原数组中。注意:m的值未知,须编码求得。

四、参考答案

使用的是提示的哈希排序

/** 完成人 :**** 完成时间:**** 系统评分:100*//** 功能:*      将指定数组进行从小到大升序排序。如果数组长度为0,则函数什么都不做。* 参数:*      a:待排序数组*      n:数组长度。注意:长度可能为0。* 返回值:*      无*/
#include<stdlib.h>
void xsort(unsigned *a, unsigned n) {//TODOif(n==0) return ;unsigned m=0;for(int i=0;i<n;i++){if(m<a[i]) m=a[i];}unsigned hash[m+1];for(int i=0;i<=m;i++){hash[i]=0;}for(int i=0;i<n;i++){hash[a[i]]=a[i];}int k=0;for(int i=0;i<=m;i++){if(hash[i]!=0){a[k++]=hash[i];}}return;}

自我练习

1. 登录icoding,点击左侧的开始编程

点击左侧栏的开始编程

2. 新建一个标签页,网址栏输入 https://icoding.run/ide/question/xxx/1

注意:上方网址的xxx更换为icoding题目编号,题目编号为上方的题目序号下面的黄帝文字,如第一题的编号为176.要练习哪个题就对应那个题目编号

3. 这个新建的标签页出现如下图像时

回到icoding,刷新,即可看到作答页面。


声明

本文章仅供学习使用。严禁作其他用途。

电子科大信软互+班 程算II 2021机考真题(含答案)相关推荐

  1. 电子科大信软互+班 程算I 2021机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的可能为一组题目,若题 ...

  2. 电子科大信软互+班 程算I 2020机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的为一组题目,若题目告 ...

  3. 电子科大信软互+班 程算I 2022级机考真题

    基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 说明:题目从icoding看的,不确定是不是 ...

  4. 2021年上半年软考真题及答案解析汇总

    2021上半年软考考试在5月29日-5月30日举行,小编整理了2021年上半年软考各科目的真题及答案解析,欢迎一起讨论,可用于估分. 软考真题软考真题软考真题软考真题软考真题~重要的多说几遍!!! 持 ...

  5. 中国电子学会2023年05月份青少年软件编程Python等级考试试卷三级真题(含答案)

    2023-05 Python三级真题 题数:38 分数:100 测试时长:60min 一.单选题(共25题,共50分) 1.  请选择,下面代码运行之后的结果是?(C)(2分) a = '2' b = ...

  6. 中国电子学会2022年12月份青少年软件编程Python等级考试试卷三级真题(含答案)

    2022-12 Python三级真题 分数:100 题数:38 测试时长:60min 一.单选题(共25题,共50分) 1.  列表L1中全是整数,小明想将其中所有奇数都增加1,偶数不变,于是编写了如 ...

  7. 中国电子学会2022年06月份青少年软件编程Python等级考试试卷二级真题(含答案)

    2022-06 Python二级真题 分数:100 题数:37 测试时长:60min 一.单选题(共25题,共50分) 1.运行下列程序,输出的结果是?(A)(2分) tup1=('苏炳添','谷爱凌 ...

  8. 中国电子学会2022年06月份青少年软件编程Python等级考试试卷一级真题(含答案)

    2022-06 Python一级真题 分数:100题数:37 一.单选题(共25题,共50分) 1.在Python编辑器中写好程序代码后,在Run菜单中,下列哪个命令可以用来执行程序?(B)(2分) ...

  9. 中国电子学会2021年03月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

    2021-03 Scratch四级真题 分数:100题数:29 一.单选题(共15题,每题2分,共30分) 1.运行如下图所示的程序后,以下描述正确的是?(B) A.角色停留在(0,0)的位置,不会移 ...

最新文章

  1. 第五章 有限脉冲响应滤波器(ba,我终于懂FIR滤波器了)
  2. 剑指offer-斐波那契数列
  3. 无法停止‘通用卷’设备的解决方法
  4. java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币
  5. sqoop操作之Oracle导入到HDFS
  6. java的requestmapping_SpringMVC RequestMapping 详解
  7. java类继承语法_java类的继承(基础)
  8. php soap 两个版本_Ceontos 安装php7以上的版本
  9. Android学习笔记之图像颜色处理(ColorMatrix)
  10. SAP License:MM中的几个概念
  11. Spring 这些能升华代码的技巧,可能会让你爱不释手
  12. 使用Spring Boot构建独立的OAuth服务器(三)
  13. Windows10/Servers 2016的TrustedInstaller权限获取(及乱改System后救砖
  14. Python 基础课程第十一天
  15. C#可空类型(Nullable)
  16. other|钱海物流接口上传运单号开发
  17. windows10桌面_windows10 美化桌面加强能力
  18. Java项目毕业设计:基于springboot+vue的电影视频网站系统
  19. 大地GhostXP_SP3_2013极速装机5月版
  20. opencv历史BUG

热门文章

  1. Struts.xml中加不加type=redirect
  2. Spring任务执行和调度
  3. 台式计算机系统错误,台式电脑开机蓝屏,代码是0×0000006B,怎么修复?
  4. [ Office 365 开发系列 ] 前言
  5. 适合开车听的歌 开车必听歌曲排行榜 适合年轻人开车听的歌
  6. unity 性能优化--内存篇(上)
  7. ble_app_hrs心率程序 nrf51822
  8. 手把手教你学Go(二)——Hello world
  9. 第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货
  10. 树莓派双目视觉照片上传电脑及互相通信问题解决