1. 程式人生 > >山東科技大學-2017年12資料結構期末考試題

山東科技大學-2017年12資料結構期末考試題

判斷題答案: 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(n​2​​)

C.    O(1)

D.    O(log​3​​n)

作者: 周治國

單位: 東北師範大學

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。採用平方探測法處理衝突:h​i​​(k)=(H(k)±i​2​​)%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中有三棵樹,第一、第二、第三棵樹的結點個數分別為M​1​​,M​2​​和M​3​​。則與森林F對應的二叉樹根結點的右子樹上的結點個數是: (3分)

A.       M​1​​+M​2​​

B.     M​2​​+M​3​​

C.    M​1​​

D.    M​3​​

作者: 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;
	}
}