本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。

Slides:



Advertisements
Similar presentations
等可能性事件的概率(二) 上虞春晖中学数学组欢迎你! 1 本课件制作于 §10.5 等可能事件 的概率 ( 二 )
Advertisements

概率.
科學論文 鰂魚涌街的衛生情況 作者:廖梓芯 學校:北角官立上午小學 班級:P.5A.
时间与我们的世界 Pb 段心蕊.
第1节 压强.
第7章 樹與二元樹 (Trees and Binary Trees)
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
《成佛之道》序~第三章 圓融 /
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
第三章 鏈結串列 Linked List.
大气的受热过程 周南中学.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第二章 线性表.
第2章 线性表 2.1 线性表的概念及运算 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 一元多项式的表示及相加.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
程式設計 博碩文化出版發行.
佇列 (Queue).
資料結構 第5章 佇列.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第3章 C 語言的基本知識.
结构体和共用体 2 梁春燕 华电信息管理教研室.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第2章 线性表(三) 1/.
第12章 樹狀搜尋結構 (Search Trees)
第十五章 Linked List, Stack and Queue
第3章 栈和队列(二) 1/.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第二章 线性表.
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
五、链 表 1、单链表 2、双向链表 3、链表应用.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
樹狀結構 Tree Structure chapter 7 德明科技大學資訊科技系.
資料結構 第4章 堆疊.
樹 2 Michael Tsai 2013/3/26.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
王玲 第 2 章 线性表 王玲 2019/2/25.
Struct結構 迴圈
3.1 线性表及逻辑结构 3.2 线性表的顺序存储 3.3 线性表的链式存储 3.4 链式存储结构的应用
自我參考結構 (self-reference – 1)
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第十章 结构体与链表 西安工程大学.
香港傳統的農村生活.
資料結構與C++程式設計進階 實作練習 講師:林業峻 CSIE, NTU 6/ 24, 2010.
Linked Lists Prof. Michael Tsai 2013/3/12.
第7章 樹與二元樹(Trees and Binary Trees)
商事法報告 - 第六組 組長:陳雅琪 4A 組員:陳孟瑄 4A 林庭意 4A 黃婉婷 4A360020
第二章 线性表.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
◆ 第3節 基音與泛音 一、縱波的駐波 二、開管樂器的駐波 三、閉管樂器的駐波 四、共鳴空氣柱實驗 範例 1 範例 2 範例 3 範例 4
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Chapter 2 Entity-Relationship Model
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
《液体压强》复习课 一、知识复习 二、例题讲解.
Presentation transcript:

本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。 請依出版社授權使用規範利用本教學資源,非經授權許可不得以影印、拷貝、列印等方法進行重製,亦不得改作、公開展示著作內容,亦請勿對第三人公開傳輸、散布。 戴顯權 著 / 資料結構 © 滄海圖書

Chapter 3 鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

本章內容 3.1 鏈結串列簡介 3.2 單向鏈結串列 3.3 環狀鏈結串列 3.4 雙向鏈結串列 3.5 應用範例— 處理學生成績資料 3.1 鏈結串列簡介 3.2 單向鏈結串列 3.3 環狀鏈結串列 3.4 雙向鏈結串列 3.5 應用範例— 處理學生成績資料 3.6 ** Convex hull 戴顯權 著 / 資料結構 © 滄海圖書

鏈結串列 我們可用陣列來表示一個串列,它的優缺點分別為: 優點:用陣列來表示串列,我們只要用元素的索引值就可 以很快地取得一個元素,因此能很容易地達成隨機存取 (random access) 的目的。 缺點:插入和刪除的運算所需要的時間複雜度為O(n)。這 是因為陣列元素的實際記憶體位置是依序相連的,因此元 素的插入與刪除運算都必須進行元素位置的更動,以維持 實際記憶體位置相連的要求 戴顯權 著 / 資料結構 © 滄海圖書

鏈結串列 如果我們的應用常常需要在串列中做插入與刪除的 運算,那麼使用陣列來表示串列就不合適 在這種情況下,使用鏈結串列(linked list) 才是正確 的選擇 鏈結串列的元素並不要求使用實際相連的記憶體位 置,我們只需要利用鏈結來維持元素間的連續性以 及順序即可 戴顯權 著 / 資料結構 © 滄海圖書

