鏈結串列 Link List chapter 6 德明科技大學資訊科技系.

Slides:



Advertisements
Similar presentations
資料結構 – 鏈結串列 Linked List 綠園. 鏈結串列 -Linked List Linked List 是由許多相同資料型態的項目所組 成的有限序列。 可以把鏈結串列想像成火車,有多少人就只掛多 少節的車廂,需要車廂時再跟系統要一個車廂, 人少了就把車廂還給系統。 鏈結串列是有多少資料用多少記憶體空間,有新.
Advertisements

第一單元 建立java 程式.
基本概論 Basic concepts.
第三章 鏈結串列 Linked List 版權屬作者所有,非經作者 同意不得用於教學以外用途.
陣列 Array chapter 3 德明科技大學資訊科技系.
第三章 鏈結串列 Linked List.
第三章 鏈結串列 Linked Lists.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
Linked List Operations
單向鏈結串列 Singly Linked Lists.
資料結構 第3章 鏈結串列.
結構(struct).
第十一章 結構.
程式設計 博碩文化出版發行.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列
LINQ 建國科技大學 資管系 饒瑞佶.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
資料結構 第5章 佇列.
鏈結串列 (Linked List).
資料結構與演算法 第四章 鍵結串列 徐熊健.
第11章 資料結構 – 使用C語言的模組 11-1 資料結構的基礎 11-2 C語言的模組化程式設計 11-3 基本鏈結串列
4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
串列(List) 撰寫一串列程式.
資料結構與C++程式設計進階 鏈結串列 講師:林業峻 CSIE, NTU 6/ 10, 2010.
類別(class) 類別class與物件object.
(Circular Linked Lists)
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
鏈結串列 (Linked List) 註:要會指標(Pointer)
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
Ch03 鏈結串列結構 淡江大學 周清江.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
學習 2019/1/12. 學習 2019/1/12 Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.
4.1 單向鏈結串列 4.2 堆疊的加入與刪除 4.3 佇列的加入與刪除 4.4 其他型式的佇列
第三章 鏈結串列 3-1  單向鏈結串列 3-2 環狀鏈結串列 3-3 雙向鏈結串列.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
資料結構 第4章 堆疊.
第一單元 建立java 程式.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
Linked Lists Prof. Michael Tsai 2013/3/12.
挑戰C++程式語言 ──第8章 進一步談字元與字串
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
資料結構 老師:李崇明 助教:楊斯竣.
樣版.
C qsort.
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
資料結構使用Java 第6章 鏈結串列(Linked List).
第14章 結構與其他資料形式.
陣列與結構.
指標、串列 (Linked List).
Chapter 4 鏈結串列 Linked List 2019/5/14.
Chapter 15 檔案存取 LabVIEW中的檔案存取函數也可將程式中的資料儲存成Excel或Word檔。只要將欲存取的檔案路徑位址透過LabVIEW中的路徑元件告訴檔案存取函數後,LabVIEW便可將資料存成Excel或Word檔;當然也可以將Excel或Word檔的資料讀入LabVIEW的程式中。
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
資料結構 – 鏈結串列 Linked List 綠園.
資料表示方法 資料儲存單位.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
資料結構使用Java 第5章 串列程式實作.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Array(陣列) Anny
SQLite資料庫 靜宜大學資管系 楊子青.
鏈結串列 (Linked List).
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

鏈結串列 Link List chapter 6 德明科技大學資訊科技系

線性串列(Linear List) 線性串列 又稱有序串列(Ordered List)或循序串列(Sequential List) ,元素與元素之間有線性的相對關係,並且以循序方式儲存 堆疊與佇列都是線性串列 德明科技大學資訊科技系

陣列與鏈結串列比較 陣列 固定記憶體大小,設計簡單但沒彈性 鏈結串列 以節點串起整個串列,比較複雜但有彈性 德明科技大學資訊科技系

動態記憶體配置 Dynamical Memory Allocation 在C++使用動態記憶體配置的函數 靜態記憶體配置是在編譯階段時就配置記憶體空間 動態記憶體配置則是等到執行階段,才向作業系統要求配置所需的記憶體空間 動態記憶體配置可以讓程式設計者靈活運用程式所需的記憶體空間 在C++使用動態記憶體配置的函數 malloc() 與 free(): 只針對資料變數 new 與 delete: 針對變數與物件均可 德明科技大學資訊科技系

