108 年 國立中正大學資訊管理學系碩士班乙組《資料結構》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題6 分

For array "int list[100]", list[i]=i-1, for i=0...99. And &(list[99]) is 0x123456.
What is (list+1)?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C 語言的陣列與指標運算:

  1. 在一般運算式中,陣列名稱 list 會轉換成指向第一個元素的指標,即 &list[0]。
  2. 指標加法以「元素」為單位,不是以位元組為單位。
  3. 因此:
list+1=&list[1]list+1=\&list[1]

注意,list+1 是位址;若寫成 *(list+1),才是取出 list[1] 的內容。

解題方法

已知:

&list[99]=0x123456\&list[99]=0x123456

list+1 指向 list[1]。從第 99 個元素往前到第 1 個元素,相差:

99−1=98 個元素99-1=98\text{ 個元素}

因此,若每個 int 占用 sizeof⁡(int)\operatorname{sizeof}(\texttt{int}) 個位元組:

&list[1]=0x123456−98×sizeof⁡(int)\&list[1] = 0x123456-98\times \operatorname{sizeof}(\texttt{int})

題目未明確指定 int 的大小,因此嚴格而言,數值位址無法唯一決定。若依一般考題慣例假設:

sizeof⁡(int)=4\operatorname{sizeof}(\texttt{int})=4

則:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2 題12 分

