4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用

Slides:



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

第四章:长期股权投资 长期股权投资效果 1、控制:50%以上 有权决定对方财务和经营.
第三章 鏈結串列 Linked List 版權屬作者所有,非經作者 同意不得用於教學以外用途.
資料結構(計財系).
22.3 实际问题与一元二次方程(1).
《老年人权益保障》 --以婚姻法.继承法为视角
第三章 鏈結串列 Linked List.
第三章 鏈結串列 Linked Lists.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第二章 线性表.
第四章 數列與級數 4-1 等差數列與級數 4-2 等比數列與級數 4-3 無窮等比級數 下一頁 總目錄.
Chapter 5 迴圈.
第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).
資料結構與演算法 第四章 鍵結串列 徐熊健.
Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.
串列(List) 撰寫一串列程式.
Chap 4 鏈結串列 Linked Lists.
資料結構與C++程式設計進階 鏈結串列 講師:林業峻 CSIE, NTU 6/ 10, 2010.
第十五章 Linked List, Stack and Queue
(Circular Linked Lists)
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 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 雙向鏈結串列.
Chapter 9 高度平衡二元搜尋樹 AVL Binary Search Tree
Chap3 Linked List 鏈結串列.
Chapter 11 B-tree 11.1 m-way 搜尋樹 11.2 B-tree.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter 4 資料結構.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列
資料結構與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).
◆ 第3節 基音與泛音 一、縱波的駐波 二、開管樂器的駐波 三、閉管樂器的駐波 四、共鳴空氣柱實驗 範例 1 範例 2 範例 3 範例 4
第14章 結構與其他資料形式.
Chapter 4 鏈結串列 Linked List 2019/5/14.
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
資料結構 – 鏈結串列 Linked List 綠園.
例題 1. 多項式的排列 1-2 多項式及其加減法 將多項式 按下列方式排列: (1) 降冪排列:______________________ (2) 升冪排列:______________________ 排列 降冪:次數由高至低 升冪;次數由低至高.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Parasitics Extraction (PEX) 與 postsimulation(posim)
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
在直角坐標平面上兩點之間 的距離及平面圖形的面積
資料結構使用Java 第5章 串列程式實作.
鏈結串列 Link List chapter 6 德明科技大學資訊科技系.
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
鏈結串列 (Linked List).
Presentation transcript:

4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用 Chapter 4 鏈結串列 4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用

鏈結串列 鏈結串列(linked list)是由許多節點所組成的,在加入和刪除功能上比陣列容易許多。 鏈結串列可分為單向鏈結串列(single linked list)、環狀串列(circular linked list)及雙向鏈結串列(doubly linked list),本章的目標旨在如何學習到每一種鏈結串列的加入與刪除,而這些加入與刪除的動作,又可針對串列首、串列尾或串列的某個特定的節點。

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

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

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

4.1 單向鏈結串列 4.1.1 加入動作 1.加入於串列的前端: 假設有一串列如下:

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

