鏈結串列 (Linked List) 註:要會指標(Pointer)

Slides:



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

第三章 鏈結串列 Linked List 版權屬作者所有,非經作者 同意不得用於教學以外用途.
第三章 鏈結串列 Linked List.
第三章 鏈結串列 Linked Lists.
第四章 數列與級數 4-1 等差數列與級數 4-2 等比數列與級數 4-3 無窮等比級數 下一頁 總目錄.
Chap5 Graph.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
單向鏈結串列 Singly Linked Lists.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
資料結構 第3章 鏈結串列.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
鏈結串列 (Linked List).
資料結構與演算法 第四章 鍵結串列 徐熊健.
第11章 資料結構 – 使用C語言的模組 11-1 資料結構的基礎 11-2 C語言的模組化程式設計 11-3 基本鏈結串列
4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用
Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.
串列(List) 撰寫一串列程式.
Chap 4 鏈結串列 Linked Lists.
資料結構與C++程式設計進階 鏈結串列 講師:林業峻 CSIE, NTU 6/ 10, 2010.
第十五章 Linked List, Stack and Queue
(Circular Linked Lists)
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第 六 章 鏈結串列(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 雙向鏈結串列.
Chapter 9 高度平衡二元搜尋樹 AVL Binary Search Tree
Java 程式設計 講師:FrankLin.
Chap3 Linked List 鏈結串列.
第一章 直角坐標系 1-1 數系的發展.
Chapter 11 B-tree 11.1 m-way 搜尋樹 11.2 B-tree.
Chapter 4 資料結構.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列
第 19 章 XML記憶體執行模式.
Definition of Trace Function
資料結構與C++程式設計進階 實作練習 講師:林業峻 CSIE, NTU 6/ 24, 2010.
Linked Lists Prof. Michael Tsai 2013/3/12.
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
如何使用Gene Ontology 網址:
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
資料結構 老師:李崇明 助教:楊斯竣.
樣版.
C qsort.
資料結構使用Java 第6章 鏈結串列(Linked List).
MiRanda Java Interface v1.0的使用方法
第14章 結構與其他資料形式.
陣列與結構.
指標、串列 (Linked List).
Chapter 4 鏈結串列 Linked List 2019/5/14.
Chapter 15 檔案存取 LabVIEW中的檔案存取函數也可將程式中的資料儲存成Excel或Word檔。只要將欲存取的檔案路徑位址透過LabVIEW中的路徑元件告訴檔案存取函數後,LabVIEW便可將資料存成Excel或Word檔;當然也可以將Excel或Word檔的資料讀入LabVIEW的程式中。
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
資料結構 – 鏈結串列 Linked List 綠園.
11058: Encoding ★☆☆☆☆ 題組:Problem Set Archive with Online Judge
例題 1. 多項式的排列 1-2 多項式及其加減法 將多項式 按下列方式排列: (1) 降冪排列:______________________ (2) 升冪排列:______________________ 排列 降冪:次數由高至低 升冪;次數由低至高.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
資料表示方法 資料儲存單位.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
在直角坐標平面上兩點之間 的距離及平面圖形的面積
資料結構使用Java 第5章 串列程式實作.
鏈結串列 Link List chapter 6 德明科技大學資訊科技系.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
鏈結串列 (Linked List).
Presentation transcript:

鏈結串列 (Linked List) 註:要會指標(Pointer) 授課老師:蕭志明

鏈結串列較優於陣列,因為只需改變一些指標即可 鍊結串列特性 鏈結串列(linked list)是由許多結點所組成的,在加入和刪除功能上比陣列彈性許多。且加入與刪除的動作,可以針對串列首、串列尾或串列中的某個節點。 鏈結串列視實際需要才配置記憶體空間,可減少浪費。 可以取代陣列儲存方式(堆疊與佇列),而其所含資料元素的數 目可以彈性的增減。 陣列儲存方式 鏈結串列儲存方式 加入與刪除 需做大量的資料搬移 僅須改變指標即可 記憶空間 無需額外的空間存放鏈結資料 需額外的空間存放鏈結資料 資料的存取 可對資料做直接的存取 適合資料的循序存取 資料的合併與分開 鏈結串列較優於陣列,因為只需改變一些指標即可

節點(Node) 節點 (Node)是鏈結串列中的重要元素 節點 (Node) 是一個最少有兩個欄位的結構: 一個欄位包含資料。 另一個欄位包含串列中下一個節點的位址。

Node的結構與產生 結構宣告: struct node { int number; struct node *llink; } head = (struct node *) malloc (sizeof(struct node));

Node的結構與產生(續) 結構宣告: struct node { string name; string address; int phone; struct node *llink; } Node 的產生: head = (struct node *) malloc (sizeof(struct node));

Example 假設鏈結串列中每個節點(node)的資料結構有兩欄,分別為資料(data)欄和鏈結(next)欄,結構可需告如下: Struct node { int data; struct node *next; }; 例如:下列串列有a, b, c, d, x等的資料元素。 head:指向串列前端的指標。 tail:指向串列尾端的指標。 tail head a b c d x

鍊結串列概念 鍊結串列 (Linked List) 是一個有序的資料集合,其中每一個元素都包含下一個元素的位址。 也就是說,每一個元素可分為兩部份:資料 (Data) 與鍊結 (Link)。 資料部份儲存資料。 鍊結部份用於將資料鍊結在一起。它包含一個指標,負責辨識串列的下一個元素。 另外,還有一個指標變數,指向串列的第一個元素。 我們討論的鏈結串列-單一鏈結串列,每一個元素只包含一個鍊結,只能指向一個後續元素。 鍊結串列的優點是資料的新增與刪除操作。 當新增與刪除一個元素時,不必因串列中元素邏輯順序的改變,而移動它們的實際儲存位置。 因為串列不要求元素在實際儲存時,要一個接一個地存放。但也無法進行二元搜尋,必須採用循序搜尋。

鍊結串列概念(續) 如圖(a)所示,pHead(指向串列的第一個元素),包含4個元素。 除了最後一個元素之外,每一個元素中的鍊結都指向它的後續元素。 而最後一個元素的鍊結是一個null指標,表示串列的結束。 若串列的指標變數為null指標,表示它是一個空的鏈結串列,如圖(b) 所示。

鏈結串列資料結構 鍊結串列的特性就是節點之間沒有實體的 關係,也就是說他們不是連續儲存的。 就鏈結串列而言,在節點之間沒有實體的 關係。 鍊結串列的特性就是節點之間沒有實體的 關係,也就是說他們不是連續儲存的。 就鏈結串列而言,在節點之間沒有實體的 關係。 需要指標來辨別串列的第一個節點,還有任何一個節點,其後續節點的位址。 指向串列開始位置的指標稱為表頭指標 (Head Pointer) 。在上圖中,pHead就是 head指標,而link指向節點的後續節點。

鍊結串列種類 可分為: 單向鏈結串列(single linked list) 環狀串列(circular linked list) 雙向鏈結串列(doubly linked list)

單向鏈結串列優點 以陣列方式存放資料時,若要插入(insert)或刪除(delete)某一節點(node)就倍感困難了。 如在陣列中已有a,b,d,e四個元素,現將c加入陣列中,並按字母順序排列。 方法就是d,e往後一格,然後將c插入;而刪除一元素,也必須挪移元素才不會浪費空間,有無方法來改善此一問題呢? 這就是本章所要探討的鏈結串列(linked list)。

單向鏈結串列(續) 鏈結串列在加入與刪除皆比陣列來得簡單容易,因為只要利用指標(pointer)加以處理就可以了。 假設鏈結串列中每個節點(node)的資料結構有二欄,分別是資料(data)欄和鏈結(next)欄 ,若將節點結構定義為struct node 型態,則宣告如下:

單向鏈結串列(續) 如串列 A={a, b, c, d},其資料結構如下: head:指向串列前端的指標,通常假設此節點的data欄是空的亦即不放資料,這在一些運作上有其方便之處。

單向鏈結串列(加入於串列的前端) 假設有一串列如下: 有一節點x將加入於串列的前端,其步驟如下: (1) x=(struct node*) malloc(sizeof(struct node)); (2) x->next=head->next;

單向鏈結串列(加入於串列的前端) (3)head->next=x;

單向鏈結串列(加入於串列的尾端) 假設有一串列如下: 將一節點x加入於串列的尾端,其步驟如下: (1)x=(struct node *) malloc(sizeof(struct node));

單向鏈結串列(加入於串列的尾端) (2)x->next=NULL;

單向鏈結串列(加入於串列的尾端) 此時必須追蹤此串列的尾端在那兒,利用下列的片段程式 便可找到串列的尾端。

單向鏈結串列(加入於串列的尾端) (3)p->next=x;

單向鏈結串列(加入在串列某一特定節點的後面) 假設有一單向鏈結串列,按data欄位由大到小排列之。

單向鏈結串列(加入在串列某一特定節點的後面) 今有一節點ptr之data欄位值為75,欲加入到上述的串列中。首先我們必須找到插入的地方,可想而知75應插入到80和70之間,因此可用下述的片段程式執行之

單向鏈結串列(加入在串列某一特定節點的後面) 利用prev和current二個指標來追蹤,prev會緊跟在current節點之後

單向鏈結串列(加入在串列某一特定節點的後面) 接下來的動作:就是將ptr指向節點插在prev的後面 ptr->next=current; /*  */ prev->next=ptr; /*  */  

單向鏈結串列(刪除前端節點) 假設有一串列如下: 只要三步驟便可達成目的: p=head->next; head->next=p->next; free(p);

單向鏈結串列(刪除前端節點) (1) p=head->next;

單向鏈結串列(刪除前端節點) (2) head->next=p->next;

單向鏈結串列(刪除前端節點) (3)free(p); 經由free(p)便可將p節點回收。

單向鏈結串列(刪除串列的最後節點) 假設有一串列如下: 此時必須先追蹤尾端及尾端的前一個節點在那兒,步驟如下:

單向鏈結串列(刪除串列的最後節點)

單向鏈結串列(刪除串列的最後節點)

單向鏈結串列(刪除某一特定的節點) 刪除某一特定的節點也必須利用二個指標current和prev,分別指到即將被刪除節點(current)及前一節點(prev),因此prev永遠跟著current。

單向鏈結串列(刪除某一特定的節點) 假設有一單向鏈結串列如下: 今欲刪除“Mary”因此將del_data變數指定為“Mary”,接下來利用下列程式片段就可將current指標指向“Mary”的節點,而prev指向“John”節點,並將current指向的節點回收。

單向鏈結串列(刪除某一特定的節點) 

單向鏈結串列(兩個單向鏈結串列相互連接) 假設有二個串列如下: 將x與y串列合併為z串列,其步驟如下:

單向鏈結串列(兩個單向鏈結串列相互連接)

單向鏈結串列(兩個單向鏈結串列相互連接)

單向鏈結串列(兩個單向鏈結串列相互連接)

單向鏈結串列(將一串列反轉) 顧名思義,串列的反轉(invert)乃將原先的串列首變為串列尾,同理,串列尾變為串列首。若有一串列乃是由小到大排列,此時若想由大到小排列,只要將串列反轉即可。

單向鏈結串列(將一串列反轉) 假設有一串列如下: 經由下面幾個步驟就可完成反轉的動作:

單向鏈結串列(將一串列反轉)

單向鏈結串列(將一串列反轉)

單向鏈結串列(將一串列反轉) 由此迴圈的前三個敘述p指標,current指標和prev指標有先後順序。經過一次的動作後,串列如下:

單向鏈結串列(將一串列反轉) 依此進行到p == NULL後,迴圈停止

單向鏈結串列(將一串列反轉) 最後,利用 head->next=current; 便完成串列的反轉。此動作的重點在於需要三個指標才能達成任務。

單向鏈結串列(計算串列的長度) 串列的長度即表示串列的節點數目,因此以下列的片段程式即可完成。

單向鏈結串列(計算串列的長度) 其中值得注意的是迴圈的中止條件為 (p != NULL) 而最後的count為串列的長度。 由於head節點不存放任何資料,故不予以計算之。

環狀串列 假若將鏈結串列最後一個節點的指標指向head節點時,此串列稱為環狀串列(circular list),如下圖所示: 環狀串列可以從任一節點來追蹤所有節點。上圖假設第一個節點在x1。

環狀串列(加入串列前端動作) 有一環狀串列如下:

環狀串列(加入串列前端動作) 利用malloc函數配置了一個節點 利用下列步驟即可將x指向的節點加入到環狀串列的前端。

環狀串列(加入串列前端動作)

環狀串列(加入串列前端動作)

環狀串列(加入串列尾端動作)

環狀串列(加入串列尾端動作) 3. 在環狀串列的某一特定節點後加入一節點,此與單向鏈結串列相似。

環狀串列(刪除串列的前端) 有一環狀的串列如下: 其運作過程以及對應的環狀串列如下

環狀串列(刪除串列的前端)  

環狀串列(刪除串列的前端) 回收p所指向的節點,此時環狀串列剩下二個節點。

環狀串列(刪除串列的尾端) 有一環狀串列如下: 其運作的過程及其對應的環狀串列如下:

環狀串列(刪除串列的尾端)

環狀串列(刪除串列的尾端) 

環狀串列(刪除特定節點) 刪除環狀串列的特定節點與單向鏈結串列相同,在此不 再贅述。

環狀串列(計算環狀串列的長度) 計算環狀串列的長度,基本上與計算單向鏈結串列的長度大同小異。

雙向鏈結串列 雙向鏈結串列(doubly linked list)乃是每個節點皆具有三個欄位,一為左鏈結(LLINK),二為資料(DATA),三為右鏈結(RLINK),其資料結構如下:

雙向鏈結串列 其中LLINK指向前一節點,而RLINK指向後一個節點。通常在雙向鏈結串列加上一個串列首,此串列首的資料欄不存放資料。如下圖所示:

雙向鏈結串列 雙向鏈結串列具有下列兩點特性: 1.假設ptr是指向任何節點的指標,則 ptr == ptr->llink->rlink == ptr->rlink->llink; 2.若此雙向鏈結串列是空的串列,則只 有一個串列首。

雙向鏈結串列(加入串列的前端) 假設一開始雙向鏈結串列如下: 經由下列步驟就可完成將已配置的x 節點加入前端

雙向鏈結串列(加入串列的前端)   

雙向鏈結串列(加入串列的前端)  

雙向鏈結串列(加入串列的尾端) 假設有一雙向鏈結串列如下: 經由下列步驟就可完成將已配置的x 節點加入於尾端

雙向鏈結串列(加入串列的尾端) 

雙向鏈結串列(加入串列的尾端)  

雙向鏈結串列(加入串列的尾端) 可將(2), (3)合起來就可知曉。  

雙向鏈結串列(加入特定節點的後面) 加入在某一特定節點的後面,理論上 和單向鏈結串列相似,請看程式片段。 有一雙向鏈結串列如下(由大至小排 列)

雙向鏈結串列(加入特定節點的後面)

雙向鏈結串列(加入特定節點的後面)

雙向鏈結串列(加入特定節點的後面)

雙向鏈結串列(刪除串列的前端) 刪除雙向鏈結串列的前端,步驟如下:    

雙向鏈結串列(刪除串列的前端)  

雙向鏈結串列(刪除串列的前端)

雙向鏈結串列(刪除串列的尾端) 先追蹤到尾端的節點  

雙向鏈結串列(刪除串列的尾端) 

雙向鏈結串列(刪除串列的尾端)

雙向鏈結串列(刪除串列的特定節點) 例如刪除del_dat為cd,其片段程式如下:

雙向鏈結串列(刪除串列的特定節點)  

雙向鏈結串列(刪除串列的特定節點)

鏈結串列之應用 以鏈結串列表示堆疊 以鏈結串列表示佇列: 由於堆疊的加入和刪除操作都在同一端,因此,我們可以將它視為每次將節點加入與刪除的動作,是串列的前端或尾端。這些過程可參閱單向鏈結串列的說明。 以鏈結串列表示佇列: 由於佇列的加入和刪除是在不同端,因此我們可以想像加入的動作是在串列的尾端,而刪除的動作是在前端即可。

鏈結串列之應用(多項式相加) 多項式相加可以利用鏈結串列來完成。多項式以鏈結串列來表示的話,其資料結構如下: COEF表示變數的係數,EXP表示變數的指數,而LINK為指到下一節點的指標。

鏈結串列之應用(多項式相加) 假設有一多項式 A=3x14+2x8+1,以鏈結串列如下: 兩個多項式相加其原理如下圖所示:

鏈結串列之應用(多項式相加)

鏈結串列之應用(多項式相加) 1. 此時A、B兩多項式的第一個節點EXP 皆相同(EXP(p) = EXP(q)),所以相 加後放入C串列,同時p、q的指標指 向下一個節點。

鏈結串列之應用(多項式相加)

鏈結串列之應用(多項式相加) 2. EXP(p)=8<EXP(q)=10。因此將B多 項式的第二個節點加入C多項式,並

鏈結串列之應用(多項式相加)

鏈結串列之應用(多項式相加) 3. 由於EXP(p)=8>EXP(q)=6,所以將A 多項式的第二個節點加入C多項式,p 指標指向下一個節點。

鏈結串列之應用(多項式相加)

鏈結串列之應用(多項式相加) 4. 以此類推最後C多項式為 C=11x14-3x10+2x8+10x6+1