Please transform the expressions from prefix to postfix. (12 pt)
(A) -+-/abcdeac (6 pt)
(B) -/*a+bcdg (6 pt)

登入後即可作答並保存紀錄。

這一題的完整詳解

轉換方法:自右至左掃描前綴式,遇 operand 推入堆疊;遇 operator 取出兩個堆疊頂端,組成 左 operand + 右 operand + operator 的後綴子式,重新推入堆疊。最後堆疊唯一元素即為整式的後綴式。


(A) -+-/abcdeac

右至左掃描過程

讀取堆疊內容 (自左至右)
cc
ac , a
*ac*
eac* , e
dac* , e , d
*ac* , de*
bac* , de* , b
cac* , de* , b , c
aac* , de* , b , c , a
/ac* , de* , ac/
-ac* , de* , b ac/-
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3 題12 分

If moves are defined as: E be 0, SE be 1, S be 2, and NE be 7 in clockwise direction. Please draw out the path that the maze algorithm works. (12 pt)
🖼️【此處有附圖,請對照原卷】

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考八方向迷宮的深度優先搜尋(DFS)與回溯。把每個可通行格視為節點,搜尋時依方向編號逐一檢查相鄰格;走進死路便退回上一格,直到抵達出口。

若搜尋時記錄已走過的格子,避免重複繞行,最多檢查 mnmn 個格子,每格至多查看 8 個方向,時間複雜度為 O(mn)O(mn);搜尋路徑與標記所需空間為 O(mn)O(mn)。

解題方法

圖中迷宮有 11 列、15 欄,入口在左上角 (1,1)(1,1),出口在右下角 (11,15)(11,15);將值為 0 的格視為可通行、值為 1 的格視為障礙。座標以列、欄表示,列往下增加、欄往右增加,並可沿八個方向移動。

方向編號方向座標變化 (Δr,Δc)(\Delta r,\Delta c)
0東(0,1)(0,1)
1東南(1,1)(1,1)
2南(1,0)(1,0)
3西南(1,−1)(1,-1)
4西(0,−1)(0,-1)
5西北(−1,−1)(-1,-1)
6北(−1,0)(-1,0)
7東北(−1,1)(-1,1)
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4 題6 分

How much is the maximum path length for a maze if the maze size is m by n, where m>n? (6 pt)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

將迷宮視為 m×nm\times n 的格狀圖,每個格子是一個頂點,相鄰且可通行的格子之間有一條邊。

迷宮路徑通常不重複走訪同一格子,因此它是簡單路徑。迷宮共有

mnm n

個格子,所以路徑最多只能經過 mnmn 個格子。

題目未明示「路徑長度」是以經過格子數或移動步數計算;本題依資料結構迷宮題的常見約定,以經過的格子數計算。

解題方法

路徑中每個格子最多使用一次,因此:

最大經過格子數≤mn\text{最大經過格子數}\leq mn

此上限可以達到。例如採蛇行方式行走:

  • 第 1 列由左至右;
  • 第 2 列由右至左;
  • 第 3 列再由左至右;
  • 依此交替進行。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5 題20 分

Write out binary tree's (20 pt)
(A) Preorder traversal (5 pt)
(B) Inorder traversal (5 pt)
(C) Postorder traversal (5 pt)
(D) Level order traversal (5 pt)
🖼️【此處有附圖,請對照原卷】

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁原卷第 3 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

二元樹走訪是依照指定次序,將每個節點恰好拜訪一次:

  • 前序走訪:根節點 → 左子樹 → 右子樹。
  • 中序走訪:左子樹 → 根節點 → 右子樹。
  • 後序走訪:左子樹 → 右子樹 → 根節點。
  • 層序走訪:由上而下、同一層由左而右;通常用佇列實作。

依圖,樹的結構為:根節點 +;左子節點 *、右子節點 E。左側的 * 有左子節點 * 和右子節點 D;下一個 * 有左子節點 / 和右子節點 C;/ 的左右子節點分別是 A、B。

解題方法

由根節點開始,按各走訪規則逐層展開子樹:

  • 前序:先列 +,再走左子樹 *,最後走右子樹 E。左子樹內同樣先根、再左、再右,得到 *、*、/、A、B、C、D。
  • 中序:先走根的左子樹,再列根 +,最後列右子樹 E。左子樹依「左、根、右」排列,得到 A、/、B、*、C、*、D。
  • 後序:先完成左右子樹,最後才列根。左子樹得到 A、B、/、C、*、D、*,再接上 E、+。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6 題12 分

Write out the results of the following two sparse matrix multiplication in the sparse-matrix form. (12 pt)

左表:

235
001
022
10-1
114
126

右表:

334
003
022
10-1
225

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

稀疏矩陣的三元組表示法,第一列記錄「列數、行數、非零元素個數」,後續每列記錄「列索引、行索引、元素值」。本題的左矩陣 AA 為 2×32\times 3,右矩陣 BB 為 3×33\times 3,因此乘積 C=ABC=AB 為 2×32\times 3。

矩陣乘法的元素公式為:

cij=∑k=02aikbkjc_{ij}=\sum_{k=0}^{2}a_{ik}b_{kj}

也就是 AA 第 ii 列與 BB 第 jj 行對應元素相乘後加總。題目索引從 00 開始。

解題方法

依三元組資料還原矩陣:

A=[102−146],B=[302−100005]A= \begin{bmatrix} 1&0&2\\ -1&4&6 \end{bmatrix}, \qquad B= \begin{bmatrix} 3&0&2\\ -1&0&0\\ 0&0&5 \end{bmatrix}

逐列與逐行計算乘積:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題20 分

Which(s) is/are true in the following descriptions? (20 pt)
(A) The complexity of the maze in the worst case is O(mp), where m and p are the row and column in the maze, respectively.
(B) In postfix, it needs to use parentheses to indicate the order of priority for operands.
(C) &a->val means (&a)->val
(D) a%bc == 3 means (a%(bc)) == 3
(E) a==3 || b==4 && c==5 means ((a == 3) || (b == 4)) && (c == 5)

登入後即可作答並保存紀錄。

這一題的完整詳解

解析

  • (A) 迷宮最壞情況需遍歷全部格子,格子總數為 m×pm \times p,故時間複雜度 O(mp)O(mp)。 正確。
  • (B) 後序表示法 (postfix) 以運算子順序自然決定計算次序,不使用括號。 錯誤。
  • (C) 程式語言 C 中運算子優先順序使 &a->val 等價於 &(a->val),而非 (&a)->val。 錯誤。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 8 題12 分

Please complete the code of "Erase a circular list". (12 pt)

void cerase(poly_pointer *ptr)
{
    poly_pointer temp;  /* hint: avail */
    if (*ptr) {
        ……
        ……
        ……
        *ptr = NULL;
    }
}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

循環鏈結串列的最後一個節點會指回第一個節點。本題的 *ptr 指向最後一個節點,因此 (*ptr)->link 是第一個節點。

avail 是可重複利用節點的空閒串列。刪除整個循環串列時,不必逐節點釋放記憶體;只要把串列接到 avail 前端,再將 *ptr 設為 NULL。

解題方法

先保存第一個節點,避免改寫最後節點的 link 後失去串列入口。接著將最後節點接到原本的 avail,再讓 avail 指向原串列的第一個節點。原串列因而成為空閒串列的前段。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題