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(n2)
C.O(1)
D.O(log3n)
O(log
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。採用平方探測法處理衝突:hi(k)=(H(k)±i2)%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中有三棵樹,第一、第二、第三棵樹的結點個數分別為M1,M2和M3。則與森林F對應的二叉樹根結點的右子樹上的結點個數是:B#B
A. M1+M2
B. M2+M3
C. M1
D. M3
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