鏈結串列 使用一種稱為「節點」(node) 的基本資料結構,每一 個節點至少包含兩個欄位:資料欄位與鏈結欄位 鏈結欄位所記錄的是下一個節點的索引值或位址 鏈結串列的另一個優點是:我們可以輕易地做到節 點的插入與刪除運算,不需要搬移資料,只需要改 變鏈結 戴顯權 著 / 資料結構 © 滄海圖書

鏈結串列 鏈結串列裡的任何一個節點,實際上可以放在記憶 體裡的任何一個位址上 每一個元素節點除了資料部分外,還需要有一個指 向串列裡的下一個元素的指標(pointer),這個指標一 般我們就稱之為鏈結(link)。 戴顯權 著 / 資料結構 © 滄海圖書

鏈結串列 一般會在串列的前端加上一個特殊節點,稱為首節 點(head node 或first node) 最後一個節點的鏈結或者指標為 NULL 戴顯權 著 / 資料結構 © 滄海圖書

使用靜態配置節點實作鏈結串列 mylist 是一個陣列,因此 每一個節點可以透過一 個整數索引來追蹤到 所以,next 欄位宣告為 整數型態 #define Max_Node 7 typedef struct listnode { char data[8]; /* 資料欄位*/ int next; /* 鏈結欄位*/ } Node; Node mylist[Max_Node]; mylist 是一個陣列,因此 每一個節點可以透過一 個整數索引來追蹤到 所以,next 欄位宣告為 整數型態 戴顯權 著 / 資料結構 © 滄海圖書

初始化 假設我們只有一個鏈結串列,並 且用mylist[0] 做為首節點,那麼 經過初始化以後的mylist 變成: 其中next 欄位的0 表示鏈結串列 結束,–1 表示該節點未被用到 (是自由節點)。為了簡化起見, 我們假設Max_Node=7 戴顯權 著 / 資料結構 © 滄海圖書

初始化 經過一段時間的處理,鏈結串列現在變成如下圖所 示 戴顯權 著 / 資料結構 © 滄海圖書

插入一個新節點 例如台北,並且要加在台南 節點之後,步驟是: 從mylist 的首節點(mylist[0]) 向下掃描,找出第一個next 欄位為 –1 的節點(自由節點)。 找到mylist[1],我們在 mylist[1].data 欄位中填入 「台北」 戴顯權 著 / 資料結構 © 滄海圖書

插入一個新節點 從鏈結的首節點(mylist[0]) 沿著鏈結走,尋找台南的所 在節點,結果我們找到 mylist[4] 戴顯權 著 / 資料結構 © 滄海圖書

插入一個新節點 把mylist[4].next 指派給 mylist[1].next。因此 mylist[1].next 變為3 戴顯權 著 / 資料結構 © 滄海圖書

插入一個新節點 把mylist[4].next 設為新節 點的位置1 戴顯權 著 / 資料結構 © 滄海圖書

刪除一個節點 要刪除一個節點,例如台 南,我們可以按照以下的 步驟來進行: 首先沿著鏈結,找到台南 的所在位置(mylist[4]),以 及台南的前一個節點位置 戴顯權 著 / 資料結構 © 滄海圖書

刪除一個節點 把mylist[4].next 指派給 mylist[0].next 戴顯權 著 / 資料結構 © 滄海圖書

刪除一個節點 把mylist[4].next 設為 –1, 還原為自由節點 戴顯權 著 / 資料結構 © 滄海圖書

