壹 、課程說明 - icerc.tnssh.tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/98-1-6.pdf · 壹...

Preview:

Citation preview

  • 壹、課程說明

    單元名稱  C語言:資料結構

    單元摘要

    本教案主要目的在讓學生瞭解並認識 Queues、Stacks、Linked lists、Trees 與 Sets,其中 Trees 和 Sets 為選授教材,教師可依照授課時間及學生程度 自行決定是否教授,若不教授,教師可將時間分配至  Queues 等資料結構 中,讓學生多練習並熟悉其應用。

    依據課綱的精神,本單元主要在讓學生瞭解各種資料結構的用途及使

    用方法,至於各資料結構的實作細節並不是授課的重點,是以本教案在設

    計時,均不揭示其實作方法,而著重於性質、應用方式以及使用時機的介

    紹。教案在此提供許多的範例及性質整理,希望教師在教學時,能將資料

    結構實作的細節當作黑箱處理。這種作法其實是非常合理的,因為現在的

    程式語言,除了語法本身外,均提供上述資料結構的函式庫,確切的瞭解

    每種資料結構的優缺點及其使用方式,是非常有助於問題解決。

    本教案在程式語言方面,可以採用 C 或者 C++。若採用 C++,建議直 接使用C++所提供的標準樣版函式庫  (Standard Template Library), 若使用C 語言,建議教師事先寫好各資料結構的函式,提供學生使用,有關這部分

    各位教師可以自參考資源中所提供資訊及利用網路搜尋,稍加整理即可完

    成。

    設 計 者 張啟中教師  (國立大里高中) 

    學習目標 1. 瞭解各種資料結構的性質與應用時機。 2. 認識各種資料結構的使用方法。

    課綱範圍 

    1.佇列 11佇列用途 12佇列使用方法 

    2.堆疊 21堆疊用途 22堆疊使用方法 

    3.鏈結串列 31鏈結串列用途 32鏈結串列使用方法 

    4.樹狀結構(※選授) 41樹狀結構用途 42樹狀結構使用方法 

    5.集合(※選授) 51集合用途 52集合使用方法

  • 教學節數  1012 節

    先備知識 1. 學生已修習過資訊科技概論。 2. 學生已學習並熟悉 C/C++ 語言基本語法。 3. 學生已能用 C/C++ 解決簡單的問題。

    評量方法 

    1.上機測驗。 2.課堂問答。 3.練習解題情況。 4.分組報告

    參考資源 

    [1]  Data  Structures,  A  Pseudocode  Approach  with  C++.  Richard F.Gilberg & Behrouz A. Forouzan. ISBN 053495216X 

    [2] Fundamentals of Data Structures in C++. Ellis Horowitz, Sartaj Sahni, & Dinesh Mehta. ISBN 0716782928 

    [3] http://imil.au.edu.tw/~hsichcl/DataStructureHandout.htm [4] http://www.cppreference.com [5] http://web.thu.edu.tw/~johnaxer [6] http://zh.wikipedia.org/zhtw,  台灣維基,搜尋條目:資料結構

  • 貳、教學活動計畫

    教學活動 時 間 說 明

    認識佇列  (Queue) 

    佇列使用方式 

    10

    40 

    一、認識佇列  (Queue) 教師利用「排隊買票」為例子,說明「排隊買票」

    具有「先到先買」的特性。教師請同學舉出日常生活

    中還有哪些事物,類似「排隊買票」,有著「先進先

    出」的性質呢?

    參考答案: 1.  工廠中的產品組合生產線。 2.  銀行的服務櫃臺。 3.  廠商促銷活動時,贈品採「先買先送,送完為止」

    的策略。

    備註:先抽號碼牌,也是排隊的一種方式。

    教師總結以上討論:

    在資訊領域中,我們利用資料結構「佇列」

    (Queue)來模擬這樣的特性,所以,「佇列」這種資 料結構有「先進先出」的性質。因此,只要所面臨的

    情境,有先進先出的特性,就非常適合利用佇列來解

    決。

    二、瞭解佇列的操作 1. 教師介紹佇列的基本操作 (1)建立一個佇列(Create) (2)放入一個元素(Enqueue) (3)取出一個元素(Dequeue) (4)讀取前端元素(Front) (5)取得目前元素的個數(Count) 

    front 

    2. 教師以程式示範佇列的基本操作程式碼後,請同學 練習以熟悉佇列。

    備註: C語言:請教師預先利用 C語言寫好 Queue的操作函

    式,供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的  Queue 

  • (第 1節結束) 佇列的應用

    佇列練習

    (第 2節結束) 認識堆疊  (Stack) 

    10

    40

    10 

    模版(template)。

    三、佇列在資訊領域的應用

    教師舉例說明佇列在資訊領域的應用,作為總

    結。以下請參考: 1.  作業系統的程式工作排程。 2.  網路網頁伺服器對於客戶端的服務請求。 3.  作業系統對於鍵盤、滑鼠等事件的服務。

    四、練習

    教師揭示練習題目,並解釋題目意思後,請同學練

    習。同學練習時,教師可視同學解題情況,適當提示

    同學解題方向。

    練習題目:

    我們想要將一個數列資料分為以下四個群組,但是分

    群後,數列原有數字間的次序關係不可以變動。

    群組 1:= 30 

    範例: Input: 3, 22, 12, 6, 10, 34, 65, 29, 9, 30, 81, 4, 5, 19, 20, 57, 44, 99 

    Output: 群組 1:3 6 9 4 5 群組 2:12 10 19 群組 3:22 29 20 群組 4:34 65 30 81 57 44 99 

    解題要領:

    建立四個 Queue,循序訪查數列各數字,分別放入所 屬 Queue中即可。

    一、認識堆疊(Stack) 1. 教師於課前準備以下物品: (1)透明的量筒 1個  (需能放入塑膠球)。 (2)不同顏色的塑膠球若干個。 

    2.教師依序放入塑膠球,然後請同學觀察取出的順序 與放入的順序有何差異?教師請同學發表後,總

    結:

  • 堆疊的使用方式

    (第 3節結束) 堆疊的應用 

    40

    10 

    色球放入量筒的順序,與取出的順序

    剛好相反,這種特性,我們稱做「先

    進後出」。 

    3.教師再度示範:一堆書本堆疊後,在維持書本堆疊 不傾倒的狀況下,要取出其中一本書,就必須先把

    上面的書一一移開後,才能順利取出,以此強調 「後

    進先出」這種性質,並說明此性質在資訊領域中,

    可用資料結構堆疊(Stack)表示。堆疊(Stack)是一種 後進先出的資料結構。

    二、瞭解堆疊的基本操作 1. 教師介紹堆疊的基本操作 (1)建立一個堆疊(Create) (2)插入一個元素(Push) (3)取出一個元素(Pop) (4)讀取頂端元素(Top) (5)取得目前元素的個數(Count) 

    Top 

    2.教師以程式示範堆疊的基本操作後,請同學練習。

    備註: C 語言:請教師預先利用 C 語言寫好 Stack 的操作函

    式,供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的  Stack 

    模版(template)。

    三、堆疊在資訊領域的應用

    教師舉例說明堆疊在資訊領域的應用,作為總

    結。以下請參考: 1.程式語言執行時,用來記錄函式的返回位址。 2.應用軟體用來記錄使用者操作的步驟,以便容易回 

  • (第 4節結束) 

    40 

    溯還原。 3.將中置的數學算式轉換為後置,或計算後置數學算 式的結果。 

    4.利用來實作演算法 backtracking 

    四、練習

    教師揭示練習題目,並解釋題目意思後,請同學練

    習。同學練習時,教師可視同學解題情況,適當提示

    同學解題方向。

    題目 1 一個左括弧,必有一個右括弧與之配對,且此配對的

    組合左括弧須在右括弧前面。若給定一堆左右括弧,

    試寫一個程式判斷左右括弧是否均能配對。 

    Input ()(()) (()) )()( 

    Output ()(()) Yes! (()) Yes! )()( No! 

    解題要領:

    利用  Stack,遇到左括號,直接推入堆疊,遇到右括 號自堆疊取出一個左括號 1.若輸入為空,判斷堆疊是否為空,若為空則有配對, 否則反之。 

    2.若須自堆疊取出一個左括號,但此時堆疊卻為空, 則未能配對成功。

    題目 2: 在練習本題時,教師宜先解釋何謂後置表示式。

    後置表示式即運算子寫在所須運算元後的一種算術

    表示法。此種表示式的優點是可以不用括弧幫助,即

    可表示初運算子優先次序。

    給定一個後置算術表示式,請計算出結果。 Input 9 5 + 2 * 

    Output 28

  • 認 識 鏈 結 串 列 (Linked list) 

    50  解題要領: 利用  Stack,遇到數字直接推入堆疊,遇到運算子取 出兩個元素(數字)後計算,結果再推入堆疊,直至輸 入為空,此時堆疊頂端的元素即為計算結果。

    一、認識鏈結串列(Linked list) 1. 認識串列(List) (1)教師介紹串列的定義 串列(List)是按照一定順序關係的資料組。 (注意:此處順序關係,與排序並不相同) 

    例如:

    四季:春、夏、秋、冬

    英文字母:A~Z 3n+1數列:10, 5, 16, 8, 4, 2, 1 由小排列到大的數列:12, 14, 26, 32 

    (2)教師請同學思考,串列資料應如何儲存在電腦中? 教師可提示學生:使用陣列可不可以? 

    2.教師請同學討論使用陣列來表示串列的優缺點。 教師可以使用例子,引導學生討論說明,例如: 

    (1)新增數字 20 (2)刪除數字 14 

    參考答案:

    優點 (1)觀念簡單,容易使用。 (2)存取陣列元素,僅須常數時間。

    缺點 (1)陣列宣告後,可使用空間便已決定,無法增減。 (2)刪除、插入元素,須花時間作資料搬移動作,維護

    代價高昂。

    教師總結說明使用陣列表示串列的優缺點後,向同學

    介紹資料結構「鏈結串列」 。

  • (第 5節結束)

    鏈結串列的使用方式

    鏈結串列的應用 

    40

    10 

    3.介紹鏈結串列的結構 鏈結串列是由一群節點組合而成。 (1)節點(node) 

    (指向下一個節點) 

    typedef struct node { 

    int value; node *next; 

    }; 

    (2)鏈結串列 

    (3)教師展示鏈結串列執行以下操作,並請學生觀察比 較與之前陣列表示的不同:

    (備註:僅須展示,不必詳細說明動作的每一步) a. 新增數字 20 b. 刪除數字 14 

    4.鏈結串列主要的特性 教師總結以上討論,總結如下: (1)使用空間可以依照實際需求增減,不會有閒置情況

    或空間使用上限的限制。 (2)插入、刪除節點均在常數時間完成。 (3)尋找或提取節點的值,須循序尋找。 鏈結串列適合表示有序的資料組,且資料組常有增

    加、刪除等維護動作的時候尤其適合,例如:資料庫

    索引等。

    二、鏈結串列的基本操作

    教師以實際程式碼解說以下基本操作 (1)建立一個鏈結串列(Create)。 (2)插入一個節點(Insert)。 (3)刪除一個節點(Delete)。 (4)尋找一個節點(Search) 

    值 指標 

    Head  12  14

    32 26

  • (第 6節結束) 鏈結串列的練習

    (第 7節結束) 認識樹狀結構 (Trees) 

    50

    50 

    備註: C語言: 請教師預先利用 C語言寫好 list 的操作函式,

    供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的  list 模

    版(template)。

    三、鏈結串列在資訊領域的應用 1. 可用來實作其他的資料結構,例如:Queue、Stack、 

    Tree等。 2. 可以用來表示圖形  (Graph) 3. 可以用來表示多項式。 4. 資料庫資料的索引建置。

    四、練習

    教師揭示練習題目,並解釋題目意思後,請同學練

    習。同學練習時,教師可視同學解題情況,適當提示

    同學解題方向。 (※教師可視時間,練習 13題。)

    題目 1: 給定兩個多項式,試計算出此二多項式相加的結果。 

    Input 3 14 2 8 1 0      (代表 3x 14 + 2x 8 + 1) 8 14 3 10 10 6      (代表 8x 14  3x 10 + 10x 6 ) 

    Output 11 14 3 10 2 8 10 6 1 0 (代表 11x 14  3x 10 + 2x 8 + 10x 6 + 1) 

    解題要領:

    將多項式表示為鏈結串列,如下圖所示:

    題目 2:

  • (第 8節結束) 樹狀結構的使用方式  50 

    利用鏈結串列表示圖形。請參閱附件 1 

    題目 3: Keroro  紐約遊記 請參閱 ZeroJudge: http://judge.nccucs.org/ShowProblem?problemid=d120 

    一、認識樹狀結構 1.教師介紹樹狀結構的名詞  (terminology) 教師利用附件二的圖形,向同學介紹以下的名詞。 (1)節點(node) (2)根(root) (2)祖先與後代(ancestor & descendant) (3)父節點與子節點(Parent & Children) (4)兄弟(sibling) (5)階層(level) (6)分支度(degree) (7)樹葉(leaf) (8)二元樹(Binary  Tree):如果一個樹,每個節點的分 支度最多只有 2,則此樹稱作二元樹(Binary Tree) 

    2.教師請同學舉例日常生活常見的樹狀結構。 參考答案 (1)祖譜 (2)生物的分類 (3)圖書館書籍分類 (4)電腦的檔案系統 (5)學校的行政組織 

    3.不同種類的樹 教師展示以下樹的圖形,並向同學說明:「樹的

    應用非常廣,因此發展出許多不同種類的樹」,讓同

    學瞭解樹的應用梗概。 (1)引線二元樹(Threaded Binary Tree) (2)堆績樹(Heaps):Max  Heap、Min  Heap、MinMax 

    Heap、Deap (3)選擇樹(Selection Trees):Winner Tree、Loser Tree (4)搜尋樹

    二元搜尋樹(Binary Search Tree) 平衡樹(AVL Tree) 紅黑樹(RedBlack Tree) 23 Tree 234 Tree BTree 

    ※備註:此部份重點在讓學生瞭解存在有形形色色的

  • 樹的結構,因此教師僅須展示,大略說明,不需詳

    細深入介紹。

    二、樹狀結構的操作

    由於二元樹的應用最廣,也最常被使用,所以我們以

    二元樹作為介紹。 

    1. 樹的表示方式,主要有 2種: (1)串列指標 (2)陣列 

    2.串列指標表示法: (1)節點

    typedef struct tree_node { 

    int value; TNode *left; TNode *right; 

    } TNode; 

    (2)根 TNode *root; 

    (3)建立樹:依據樹的結構,分別建立節點,並將指標 連結起來即可。(請參見附件二二) 

    (4)樹的巡覽(Traversal) 

    前序  (Preorder)  N L R void PreOrder(TNODE *p) { 

    if (p != NULL) { printf(“%d", p>value); //走訪列印樹根節點 PreOrder(p>left); //走訪左樹 PreOrder(p>right); //走訪右樹

    } }

    中序  (Inorder)  L N R 

    L  R

  • (第 9節結束)

    void InOrder(TNODE *p) { 

    if (p != NULL) { InOrder(p>left); //走訪左樹 printf(“%d", p>value); 

    //走訪列印樹根節點 InOrder(p>right); //走訪右樹

    } }

    練習:

    後序  (Postorder)  L R N 教師請同學仿照前序、中序,自行練習。

    參考解答: void PostOrder(TNODE *p) { 

    if (p != NULL) { PostOrder(p>left); //走訪左樹 PostOrder(p>right); //走訪右樹 printf(“%d", p>value); 

    //走訪列印樹根節點 } 

    3.陣列表示法 (1)建立樹

    宣告一個陣列 #definde MAX 1024 int Tree[MAX]; for (int i=0; i

  • 樹狀結構的練習

    (第 10節結束) 認識集合  (Sets) 

    50

    15 

    void PreOrder(int p) { 

    if (Tree[p] != 1) { //走訪列印樹根節點 printf(“%d", Tree[p]); PreOrder(p*2+1); //走訪左樹 PreOrder(p*2+2); //走訪右樹

    } }

    三、練習

    教師說明二元搜尋樹的規則後,請同學練習寫一個程

    式,完成以下功能: 1. 建立一個二元搜尋樹 2. 利用中序列印出每個節點

    測試資料 37, 57, 23, 15, 32, 47, 80, 66 

    參考資料

    二元搜尋樹的定義

    二元搜尋樹是一個二元樹,且每個節點的值均大於其

    左樹節點值,並小於右樹節點的值。

    一、認識集合(Sets) 1. 教師以數學的集合概念,說明資料結構集合(Sets)。

    教師可以展示幾個數學的集合,例如: (1) 10的因數的集合  { 1, 2, 5, 10 } (2) 小於 50的質數集合  { 2, 3, 5, 7, 11, 13, ... , 47 } (3) 英文字母的集合  { ‘A‘, ‘B‘, ......, ‘Z‘ } 然後,問同學集合這樣的資料,該如何表示或儲存

    呢?並引導學生認識資料結構中的集合(Sets) 。資料 結構中的集合(Sets)適合用來表示數學上或日常生 活中的有限集合。 

    37 

    23  57

  • 集合的使用方式

    (第 11節結束) 集合的練習

    課程總結

    (第 12節結束) 

    35

    40

    10 

    2. 集合的實作 集合可以用樹實作,可參閱附件三。

    ※此部份教師僅須展示並簡略說明概念即可,不必深

    入實作細節

    二、集合的操作

    教師以實際程式碼解說以下基本操作 (1)建立一個集合(Create)。 (2)插入一個元素(Insert)。 (3)刪除一個元素(Delete)。 (4)尋找一個元素(Search) 

    備註: C語言: 請教師預先利用 C語言寫好 Set 的操作函式,

    供學生直接呼叫使用。 C++語言:教師可以直接使用標準函式庫中的  Set 模

    版(template)。

    三、練習

    教師揭示練習題目,並解釋題目意思後,請同學練

    習。同學練習時,教師可視同學解題情況,適當提示

    同學解題方向。

    題目

    試利用集合儲存小於 100的質數,然後讓使用者輸入 一個任一正數,程式告知是否在此集合中?輸入1表 列出此集合的所有元素。

    解題要領

    先寫一個函式,可以判斷所輸入的數,是否為質數。

    然後利用迴圈及判斷質數函式,建立集合即可。

    資料結構的總結 教師將介紹過的資料結構,作個快速的回顧與複習,

    並總結:

    資料結構是程式用來組織、儲存及表示資

    料的方法,面對問題時,若能善用資料結

    構,對於問題的解決,必定可以有很大的

    助益。

  • 附件一 鏈結串列

    練習題 2 

    試將下列圖形用鏈結串列 Linked list 表示。

    表示方式參考

  • 附件二 樹

    一、名詞介紹

    二、樹的表示法(串列指標) 

    *left  value  *right 

    *left  value  *right  *left  value  *right 

    *root 

    *left  value  *right 

    B  C  D 

    E  F  G  H  I  J 

    L  M 

    node 

    leaf 

    parent B 

    children E 

    siblings B, D 

    4 K  ancestors A, D, H 

    degree 3 

    height or depth = maximum level of any node in the tree = 4 

    degree of a tree = maximum of the degree of the nodes = 3

  • 三、陣列表示法

    父節點位置 (i1)/2 子節點位置 i*2+1,  i*2+2 

    1  2 

    Tree[0] 

    Tree[1] 

    Tree[2] 

    Tree[3] 

    Tree[4] 

    Tree[5] 

    Tree[6] 

    Tree[7] 

    Tree[8] 陣列 Tree

  • 附件三 集合的實作

    集合利用樹狀結構表示

    多個集合的表示法

    資料來源  http://web.thu.edu.tw/~johnaxer 資料結構 投影片 53

  • 附件四  C++ STL 舉例 

    1. Stack 

    #include   

    stack s;  //堆疊中的元素型態為 int 

    2.Queue 

    #include   

    queue q;  //佇列中的元素型態為 string 

    3.Linked list 

    #include   

    list link;  //鏈結串列中的元素型態為 string 

    4.Sets #include   

    set s;  //集合中的元素型態為 int

Recommended