0
点赞
收藏
分享

微信扫一扫

山东科技大学-2017年12数据结构期末考试题


2017-2018-1-数据结构期末考试-计算机16-1/2;信息安全16-1/2

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分) F

T        F

单位: 山东科技大学

1-3

某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (2分) T

T        F

单位: 浙江大学

1-4

折半查找的判定树一定是平衡二叉树。 (2分)T

T        F

单位: 山东科技大学

1-5

查找某元素时,折半查找法的查找速度一定比顺序查找法快。 (2分)F

T        F

单位: 山东科技大学

1-6

用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。 (2分)T

T        F

单位: 浙江大学

1-7

基于比较的排序算法中,只要算法的最坏时间复杂度或者平均时间复杂度达到了次平方级O(N * logN),则该排序算法一定是不稳定的。 (2分)F

T        F

单位: 山东科技大学

1-8

B-树中一个关键字只能在树中某一个节点上出现,且节点内部关键字是有序排列的。 (2分)T

T        F

单位: 山东科技大学

1-9

采用顺序存储结构的循环队列,出队操作会引起其余元素的移动。 (2分)F

T        F

单位: 山东科技大学

1-10

二叉树中至少存在一个度为2的结点。 (2分)F

T        F

单位: 山东科技大学

 

2-1

下面代码段的时间复杂度是()。 (3分)D

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分)C

A.       5

B.     0

C.    2

D.    4

单位: 浙江大学

2-3

在双向循环链表结点p之后插入s的语句是: (3分)D

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;

单位: 浙江大学

2-4

下图为一个AOV网,其可能的拓扑有序序列为: (3分)B

A.       ABCDFE

B.     ABCEDF

C.    ACBDEF

D.    ABCEFD

单位: 浙江大学

2-5

对于模式串'abaaab',利用KMP算法进行模式匹配时,其对应的Next取值(注意是未改进的Next值)为: (3分)B

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(ki2)%11将关键字序列{ 6,25,39,61 }依次插入到散列表中。那么元素61存放在散列表中的位置是: (3分)A

A.       5

B.     6

C.    7

D.    8

单位: 浙江大学

2-7

设栈S和队列Q的初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b、d、c、f、e、a、g,则栈S的容量至少是: (3分)A

A.       3

B.     4

C.    1

D.    2

单位: 浙江大学

2-8

有组记录的排序码为{46,79,56,38,40,84 },采用快速排序(以位于最左位置的对象为基准而)得到的第一次划分结果为: (3分)D

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}

单位: 浙江大学

2-9

设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1,M2和M3。则与森林F对应的二叉树根结点的右子树上的结点个数是: (3分)B

A.       M1+M2

B.     M2+M3

C.    M1

D.    M3

单位: 浙江大学

2-10

在决定选取何种存储结构时,一般不考虑()。 (3分)D

A.       结点个数的多少

B.     对数据有哪些运算

C.    所用编程语言实现这种结构是否方便

D.    各结点的值如何

单位: 浙江大学城市学院

2-11

将{ 3, 8, 9, 1, 2, 6 }依次插入初始为空的二叉排序树。则该树的后序遍历结果是: (3分)B

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分)D

A.       6

B.     5

C.    8

D.    7

单位: 浙江大学

2-13

在图中自d点开始进行深度优先遍历算法可能得到的结果为: (3分)A

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

单位: 浙江大学

2-14

我们用一个有向图来表示航空公司所有航班的航线。下列哪种算法最适合解决找给定两城市间最经济的飞行路线问题? (3分)B

A.       Kruskal算法

B.     Dijkstra算法

C.    深度优先搜索

D.    拓扑排序算法

单位: 浙江大学

2-15

若对N阶对称矩阵A以行优先存储的方式将其下三角形的元素(包括主对角线元素)依次存放于一维数组B[1..(N(N+1))/2]中,则A中第i行第j列(i和j从1开始,且i>j)的元素在B中的位序k(k从1开始)为 (3分)D

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)
{
    LinkList delptr, preptr, curptr, pre;
    delptr = pre = preptr = NULL;
    curptr = L;
    while(1)
    {
        if(curptr->data == x)
        {
            delptr = curptr;
            pre = preptr;
        }
        preptr = curptr;
        curptr = curptr->next;
        if(curptr == NULL)
            break;
    }
    if(pre == NULL)
        L = NULL;
    else
    {
        pre->next = delptr->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

 

int GetDepthOfBiTree ( BiTree T)
{
    int dep = 0;
    if(T == NULL)
        return 0;
    else
    {
        if(T->lchild == T->rchild  && T->rchild == NULL)
            return 1;
        else
        {
            int ldep = GetDepthOfBiTree(T->lchild) + 1;
            int rdep = GetDepthOfBiTree(T->rchild) +  1;
            return ldep > rdep?ldep:rdep;
        }
    }

}

 

编程题

 

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

单位: 浙江大学

时间限制: 10000ms

内存限制: 64MB

代码长度限制:

 //此题中快排、归并排序、堆排序、基数排序、希尔排序均可。

 

#include<bits/stdc++.h>
int a[100010];
int N;
void ShellSort()
{
    for(int Increment = N / 2; Increment > 0; Increment /= 2)
    {
        for(int j = Increment; j < N; ++j)
        {
            int i, temp = a[j];
            for(i = j; i - Increment >= 0; i -= Increment)
            {
                if(a[i - Increment] > temp)
                {
                    a[i] = a[i - Increment];
                }
                else
                    break;
            }
            a[i] = temp;
        }
    }
}
void Print()
{
    if(N > 0)
        printf("%d", a[0]);
    for(int i = 1; i < N; ++i)
      printf(" %d", a[i]);
}
int main()
{
    scanf("%d", &N);
    for(int i = 0; i < N; ++i)
    {
        scanf("%d", &a[i]);
    }
    ShellSort();
    Print();
}

 

 

 

 

 

 


 



 



 



 

举报

相关推荐

0 条评论