節點表示法-陣列 使用陣列結構來實作鏈結串列的優點是:鏈結的方 式很簡單 但是它也有一個缺點:一開始就必須宣告陣列的大 小,宣告太多而使用太少,則浪費記憶體;宣告太 少而不足使用,則缺乏彈性 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 定義Node 為含有兩個欄位的結構型態,其中data 欄 位是整數型態 next 欄位是指標型態,它指到一個listnode 資料型態, 也就是Node 本身 最後的一個宣告指令,則是宣告listA 為指向一個 Node 資料型態的指標 換句話說,每一個節點都有一個資料欄位以及一個 鏈結欄位,其中鏈結欄位是一個指向某個節點的指 標 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 跟前一小節的陣列作法不同的是,在此每個節點都 可以動態配置、歸還 換句話說,只有當程式在執行的過程中有需要時, 才機動地向系統要記憶體;而且一旦不需要了,還 可以馬上還給系統 因此,我們並不需要事先預估我們的程式可能會用 到多少個節點 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 動態配置在C 語言可以用malloc 庫存函式來呼叫 它的結果是傳回節點在記憶體中的位址,即 listA=(Node*) malloc (sizeof (Node)); 其結果可以用下圖表示: 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 節點在記憶體裡的實際位置,因為位置(位址) 就儲存 於指標listA 中 現在,假設要把55 存入data 欄位、NULL 存入鏈結 欄位,那麼可以用以下的指令來完成: listA->data=55; listA->next=NULL; 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 節點的產生與使用 或者也可以寫成: (*listA).data=55; (*listA).next=NULL; 這是因為*listA 本身就代表指標listA 所指向的記憶體位置 它的結果會如下圖所示,其中我們用 接地來表示它的next 欄位等於NULL 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 插入節點 假設我們要把新節點, 即NewNode 指標所指 向的節點,插入p 指 標所指向的節點之後, 如圖3.2 所示。我們 必須處理兩個鏈結 戴顯權 著 / 資料結構 © 滄海圖書

NewNode->next=p->next; 使用動態配置節點實作鏈結串列 插入節點 把NewNode 所指向的節 點之鏈結欄位設定為p 所指向節點的鏈結欄位 值,使得p 所指向節點 的下一個節點現在也變 成NewNode 所指向節點 的下一個節點。 換句話說,就是執行 NewNode->next=p->next; 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 插入節點 接著處理p 所指向節點的 鏈結欄位,把它的內容 更新為NewNode,使得p 所指向節點的下個節點 變成NewNode 所指向的 節點 換句話說,就是執行 p->next=NewNode; 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 插入節點 單向鏈結串列的插入運算之虛擬碼如下: 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 插入節點 以C 語言來表示: 戴顯權 著 / 資料結構 © 滄海圖書

戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 刪除節點 要刪除某個節點,我們只要改變它的前個節點( prenode) 的鏈結,把它的鏈結內容更新為指向欲刪除節點的下個 節點的位址即可,如此便將p 從串列中刪除 首先必須先取得prenode 的位址。最後要把p 所佔用的記 憶體歸還,才算是完整的刪除運算 換句話說,就是執行 prenode->next=p->next; free( p); 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 刪除節點 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 刪除節點 單向鏈結串列的刪除運算之虛擬碼如下: 戴顯權 著 / 資料結構 © 滄海圖書

使用動態配置節點實作鏈結串列 刪除節點 以C 語言來表示: 戴顯權 著 / 資料結構 © 滄海圖書

戴顯權 著 / 資料結構 © 滄海圖書

環狀鏈結串列 鏈結串列中,最後一個節點的鏈結欄位固定指向 NULL。這種鏈結串列稱為線性鏈結串列(linear linked list) 它的特點是:如果要拜訪串列裡的任一節點,都必 須從首指標(FirstNode) 開始循序地拜訪鏈結 戴顯權 著 / 資料結構 © 滄海圖書

環狀鏈結串列 從任意節點出發均無法走到在它之前的節點,因此 在出發節點前面的節點資料都無法取得 有一個簡單的辦法可以解決這個問題,而且這個辦 法不需要額外使用任何變數或者記憶體 戴顯權 著 / 資料結構 © 滄海圖書

環狀鏈結串列 所有節點的鏈結構成一個環,因此稱為環狀鏈結串 列(circular linked list) 從任何節點出發都可以拜訪到所有的節點,最後也 可以回到原出發節點 環狀鏈結串列的運算基本上和單向鏈結串列並無不 同,只是環狀鏈結可以從任意一個節點開始,而結 束條件則是回到原出發節點,而不是「鏈結欄位等 於NULL」 戴顯權 著 / 資料結構 © 滄海圖書

回收環狀鏈結串列 假設avail 指標指向一個可使用的鏈結串列之首節點 位址 當我們要把一個已使用過、存有資料的環狀鏈結串 列做回收還給avail 時,我們只需要先把環狀鏈結串 列的首節點(FirstNode) 所指向節點之鏈結欄位值暫 存在temp 裡 然後把FistNode所指向節點的鏈結欄位值更新為avail 最後再把avail 指標更新為temp 就可以了 戴顯權 著 / 資料結構 © 滄海圖書