鏈結串列 「鏈結串列」(linked list) 可以用來解決單純陣列的缺點: 1. 鏈結串列的元素之間不必實體連續(即不必依元素順序佔用記憶體中的連續位址),只要有邏輯上 (logical) 的順序存在即可 2. 「鏈結」(link) 就是用來維持這順序的工具,它可以告訴我們「下一個元素放在哪裡」。 無首節點 listA 中國 美國 英國 蘇俄 有首節點 中國 美國 英國 蘇俄 首節點 德明科技大學資訊科技系

鏈結串列 依照資料特性,決定使用陣列或鏈結串列 鏈結串列內,一個節點包含兩部份 在電腦程式中,實作鏈結串列的方法有二 如果需要大量資料讀取,陣列比較合適 如果插入與刪除資料頻繁,鏈結串列比較合適 鏈結串列內,一個節點包含兩部份 資料 data,紀錄資料內容 鏈結 link,紀錄下一個節點的位置 在電腦程式中,實作鏈結串列的方法有二 以陣列完成 以結構與指標搭配完成 德明科技大學資訊科技系

以陣列實作鏈結串列 節點散佈在陣列中,實體位置沒有連續,但根據鏈結可以得到以下次序 3 1 6 7 3 1 6 7 data next Table[0] 3 [1] 美 國 6 #define MAXNODE 9 typedef struct tagListNode { char data[8]; /*資料欄位*/ int next ; /*鏈結欄位*/ } ListNode ; ListNode table[MAXNODE] ; [2] -1 [3] 中 國 1 [4] -1 [5] -1 [6] 英 國 7 [7] 蘇 俄 [8] -1 節點散佈在陣列中,實體位置沒有連續,但根據鏈結可以得到以下次序 3 1 6 7 3 中國 1 美國 6 英國 7 蘇俄 首節點 德明科技大學資訊科技系

新增節點 目標:要在 ‘英國’ 節點之後插入一個新節點 ‘法國’  找到一個空節點,填入資料  找到英國,或者條件已知 data next Table[0] 3  找到一個空節點,填入資料 [1] 美 國 6 [2]  法 國  -1→7  找到英國,或者條件已知 [3] 中 國 1  將英國的 next (7) 複製到法國的next [4] -1 [5] -1  將法國的位置 (2) 填入英國的next [6]  英 國  7→2 [7] 蘇 俄 [8] -1 3 1 6 7 3 中國 1 美國 6 英國 蘇俄 7→2 2 首節點 法國 7 德明科技大學資訊科技系

刪除節點 目標:要刪除 ‘英國’ 節點 3 1 6 2 7 3 1 2 7 data next Table[0] 3  找到英國 (6),以及英國的前一個節點 ‘美國’(1) [1] 美 國 6→2 [2] 法 國 7  將英國的 next (2) 複製到美國的next [3] 中 國 1  將英國節點還原為空節點 [4] -1 [5] -1 [6] 英 國 2 → -1 [7] 蘇 俄 [8] -1 3 1 6 2 7 3 中國 1 英國 2 法國 7 蘇俄 美國 6→2 首節點 德明科技大學資訊科技系

指標 Pointer ◎變數是存放資料的地方 int i, j; ◎指標是存放位址的地方 int *p; 5 i j i p p 指向 i p 裡面存放 i 的位址 *p 是 “p 所指變數” 的同義詞 相當於 j = i ; *p = 10 ; 10 i p 相當於 i=10 ; j p i j = *p ; 10 10 德明科技大學資訊科技系

結構 Structure student S1; //宣告S1變數 S1.age = 18 ; S1.height = 160 ; 結構則是將不同型別的元素集合起來,形成一種新的資料型別(結構) 1. struct student { 2. char name[8]; //姓名欄位 3. int age; //年齡欄位 4. int height; //身高欄位 5. } ; 此時就會產生一種叫做student的新結構體,這種結構體含有三個欄位 name age height S1 student S1; //宣告S1變數 S1.age = 18 ; S1.height = 160 ; strcpy(S1.name, “Mary”) ; Mary 18 160 name age height S1 德明科技大學資訊科技系

