19
壹、課程說明 單元名稱 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 集合使用方法

壹 、課程說明 - icerc.tnssh.tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/98-1-6.pdf · 壹 、課程說明 單元名稱 C 語言:資料結構 單元摘要 本教案主要目的在讓學生瞭解並認識

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

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