电子科大信软互+班 程算II 2021机考真题(含答案)
目录
基本情况
具体题目
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
。
二、任务描述
焊接算法分为几个子算法,其中除了合并边(弧)的子算法,其余都已经完成。
现请设计一个算法,实现焊接算法的子算法:合并两张图的边(弧)。
三、编码要求
算法函数原型:
void merge_arcs(adjlist *G1, adjlist *G2);
- 功能:将图G2的边(弧)合并到G1中,即将G2中所有的边复制到G1中;G2保持不变。
如果两张图中只要有一张为空图(即顶点数为0),那么算法不做任何操作,即G1和G2保持不变。 - 参数:G1和G2都是指向图的指针。
- 返回值:无
注意:请用采用头插法处理链表的插入!
- 功能:将图G2的边(弧)合并到G1中,即将G2中所有的边复制到G1中;G2保持不变。
编码约束
- 时间复杂度:无特别要求
- 空间复杂度:无特别要求
提示:对图G2中顶点向量中的每一个顶点i,首先定位其在图G1顶点向量中的位置j,然后遍历i的邻接点链表,将其中每一个结点复制出一个副本(即生成新结点),再把副本(新结点)采用头插法插入到顶点j的邻接点链表中
四、参考答案
编者没做出来此题,故略
7 排序
(题目编号:182)
一、已知条件
有一个乱序的正整数数组,其长度为n,其中元素值在 1~m 之间。已知
- n和m都不太大
- n 小于 m
- 元素没有重复值,即数组中没有两个数是相同的
- 数组下标从0开始
二、任务描述
请设计一个算法,对上述数组进行从小到大升序排序。
注:1. 不能用基数排序。2. 不能为m预估一个预设值
三、编码要求
- 算法函数原型
void xsort(unsigned *a, unsigned n);
- 功能:将指定数组进行从小到大升序排序。如果数组长度为0,则函数什么都不做。
- 参数:
a:待排序数组
n:数组长度。注意:长度可能为0。 - 返回值:无
- 编码约束
- 时间复杂度: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机考真题(含答案)相关推荐
- 电子科大信软互+班 程算I 2021机考真题
基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的可能为一组题目,若题 ...
- 电子科大信软互+班 程算I 2020机考真题
基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 提示:题目序号为x-x的为一组题目,若题目告 ...
- 电子科大信软互+班 程算I 2022级机考真题
基本情况 对应课程:程序设计与算法基础I 考试时间:3小时 题型:函数题+编程题 函数题只需要完成期中一些(个)函数即可 编程题需要自己手动写main函数 说明:题目从icoding看的,不确定是不是 ...
- 2021年上半年软考真题及答案解析汇总
2021上半年软考考试在5月29日-5月30日举行,小编整理了2021年上半年软考各科目的真题及答案解析,欢迎一起讨论,可用于估分. 软考真题软考真题软考真题软考真题软考真题~重要的多说几遍!!! 持 ...
- 中国电子学会2023年05月份青少年软件编程Python等级考试试卷三级真题(含答案)
2023-05 Python三级真题 题数:38 分数:100 测试时长:60min 一.单选题(共25题,共50分) 1. 请选择,下面代码运行之后的结果是?(C)(2分) a = '2' b = ...
- 中国电子学会2022年12月份青少年软件编程Python等级考试试卷三级真题(含答案)
2022-12 Python三级真题 分数:100 题数:38 测试时长:60min 一.单选题(共25题,共50分) 1. 列表L1中全是整数,小明想将其中所有奇数都增加1,偶数不变,于是编写了如 ...
- 中国电子学会2022年06月份青少年软件编程Python等级考试试卷二级真题(含答案)
2022-06 Python二级真题 分数:100 题数:37 测试时长:60min 一.单选题(共25题,共50分) 1.运行下列程序,输出的结果是?(A)(2分) tup1=('苏炳添','谷爱凌 ...
- 中国电子学会2022年06月份青少年软件编程Python等级考试试卷一级真题(含答案)
2022-06 Python一级真题 分数:100题数:37 一.单选题(共25题,共50分) 1.在Python编辑器中写好程序代码后,在Run菜单中,下列哪个命令可以用来执行程序?(B)(2分) ...
- 中国电子学会2021年03月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)
2021-03 Scratch四级真题 分数:100题数:29 一.单选题(共15题,每题2分,共30分) 1.运行如下图所示的程序后,以下描述正确的是?(B) A.角色停留在(0,0)的位置,不会移 ...
最新文章
- 第五章 有限脉冲响应滤波器(ba,我终于懂FIR滤波器了)
- 剑指offer-斐波那契数列
- 无法停止‘通用卷’设备的解决方法
- java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币
- sqoop操作之Oracle导入到HDFS
- java的requestmapping_SpringMVC RequestMapping 详解
- java类继承语法_java类的继承(基础)
- php soap 两个版本_Ceontos 安装php7以上的版本
- Android学习笔记之图像颜色处理(ColorMatrix)
- SAP License:MM中的几个概念
- Spring 这些能升华代码的技巧,可能会让你爱不释手
- 使用Spring Boot构建独立的OAuth服务器(三)
- Windows10/Servers 2016的TrustedInstaller权限获取(及乱改System后救砖
- Python 基础课程第十一天
- C#可空类型(Nullable)
- other|钱海物流接口上传运单号开发
- windows10桌面_windows10 美化桌面加强能力
- Java项目毕业设计:基于springboot+vue的电影视频网站系统
- 大地GhostXP_SP3_2013极速装机5月版
- opencv历史BUG
热门文章
- Struts.xml中加不加type=redirect
- Spring任务执行和调度
- 台式计算机系统错误,台式电脑开机蓝屏,代码是0×0000006B,怎么修复?
- [ Office 365 开发系列 ] 前言
- 适合开车听的歌 开车必听歌曲排行榜 适合年轻人开车听的歌
- unity 性能优化--内存篇(上)
- ble_app_hrs心率程序 nrf51822
- 手把手教你学Go(二)——Hello world
- 第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货
- 树莓派双目视觉照片上传电脑及互相通信问题解决