1. 程式人生 > 實用技巧 >SDUST 2017 2018/資料結構/期末測試

SDUST 2017 2018/資料結構/期末測試

題源:https://blog.csdn.net/weixin_42110638/article/details/85233701 、 https://www.cnblogs.com/YY666/p/11826948.html


2017

判斷題#

1-1 圖的關鍵路徑上任意活動的延期都會引起工期的延長 T#

1-2 所有的排序演算法中,關鍵字的比較操作都是不可避免的 F@

基數排序是採用分配和收集實現的,不需要進行關鍵字的比較,而其他幾種排序方法都是通過關鍵字的比較實現的。

1-3 某二叉樹的前序和中序遍歷序列正好一樣,則該二叉樹中的任何結點一定都無左孩子 T

#

1-4 折半查詢的判定樹一定是平衡二叉樹 T@#

1-5 查詢某元素時,折半查詢法的查詢速度一定比順序查詢法快 F#

1-6 用鄰接矩陣法儲存圖,佔用的儲存空間數只與圖中結點個數有關,而與邊數無關 T#

1-7 基於比較的排序演算法中,只要演算法的最壞時間複雜度或者平均時間複雜度達到了次平方級O(N * logN),則該排序演算法一定是不穩定的 F

例外:歸併排序

1-8 B-樹中一個關鍵字只能在樹中某一個節點上出現,且節點內部關鍵字是有序排列的 T

B-樹定義:平衡的多路查詢樹

1-9 採用順序儲存結構的迴圈佇列,出隊操作會引起其餘元素的移動 F@#

1-10 二叉樹中至少存在一個度為2的結點  F

選擇題

2-1 下面程式碼段的時間複雜度是 D D

i = 1;
while( i<=n )
    i=i*3;

A.O(n)
B.O(n​2​​)
C.O(1)
D.O(log​3​​n)

O(log3n)

2-2 設一段文字中包含4個物件{a,b,c,d},其出現次數相應為{4,2,5,1},則該段文字的哈夫曼編碼比採用等長方式的編碼節省了多少位數?C#

A.5

B.0

C.2

D.4

24-22=2

2-3 在雙向迴圈連結串列結點p之後插入s的語句是: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網,其可能的拓撲有序序列為 B

A.ABCDFE

B.ABCEDF

C.ACBDEF

D.ABCEFD

2-5對於模式串'abaaab',利用KMP演算法進行模式匹配時,其對應的Next取值(注意是未改進的Next值)為:C

A.0 1 1 2 3 1

B.0 1 1 2 2 2

C.0 1 2 3 4 5

D.0 1 2 2 2 1

2-6 給定散列表大小為11,雜湊函式為H(Key)=Key%11。採用平方探測法處理衝突:h​i​​(k)=(H(k)±i​2​​)%11將關鍵字序列{ 6,25,39,61 }依次插入到散列表中。那麼元素61存放在散列表中的位置是: D

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的容量至少是:A

A.3

B.4

C.1

D.2

2-8 有組記錄的排序碼為{46,79,56,38,40,84 },採用快速排序(以位於最左位置的物件為基準而)得到的第一次劃分結果為: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中有三棵樹,第一、第二、第三棵樹的結點個數分別為M​1​​,M​2​​和M​3​​。則與森林F對應的二叉樹根結點的右子樹上的結點個數是:B#B

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

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

C. M​1​​

D. M​3​​

2-10 在決定選取何種儲存結構時,一般不考慮()D

A.結點個數的多少

B.對資料有哪些運算

C.所用程式語言實現這種結構是否方便

D.各結點的值如何

2-11 將{ 3, 8, 9, 1, 2, 6 }依次插入初始為空的二叉排序樹。則該樹的後序遍歷結果是: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):C#

A. 6

B. 5

C. 8

D. 7

2-13 在圖中自d點開始進行深度優先遍歷演算法可能得到的結果為: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 我們用一個有向圖來表示航空公司所有航班的航線。下列哪種演算法最適合解決找給定兩城市間最經濟的飛行路線問題?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

程式題

1 刪除單鏈表中最後一個與給定值相等的結點#

本題要求在連結串列中刪除最後一個數據域取值為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;//刪除操作
        }
    }
}

2 計算二叉樹的深度#

編寫函式計算二叉樹的深度。二叉樹採用二叉連結串列儲存結構

函式介面定義:

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 


2018

選擇題

判斷題

程式題

先序輸出葉子結點、帶頭結點的單鏈表就地逆置