4.1 單向鏈結串列 (x->next=head->next; /* */ 

4.1 單向鏈結串列 head->next=x; /* */ 

4.1 單向鏈結串列 2.加入於串列的尾端: 假設有一串列如下:

4.1 單向鏈結串列 將一節點x加入於串列的尾端,其步驟如下: 4.1 單向鏈結串列 將一節點x加入於串列的尾端,其步驟如下: x=(struct node *)malloc(sizeof(struct node)); x->next=NULL;

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

4.1 單向鏈結串列 p->next=x;

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

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

4.1 單向鏈結串列 利用prev和current二個指標來追蹤,prev會緊跟在current節點之後

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

4.1 單向鏈結串列 4.1.2 刪除動作 刪除串列的前端節點 假設有一串列如下:

4.1 單向鏈結串列 只要幾個步驟便可達成目的: p=head->next; head->next=p->next;

4.1 單向鏈結串列 free(p); 經由free(p)便可將p節點回收。

4.1 單向鏈結串列 刪除串列的最後節點: 假設有一串列如下:

4.1 單向鏈結串列 此時必須先追蹤尾端及尾端的前一個 節點在那兒,步驟如下: p=head->next;

4.1 單向鏈結串列 prev->next=NULL; free(p);

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

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

4.1 單向鏈結串列 

4.1 單向鏈結串列 4.1.3 將兩個單向鏈結串列相互連接 假設有二個串列如下:

4.1 單向鏈結串列 將x與y串列合併為z串列,其步驟如下: if(x->next==NULL) z=y; 4.1 單向鏈結串列 將x與y串列合併為z串列,其步驟如下: if(x->next==NULL) z=y; if(y->next ==NULL) z=x; z=x; c=x->next;

4.1 單向鏈結串列

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

4.1 單向鏈結串列 假設有一串列如下:

4.1 單向鏈結串列 經由下面幾個步驟就可完成反轉的動作: p=head->next; current=NULL;

4.1 單向鏈結串列 while(p != NULL) { prev=current; current=p; p=p->next; current->next=prev; }

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

4.1 單向鏈結串列 依此進行到p == NULL後,迴圈停止

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

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

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

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

4.2 環狀串列 4.2.1 加入動作 加入一節點於環狀串列前端之步驟如下: 有一環狀串列如下: 利用malloc函數配置了一個節點

4.2 環狀串列 利用下列步驟即可將x指向的節點加入到環狀串列的前端。

4.2 環狀串列 上述(1)(2)步驟亦適用於環狀串列開始時是空的狀況。

4.2 環狀串列 加入一節點於環狀串列的尾端

4.2 環狀串列 在環狀串列的某一特定節點後加入一節點,此與單向鏈結串列相似。

4.2 環狀串列 4.2.2 刪除的動作 刪除環狀串列的前端 有一環狀的串列如下:

4.2 環狀串列 其運作過程以及對應的環狀串列為 回收p所指向的節點,此時環狀串列剩下二個節點。

4.2 環狀串列 刪除環狀串列的尾端 有一環狀串列如下:

4.2 環狀串列 其運作的過程及其對應的環狀串列如下:

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

4.2 環狀串列 4.2.3 如何回收整個環狀串列 回收整個環狀串列表示此串列皆不再需要了,因此將它歸還給系統,假設系統有一串列如下:

4.2 環狀串列 而不再需要的環狀串列為 只要下面三個步驟就可達成回收整個環狀串列。

4.2 環狀串列 若要回收整個單向鏈結串列呢?這就比較麻煩了,此時必須一個一個回收,因此其Big-O為O(n),表示與串列的節點數成正比,而回收整個環狀串列其Big-O為O(1),表示它是一常數,不受節點數的影響,以下是回收整個單向鏈結串列的過程。

4.2 環狀串列 此處的free(q)可表示將它歸還到系統的AV串列中。

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

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

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

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

4.3 雙向鏈結串列 4.3.1 加入動作 加入於雙向鏈結串列的前端 假設一開始雙向鏈結串列如下:

4.3 雙向鏈結串列 經由下列步驟就可完成將已配置的x節點加入前端

4.3 雙向鏈結串列

4.3 雙向鏈結串列 加入於雙向鏈結串列的尾端 假設有一雙向鏈結串列如下:

4.3 雙向鏈結串列 經由下列步驟就可完成將已配置的x節點加入於尾端

4.3 雙向鏈結串列

4.3 雙向鏈結串列 讀者可將(2), (3)合起來就可知曉。

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

4.3 雙向鏈結串列

4.3 雙向鏈結串列

4.3 雙向鏈結串列 4.3.2 刪除動作 刪除雙向鏈結串列的前端,步驟如下:

4.3 雙向鏈結串列

4.3 雙向鏈結串列 刪除雙向鏈結串列的尾端,步驟如下: 先追蹤到尾端的節點

4.3 雙向鏈結串列

4.3 雙向鏈結串列 刪除雙向鏈結串列的某一特定節點。 如刪除del_dat為cd,其片段程式如下:

4.3 雙向鏈結串列 此時current指向欲尋找的資料,而prev指向其current的前一節點。

4.3 雙向鏈結串列

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

4.4 鏈結串列之應用 4.4.2 以鏈結串列表示佇列 由於佇列的加入和刪除是在不同端,因此我們可以想像加入的動作是在串列的尾端,而刪除的動作是在前端即可。

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

4.4 鏈結串列之應用 假設有一多項式 A=3x14+2x8+1,以鏈結串列如下:

4.4 鏈結串列之應用 兩個多項式相加其原理如下圖所示: A=3x14+2x8+1 ; B=8x14-3x10+10x6

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

4.4 鏈結串列之應用 EXP(p)=8<EXP(q)=10。因此將B多項式的第二個節點加入C多項式,並且q指標指向下一個節點。

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

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