判断题答案: 1-5: T, F, T, T, F 6-10: T, F, T, F, F
选择题答案: 1-5: D, A, D, B, C 6-10: B, B, D, B, C
11-15: C, B, B, C, B, C
2017-2018-1-数据结构期末考试-计算机16-1/2;信息安全16-1/2
原文:https://blog.csdn.net/m0_38015368/article/details/78883198
100 分
I. 判断题共 10小题,共计 20分
II. 单选题共 15小题,共计 45分
III. 函数题共 2小题,共计 20分
IV. 编程题共 1小题,共计 15分
(1)考试时长2小时,从登录时间算起,12:10结束;(2)不想结束考试,千万不要点击结束考试,否则,后果自负;(3)考试期间只能使用PTA考试客户端、C、C++软件系统,严禁打开浏览器、通讯软件以及其他软件系统;违反以上规定以及学校的考试管理规定的以作弊论处(4)编程题禁止使用STL(5)如遇系统故障举手找监考老师
剩余时间:已结束
剩余时间:已结束
1-1
图的关键路径上任意活动的延期都会引起工期的延长。 (2分)选 T
T
作者: 鲁法明
单位: 山东科技大学
1-2
所有的排序算法中,关键字的比较操作都是不可避免的。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-3
某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (2分)
T F
作者: DS课程组
单位: 浙江大学
1-4
折半查找的判定树一定是平衡二叉树。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-5
查找某元素时,折半查找法的查找速度一定比顺序查找法快。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-6
用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。 (2分)
T F
作者: DS课程组
单位: 浙江大学
1-7
基于比较的排序算法中,只要算法的最坏时间复杂度或者平均时间复杂度达到了次平方级O(N * logN),则该排序算法一定是不稳定的。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-8
B-树中一个关键字只能在树中某一个节点上出现,且节点内部关键字是有序排列的。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-9
采用顺序存储结构的循环队列,出队操作会引起其余元素的移动。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
1-10
二叉树中至少存在一个度为2的结点。 (2分)
T F
作者: 鲁法明
单位: 山东科技大学
2-1
下面代码段的时间复杂度是()。 (3分)
i=1;
while( i<=n )
i=i*3;
A. O(n)
B. O(n2)
C. O(1)
D. O(log3n)
作者: 周治国
单位: 东北师范大学
2-2
设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数? (3分)
A. 5
B. 0
C. 2
D. 4
作者: DS课程组
单位: 浙江大学
2-3
在双向循环链表结点p之后插入s的语句是: (3分)
A. s->prior=p;s->next=p->next; p->next=s; p->next->prior=s;
B. p->next=s;s->prior=p; p->next->prior=s ; s->next=p->next;
C. p->next->prior=s;p->next=s; s->prior=p; s->next=p->next;
D. s->prior=p;s->next=p->next; p->next->prior=s; p->next=s;
作者: DS课程组
单位: 浙江大学
2-4
下图为一个AOV网,其可能的拓扑有序序列为: (3分)
A. ABCDFE
B. ABCEDF
C. ACBDEF
D. ABCEFD
作者: DS课程组
单位: 浙江大学
2-5
对于模式串'abaaab',利用KMP算法进行模式匹配时,其对应的Next取值(注意是未改进的Next值)为: (3分)
A. 0 1 1 2 31
B. 01 1 2 2 2
C. 0 1 2 3 45
D. 0 1 2 2 21
作者: 鲁法明
单位: 山东科技大学
2-6
给定散列表大小为11,散列函数为H(Key)=Key%11。采用平方探测法处理冲突:hi(k)=(H(k)±i2)%11将关键字序列{ 6,25,39,61 }依次插入到散列表中。那么元素61存放在散列表中的位置是: (3分)
A. 5
B. 6
C. 7
D. 8
作者: DS课程组
单位: 浙江大学
2-7
设栈S和队列Q的初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b、d、c、f、e、a、g,则栈S的容量至少是: (3分)
A. 3
B. 4
C. 1
D. 2
作者: DS课程组
单位: 浙江大学
2-8
有组记录的排序码为{46,79,56,38,40,84 },采用快速排序(以位于最左位置的对象为基准而)得到的第一次划分结果为: (3分)
A. {38,79,56,46,40,84}
B. {38,46,56,79,40,84}
C. {38,46,79,56,40,84}
D. {40,38,46,56,79,84}
作者: DS课程组
单位: 浙江大学
2-9
设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1,M2和M3。则与森林F对应的二叉树根结点的右子树上的结点个数是: (3分)
A. M1+M2
B. M2+M3
C. M1
D. M3
作者: DS课程组
单位: 浙江大学
2-10
在决定选取何种存储结构时,一般不考虑()。 (3分)
A. 结点个数的多少
B. 对数据有哪些运算
C. 所用编程语言实现这种结构是否方便
D. 各结点的值如何
作者: 严冰
单位: 浙江大学城市学院
2-11
将{ 3, 8, 9, 1, 2, 6 }依次插入初始为空的二叉排序树。则该树的后序遍历结果是: (3分)
A. 1, 2, 8,6, 9, 3
B. 2,1, 6, 9, 8, 3
C. 1, 2, 3,6, 9, 8
D. 2, 1, 3,6, 9, 8
作者: 鲁法明
单位: 山东科技大学
2-12
具有65个结点的完全二叉树其深度为(根的深度为1): (3分)
A. 6
B. 5
C. 8
D. 7
作者: DS课程组
单位: 浙江大学
2-13
在图中自d点开始进行深度优先遍历算法可能得到的结果为: (3分)
A. d,e,a,c,f,b
B. d,f,c,e,a,b
C. d,a,c,f,e,b
D. d,a,e,b,c,f
作者: DS课程组
单位: 浙江大学
2-14
我们用一个有向图来表示航空公司所有航班的航线。下列哪种算法最适合解决找给定两城市间最经济的飞行路线问题? (3分)
A. Kruskal算法
B. Dijkstra算法
C. 深度优先搜索
D. 拓扑排序算法
作者: DS课程组
单位: 浙江大学
2-15
若对N阶对称矩阵A以行优先存储的方式将其下三角形的元素(包括主对角线元素)依次存放于一维数组B[1..(N(N+1))/2]中,则A中第i行第j列(i和j从1开始,且i>j)的元素在B中的位序k(k从1开始)为 (3分)
A. j*(j-1)/2+i
B. i*(i+1)/2+j
C. j*(j+1)/2+i
D. i*(i-1)/2+j
作者: 鲁法明
单位: 山东科技大学
函数题
6-1 删除单链表中最后一个与给定值相等的结点 (10 分)
本题要求在链表中删除最后一个数据域取值为x的节点。L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)执行后,链表中剩余各个节点的数据域取值依次为1 3 1 4 5。
函数接口定义:
void ListLocateAndDel_L(LinkList L, ElemType x);
其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中定位最后一个数据域取值为x的节点并删除之。
裁判测试程序样例:
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NULL 0
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表创建函数
Status ListCreate_L(LinkList &L,int n)
{
LNode *rearPtr,*curPtr;
L=(LNode*)malloc(sizeof (LNode));
if(!L)exit(OVERFLOW);
L->next=NULL;
rearPtr=L;
for (int i=1;i<=n;i++){
curPtr=(LNode*)malloc(sizeof(LNode));
if(!curPtr)exit(OVERFLOW);
scanf("%d",&curPtr->data);
curPtr->next=NULL;
rearPtr->next=curPtr;
rearPtr=curPtr;
}
return OK;
}
//链表输出函数
void ListPrint_L(LinkList L)
{
LNode *p=L->next;
if(!p){
printf("空表");
return;
}
while(p!=NULL)
{
if(p->next!=NULL)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
}
//下面是需要实现的函数的声明
void ListLocateAndDel_L(LinkList L, ElemType x);
int main()
{
LinkList L;
int n;
int x;
scanf("%d",&n); //输入链表中元素个数
if(ListCreate_L(L,n)!= OK) {
printf("表创建失败!!!\n");
return -1;
}
scanf("%d",&x); //输入待查找元素
ListLocateAndDel_L(L,x);
ListPrint_L(L);
return 0;
}
/* 请在这里填写答案 */
输入样例:
6
1 3 1 4 3 5
3
输出样例:
1 3 1 4 5
void ListLocateAndDel_L(LinkList L, ElemType x)
{
if(!L)
return;//表空啥也不干
else
{
LinkList p = L->next,q,t=L;//t指向头结点
while(p)
{
if(p->data==x)
t = q;//记录并更新相同位置(t也是要删除位置的直接前驱)
q = p;//这两部就是不等就一直往后更新
p = p->next;
}
if(t!=L)//大概的意思就是t往后移动了,就可以删了(不知道不写这句行不行)
{
t->next = t->next->next;//删除操作
}
}
}
6-2 计算二叉树的深度 (10 分)
编写函数计算二叉树的深度。二叉树采用二叉链表存储结构
函数接口定义:
int GetDepthOfBiTree ( BiTree T);
其中 T是用户传入的参数,表示二叉树根节点的地址。函数须返回二叉树的深度(也称为高度)。
裁判测试程序样例:
//头文件包含
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INFEASIBLE -2
#define NULL 0
typedef int Status;
//二叉链表存储结构定义
typedef int TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//先序创建二叉树各结点,输入0代表空子树
Status CreateBiTree(BiTree &T){
TElemType e;
scanf("%d",&e);
if(e==0)T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)exit(OVERFLOW);
T->data=e;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
//下面是需要实现的函数的声明
int GetDepthOfBiTree ( BiTree T);
//下面是主函数
int main()
{
BiTree T;
int depth;
CreateBiTree(T);
depth= GetDepthOfBiTree(T);
printf("%d\n",depth);
}
/* 请在这里填写答案 */
输入样例(输入0代表创建空子树):
1 3 0 0 5 7 0 0 0
输出样例:
3
编程题
7-1 排序 (15 分)
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
· 数据1:只有1个元素;
· 数据2:11个不相同的整数,测试基本正确性;
· 数据3:103个随机整数;
· 数据4:104个随机整数;
· 数据5:105个随机整数;
· 数据6:105个顺序整数;
· 数据7:105个逆序整数;
· 数据8:105个基本有序的整数;
· 数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11
4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
答案:
#include <stdio.h>
#include <stdlib.h>
#define N 100000
#define Cutoff 10
#define Radix 10
void percdown(long *a, int n, int i);
void merge(long *a, long *tmp, int start, int end, int middle);
void msort(long *a, long *tmp, int start, int end);
void merge_pass(long *a, long *tmp, int n, int length);
void q_sort(long *a, int left, int right);
void bubble_sort(long *a, int n);
void insertion_sort(long *a, int n);
void selection_sort(long *a, int n);
void shell_sort(long *a, int n);
void shellsedgewick_sort(long *a, int n);
void heap_sort(long *a, int n);
void merge1_sort(long *a, int n);
void merge2_sort(long *a, int n);
void quick_sort(long *a, int n);
void radix_sort(long *a, int n);
int main() {
int i, n;
long a[N];
scanf("%d", &n);
for (i = 0;i < n;i++)
scanf("%ld", &a[i]);
quick_sort(a, n);
printf("%ld", a[0]);
for (i = 1;i < n;i++)
printf(" %ld", a[i]);
return 0;
}
//冒泡排序
void bubble_sort(long *a, int n) {
int i, j, flag;
long temp;
for (i = n - 1;i > 0;i--) {
flag = 0;
for (j = 0;j < i;j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1;
}
}
if (!flag) break;
}
}
//插入排序
void insertion_sort(long *a, int n) {
int i, j;
long temp;
for (i = 1;i < n;i++) {
temp = a[i];
for (j = i; j > 0 && a[j - 1] > temp; j--)
a[j] = a[j - 1];
a[j] = temp;
}
}
//选择排序
void selection_sort(long *a, int n) {
int i, j, t;
long temp;
for (i = 0;i < n - 1;i++) {
temp = a[i];
t = i;
for (j = i + 1;j < n;j++) {
if (a[j] < temp) {
temp = a[j];
t = j;
}
}
a[t] = a[i];
a[i] = temp;
}
}
//希尔排序-希尔增量
void shell_sort(long *a, int n) {
int i, j, d;
long temp;
for (d = n / 2;d > 0;d /= 2) {
for (i = d;i < n;i++) {
temp = a[i];
for (j = i;j >= d && a[j - d] > temp;j -= d)
a[j] = a[j - d];
a[j] = temp;
}
}
}
//希尔排序-sedgewick增量
void shellsedgewick_sort(long *a, int n) {
int i, j, d, si;
int Sedgewick[] = { 929, 505, 209, 109, 41, 19, 5, 1, 0 };
long temp;
for (si = 0;Sedgewick[si] >= n;si++)
;
for (;Sedgewick[si] > 0;si++) {
d = Sedgewick[si];
for (i = d;i < n;i++) {
temp = a[i];
for (j = i;j >= d && a[j - d] > temp;j -= d)
a[j] = a[j - d];
a[j] = temp;
}
}
}
//堆排序
void heap_sort(long *a, int n) {
int i;
long temp;
for (i = (n - 2) / 2; i >= 0; i--)
percdown(a, n, i);
for (i = n - 1;i > 0;i--) {
temp = a[i];
a[i] = a[0];
a[0] = temp;
percdown(a, i, 0);
}
}
void percdown(long *a, int n, int i) {
int child;
long x = a[i];
for (;i * 2 + 1 <= n - 1;i = child) {
child = i * 2 + 1;
if (child < n - 1 && a[child + 1] > a[child])
child++;
if (x >= a[child]) break;
else a[i] = a[child];
}
a[i] = x;
}
//归并排序-递归实现
void merge1_sort(long *a, int n) {
long *tmp = (long*)malloc(n*sizeof(long));
msort(a, tmp, 0, n - 1);
free(tmp);
}
void msort(long *a, long *tmp, int start, int end) {
int middle;
if (start < end) {
middle = (start + end) / 2;
msort(a, tmp, start, middle);
msort(a, tmp, middle + 1, end);
merge(a, tmp, start, end, middle);
}
}
void merge(long *a, long *tmp, int start, int end, int middle) {
int l, r, s;
s = start;
l = start;
r = middle + 1;
while (l <= middle && r <= end) {
if (a[l] <= a[r]) tmp[s++] = a[l++];
else tmp[s++] = a[r++];
}
while (l <= middle) tmp[s++] = a[l++];
while (r <= end) tmp[s++] = a[r++];
for (;start <= end;start++)
a[start] = tmp[start];
}
//归并排序-循环实现
void merge2_sort(long *a, int n) {
int length = 1;
long *tmp = (long*)malloc(n*sizeof(long));
while (length < n) {
merge_pass(a, tmp, n, length);
length *= 2;
merge_pass(tmp, a, n, length);
length *= 2;
}
free(tmp);
}
void merge_pass(long *a, long *tmp, int n, int length) {
int i, j;
for (i = 0;i + 2 * length <= n;i += 2*length)
merge(a, tmp, i, i + 2 * length - 1, i + length - 1);
if (i + length <= n)
merge(a, tmp, i, n - 1, i + length - 1);
else
for (j = i;j < n;j++)
tmp[j] = a[j];
}
//快速排序
void quick_sort(long *a, int n) {
q_sort(a, 0, n - 1);
}
void q_sort(long *a, int left, int right) {
long pivot, temp;
int i, j, center;
if (right - left + 1 > Cutoff) {
center = (left + right) / 2;
if (a[center] < a[left]) {
temp = a[center];a[center] = a[left];a[left] = temp;
}
if (a[right] < a[left]) {
temp = a[right];a[right] = a[left];a[left] = temp;
}
if (a[right] < a[center]) {
temp = a[right];a[right] = a[center];a[center] = temp;
}
temp = a[right - 1];a[right - 1] = a[center];a[center] = temp;
pivot = a[right - 1];
i = left;
j = right - 1;
for (;;) {
while (a[++i] < pivot);
while (a[--j] > pivot);
if (i < j) {
temp = a[i];a[i] = a[j];a[j] = temp;
}
else break;
}
temp = a[i];a[i] = a[right - 1];a[right - 1] = temp;
q_sort(a, left, i - 1);
q_sort(a, i + 1, right);
}
else
insertion_sort(a + left, right - left + 1);
}
//基数排序-次位优先
struct Node {
int data;
Node* next;
};
struct Bucket {
Node *head, *tail;
};
void radix_sort(long *a, int n) {
int d, di, i, flag;
long t;
Bucket b[Radix*2 - 1];//19个桶 -9--1,0,1-9;
Node *tmp, *p, *list = NULL;
for (i = 0;i <= (Radix-1) * 2;i++)
b[i].head = b[i].tail = NULL;
for (i = n - 1;i >= 0;i--) {
tmp = (Node*)malloc(sizeof(Node));
tmp->data = a[i];
tmp->next = list;
list = tmp;
}
for (d = 1;;d++) {
p = list;
flag = 0;
while (p) {
t = p->data;
for (i = 1;i <= d;i++) {
di = t % Radix;t /= Radix;
}
if (di != 0) flag = 1;
di += Radix-1;
tmp = p;
p = p->next;
tmp->next = NULL;
if (!b[di].head)
b[di].head = b[di].tail = tmp;
else {
b[di].tail->next = tmp;
b[di].tail = tmp;
}
}
if (!flag) break;
else {
list = NULL;
for (i = (Radix - 1) * 2;i >= 0;i--) {
if (b[i].head) {
b[i].tail->next = list;
list = b[i].head;
b[i].head = b[i].tail = NULL;
}
}
}
}
for (i = 0;i < n;i++) {
a[i] = b[Radix - 1].head->data;
b[Radix - 1].head = b[Radix - 1].head->next;
}
}