回收環狀鏈結串列 avail 指標就指向FirstNode 所指向節點原先的下一個 節點,而FirstNode 所指向節點的鏈結欄位值則是原 本avail 指標所指向的位址 整個環狀鏈結串列已歸還為可使用的串列,由avail 指標即可取用剛歸還的環狀鏈結串列之節點 戴顯權 著 / 資料結構 © 滄海圖書

回收環狀鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

回收環狀鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

環狀鏈結串列的特性 由串列中任何一個節點開始,都可拜訪整個串列裡 的所有節點。 回收整個環狀鏈結串列的時間複雜度是O(1),跟串 列的長度無關。 戴顯權 著 / 資料結構 © 滄海圖書

戴顯權 著 / 資料結構 © 滄海圖書

戴顯權 著 / 資料結構 © 滄海圖書

雙向鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

雙向鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

雙向鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 要插入一個(由NewNode 指標所指向的) 新節點到p 指 標所指向的節點之右 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 處理新節點上的兩個鏈結 左鏈結:NewNode->left 右鏈結:NewNode->right 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 改變舊節點的鏈結,讓它們都更改為指向新節點 左鏈結p->right->left ,更新為指向NewNode 右鏈結p->right,把它更新為NewNode 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 戴顯權 著 / 資料結構 © 滄海圖書

插入節點 戴顯權 著 / 資料結構 © 滄海圖書

戴顯權 著 / 資料結構 © 滄海圖書

( p->left)->right=p->right 刪除節點 改變p 所指向節點之左邊節點的右鏈結,使它越過p 所指向的節點 ( p->left)->right=p->right 戴顯權 著 / 資料結構 © 滄海圖書

( p->right)->left =p->left 刪除節點 改變p 所指向節點之右邊節點的左鏈結,使它越過p 所指向的節點 ( p->right)->left =p->left 戴顯權 著 / 資料結構 © 滄海圖書

刪除節點 完成p 的前、後節點的鏈結指標更新後,我們就可 以把p 所指節點的記憶體釋回,以完成刪除p 節點 的整個運算 free( p) 戴顯權 著 / 資料結構 © 滄海圖書

刪除節點 戴顯權 著 / 資料結構 © 滄海圖書

刪除節點 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull Convex hull 問題的定義是: 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 在一一檢查各個點的內角是否符合convex hull 的要求 時,我們經常需要增加或刪除點 因此,正好可以利用雙向鏈結串列的便利性來解決 這個問題 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 步驟1:(解決特殊情形) 如果S 裡的點數小於3,那麼直接傳回S; 如果所有的點都在同一條直線上,那麼找出最短的一條線 段的兩個端點,其中這條線段包含S 裡的所有點,傳回這 兩個點; 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 步驟2:(根據角度來排序S 裡的點) 找一個在S 分布範圍中間的點P,P 可以是S 裡的一個點, 也可以不是 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 接著從P 點往下畫一條垂直線L 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 根據S 中各點與L 所形成的夾角大小把S 排序;角度相同 的則比較與P 點間的距離,在此僅保留距離最長的點 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 按照排序後的S 裡的各點順序建立(環狀) 雙向鏈結串列 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題   for (Pa = P1, Pb = Pa->right_link ; Pa! = Pb ; )   {    Pc =Pb->right_link;    if (由Pa、Pb、Pc 所形成的外部夾角)    /* 外部夾角相當於內部夾角 */    {    從雙向鏈結串列中刪除Pb;    Pb = Pa; Pa = Pb->left_link;    }    else { Pa = Pb; Pb = Pc;}   } 最後的雙向鏈結串列將只保留形成convex hull 的點。 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 戴顯權 著 / 資料結構 © 滄海圖書

利用Graham 掃描解決convex hull 問題 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 一開始,平面上有一群頂點集合S 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入 9 與0 的頂點 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入 1 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入 2 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入 3 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入4後,需刪除3 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 刪除3 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入5後,需刪除4 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 刪除4 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入6、7 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 加入8後,需刪除6、7 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 形成最後的convex hull 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 戴顯權 著 / 資料結構 © 滄海圖書

Convex hull 形成圖解 戴顯權 著 / 資料結構 © 滄海圖書