動態配置節點實作鏈結串列 鏈結串列所需的節點 資料:以結構的方式呈現多元資料 鏈結:以指標的方式動態配置節點 宣告 動態配置節點 typedef struct listnode { int data; // 資料欄位 struct listnode *next; // 鏈結欄位 } NODE; // 結點的宣告 NODE *listA; //C語言用 malloc 配置記憶體 listA = (NODE *) malloc( sizeof(NODE)) ; //C++語言用 new 配置記憶體 listA = new NODE ; data next listA 德明科技大學資訊科技系

鏈結串列 鏈結串列 由一個或一個以上動態記憶體分配的節點 (node)所組成 p6-10 鏈結串列 由一個或一個以上動態記憶體分配的節點 (node)所組成 每一個節點至少會有兩個或兩個以上的欄位,分別存放資料及指標,此指標稱為鏈結(link) 若某節點無下一個節點,則此節點的連結為空指標(Null) 德明科技大學資訊科技系

鏈結串列特性 各節點不一定要佔用連續的記憶體空間 各節點之資料型態不一定要相同 插入與刪除節點方便 重點是以指標鏈結串起 鏈結串列各元素在記憶體之位置是不連續的 鏈結串列由動態記憶體分配的節點(Node)串接而成 相形之下,陣列為一個循序(Sequential)之記憶體結構 德明科技大學資訊科技系

德明科技大學資訊科技系

單向鏈結串列 節點結構 雙向鏈結串列 節點結構 德明科技大學資訊科技系

單向鏈結串列與雙向鏈結串列比較 德明科技大學資訊科技系

單向鏈結串列 typedef struct node //以結構來表示節點 { int data; // data儲存節點資料項目 struct node *link; // link儲存下一個節點的位址 }NODE; NODE *list; 德明科技大學資訊科技系

指向串列的第一個節點,而首節點並沒有任何資料 其中 list:指向串列前端之指標 首節點(Head Node): 指向串列的第一個節點,而首節點並沒有任何資料 德明科技大學資訊科技系

單向鏈結串列的建立 list=NewNode( ); listdata=10; listlink=NULL; 德明科技大學資訊科技系

單向鏈結串列的插入節點 有三種不同的情形: 在串列的第一個節點前插入節點 在串列的最後一個節點後面插入節點 在串列的中間位置插入節點 德明科技大學資訊科技系

在串列的第一個節點前插入節點 把新節點的指標指向串列首,再把串列首移到新節點上即可 程式怎麼寫? 德明科技大學資訊科技系

在串列的最後一個節點後面插入節點 把串列的最後一個節點的指標指向新節點,新節點再指向NULL即可 程式怎麼寫? 德明科技大學資訊科技系

串列的中間位置插入節點 如果插入的節點是在P與Q之間,只要將P節點的指標指向新節點R,新節點的指標指向Q節點即可 程式怎麼寫? 德明科技大學資訊科技系

單向鍵結串列的刪除節點 有三種不同的情形: 刪除串列的第一個節點 刪除串列內的中間節點 刪除串列後的最後一個節點 德明科技大學資訊科技系

刪除串列的第一個節點 把串列首指標指向第二個節點 不要忘記將被刪除的節點釋放記憶體 程式怎麼寫? 德明科技大學資訊科技系

刪除串列內的中間節點 只要將刪除節點的前一個節點的指標,指向欲刪除節點的下一個節點即可 不要忘記將被刪除的節點釋放記憶體 程式怎麼寫? 德明科技大學資訊科技系

刪除串列的第一個節點 只要指向最後一個節點的指標,直接指向NULL即可 不要忘記將被刪除的節點釋放記憶體 程式怎麼寫? 德明科技大學資訊科技系

鏈結串列的反轉 將每個節點的鏈結指標往回指 德明科技大學資訊科技系

將目前的節點(current)指向Null,並且pt指向首節點的下一個節點 步驟一 將目前的節點(current)指向Null,並且pt指向首節點的下一個節點 德明科技大學資訊科技系

步驟二 使用while迴圈來將串列反轉 德明科技大學資訊科技系

德明科技大學資訊科技系

德明科技大學資訊科技系

步驟三 最後一個反轉後變成第一個節點 德明科技大學資訊科技系

鏈結串列的連結 兩個鏈結串列首尾相連 德明科技大學資訊科技系

鏈結串列的長度 鏈結串列內不含首節點的節點個數 例如下圖長度是4 德明科技大學資訊科技系

鏈結串列的長度 德明科技大學資訊科技系