Ch03 鏈結串列結構 淡江大學 周清江.

Slides:



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

单元二:面向对象程序设计 任务二:借书卡程序设计.
第一單元 建立java 程式.
四資二甲 第三週作業 物件導向程式設計.
第三章 鏈結串列 Linked List.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
Project 2 JMVC code tracing
Linked List Operations
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
資料結構 第3章 鏈結串列.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列
LINQ 建國科技大學 資管系 饒瑞佶.
佇列 (Queue).
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
鏈結串列 (Linked List).
資料結構與演算法 第四章 鍵結串列 徐熊健.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用
Chap 3 堆疊與佇列 Stack and Queue.
Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.
Ch13 集合與泛型 物件導向程式設計(2).
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
程式設計實作.
資料結構與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.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
五、链 表 1、单链表 2、双向链表 3、链表应用.
學習 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 鏈結串列.
佇列(queue) Lai Ah Fur.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
第一單元 建立java 程式.
Chapter6 队列(Queues) The Abstract Data Type
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
挑戰C++程式語言 ──第8章 進一步談字元與字串
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
資料結構 老師:李崇明 助教:楊斯竣.
樣版.
C qsort.
第二章 Java语法基础.
資料結構使用Java 第6章 鏈結串列(Linked List).
陣列與結構.
Chapter 4 鏈結串列 Linked List 2019/5/14.
第二章 Java基本语法 讲师:复凡.
資料結構 – 鏈結串列 Linked List 綠園.
例題 1. 多項式的排列 1-2 多項式及其加減法 將多項式 按下列方式排列: (1) 降冪排列:______________________ (2) 升冪排列:______________________ 排列 降冪:次數由高至低 升冪;次數由低至高.
第二章 Java基本语法 讲师:复凡.
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Activity的生命週期: 播放音樂與影片 靜宜大學資管系 楊子青
資料結構使用Java 第5章 串列程式實作.
Chapter 2 Entity-Relationship Model
判斷(選擇性敘述) if if else else if 條件運算子.
鏈結串列 Link List chapter 6 德明科技大學資訊科技系.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
鏈結串列 (Linked List).
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

Ch03 鏈結串列結構 淡江大學 周清江

鏈結物件與一般變數的比較 (ch3.java) class Node { public int data; public Node link; } 當鏈結物件參考的設定 (=) 後沒有 new 時,如範例程 式的 Node node3 = node1,是讓它們指向相同記憶 體位置,所以 node1 及 node3 間會有連動反應 而一般變數的設定,如範例程式之 int i3 = i1 ,則是 將 = 後的運算式的值設定給 = 前的變數,它們佔有各 自的記憶體位置,是互相獨立的

3.1 前言 3 3

Node node1 = new Node( ); //有 new 運算子才會呼叫建構子,分配記憶體 node1.data = 1; Node node2 = new Node( ); //有 new 運算子才會呼叫建構子,分配記憶體 node2.data = 2; node1.link = node2; // 將 node1.link 設為 node2 的記憶體位址 Node node3 = node1; // 沒有 new 運算, //node3 與 node1 指向相同記憶體位址 // 它們目前是一體的 node3.data = 3; // 改變 node3 的 data 值, // 其記憶體位置與 node1.data 相同 System.out.println( "node1.data = " + node1.data + " node2.data = " + node3.link.data); int i1 = 1; int i2 = 2; int i3 = i1; //i3 與 i1 的記憶體位址不同, //這將 i1 的值放在 i3 的記憶體位置,i3 與 i1 各自獨立 System.out.println( "i1=" + i1 +" i2=" + i2 + " i3=" + i3); i3 = 3;

陣列與鏈結串列之比較 易 難 訂正:p3-4 表 3.1 參考課本:ch3-5 至 ch3-7 頁說明

3.2 單向鏈結串列

3.2 單向鏈結串列 (節點資料依應用決定是否排序)

3.2 單向鏈結串列 Node link 的初始值設定為 NULL

3.2 單向鏈結串列 串列類別 public class List { private Node front; } link 的初始值設定為 NULL

3.2 單向鏈結串列 判斷給定的單向鏈結 串列是否為一空串列 的方法 建立包含兩節點的單 向鏈結串列 boolean isempty( ) { if (front.link == null) return true; else return false; } 建立包含兩節點的單 向鏈結串列 Node front = new Node( ); Node first = new Node( ); Node second = new Node( ); front.link = first; first.data = 25; first.link = second; second.data = 78; 參考:課本 p.3-10

3.2 單向鏈結串列 給定以下已排序單向鏈結串列 將 70 插入此串列之步驟 70

新增節點進入排序鏈結串列的 4 種狀況 1.串列為空 2.新節點的資料比串列最前面節點還小,要插在原本 最前面節點之前 3.新節點的資料要插在串列某 2 個節點之間 4.新節點的資料比串列最後面節點還大,要插在原本 最後面節點之後 那新增節點進入未排序鏈結串列有幾 種狀況?

3.2 排序單向鏈結串列 給定以下排序單向鏈結串列 自此串列刪除 83 之步驟

自排序鏈結串列刪除某節點的 4 種狀況 1.串列僅有該節點,刪除後為空 2.該節點為串列最前面節點 3.該節點在串列中間(前後都有節點) 4.該節點在串列最後面

3.2 單向鏈結串列 課本範例程式 ch3_list.java 其 front 與講義不太一樣,兩種做法都可以 訂正:課本第 3-15 頁,第 74 列應為 if(preNode.link == null) front 22 78 31 83 98 NULL

課本範例程式 ch3_list.java 因上頁設計改變造成的程式變動範例 建立包含兩節點的單向鏈結 串列 Node first = new Node( ); Node second = new Node( ); front = first; first.data = 25; first.link = second; second.data = 78; 判斷給定的單向鏈結串 列是否為一空串列的方 法 boolean isempty( ) { if (front == null) return true; else return false; }

3.2 單向鏈結串列 課本範例程式 ch3_list.java 中 delNode(int data) 方法的改寫 (ch3_list_2.java) 練習:將 ch3_list.java 中 insertNode(int data) 方法的 for 迴圈改以 while 寫過

作業 2 1. 生成如講義第 8 頁的單向無排序鏈結串列(前 4 個節 點就可以),再另外生成一個資料相同之單向排序鏈結 串列 (參考 ch3.java) 2. 將課本範例程式 ch3_list.java 改以講義的 front 方式 寫過 3. 將多項式及相關方法 (建構子, eval, display, add, add2) 改以串列重新設計

3.2 單向鏈結串列的應用 3.2.1 堆疊的應用 (第 4 章再看) 3.2.2 佇列的應用 (第 4 章再看) 3.2.1 堆疊的應用 (第 4 章再看) 3.2.2 佇列的應用 (第 4 章再看) 3.2.4 計算串列的長度 3.2.5 串列的合併 3.2.3 將單向鏈結串列反轉 20

3.2.4 計算串列的長度 21

3.2.5 串列的合併 22

23

Code: ch3_concatenate2list_1.java // 將front_y串列合併到front_x串列之後,並以front_z為新串列的前端 public void cancatenate(Node front_x, Node front_y, Node front_z){ Node this_node; if(front_x.link == null) // front_x 為空串列 front_z.link = front_y.link; else{ if(front_y.link == null) // front_y 為空串列 front_z.link = front_x.link; else{ // front_x, front_y 均不為空 this_node = front_x.link; while(this_node.link != null) this_node = this_node.link; this_node.link = front_y.link; } 24

ch3_concatenate2list_2.java // 將front_y串列合併到front_x串列之後,並以front_z為新串列的前端 public void cancatenate(Node front_x, Node rear_x, Node front_y, Node rear_y, Node front_z, Node rear_z) { Node this_node; if(front_x.link == null){ // front_x 為空串列 front_z.link = front_y.link; rear_z.link = rear_y.link; }else{ if(front_y.link == null){ // front_y 為空串列 front_z.link = front_x.link; rear_z.link = rear_x.link; }else{ // front_x, front_y 均不為空 this_node = rear_x.link; this_node.link = front_y.link; rear_z.link = rear_y.link; } 25

3.2.3 將單向鏈結串列反轉 (ch3_singlelist.java) 22 78 31 83 98 front rear NULL 反轉後的單向鍊結串列 26

27

28

3.3 雙向鍊結串列 29

3.3 雙向鍊結串列 (ch3_doublelist.java) 30

3.3 雙向鍊結串列(插入) 31

3.3 雙向鍊結串列(刪除) 32

3.3 雙向鍊結串列 (ch3_doublelist.java) 這會使得 ch3_doublelist.java 的部份程式與圖 3.24、 3.25、3.26 不一致。基本上只要 link 的部份處理好, 兩者都可以。 31 front rear 5 65 83 78 98

3.3 ch3_doublelist.java 程式範例 public void insert_node(int key){ Node new_node, prev_node, this_node; new_node = new Node(); new_node.data = key; new_node.l_link = null; new_node.r_link = null; if(is_empty()){ front.r_link = new_node; rear.r_link = new_node; new_node.l_link = front; new_node.r_link = front; }else{ this_node = front.r_link; if(key < this_node.data){ new_node.r_link = this_node; this_node.l_link = new_node; ……… public void print_front(){ Node this_node; if( !is_empty() ){ // 若非空串列 this_node = front.r_link; System.out.print(" ==> 串列內容為 : "); while(this_node.r_link != front){ System.out.print(this_node.data+" . "); this_node = this_node.r_link; } System.out.print(this_node.data+"\n"); }else System.out.println("!!!空串列"); public void delete_node(int key) 有多處訂正 public void print_rear( ) 由後往前印

public void delete_node(int key){ Node this_node, prev_node, temp_node; prev_node = front; this_node = front.r_link; while(this_node.r_link != front){ // 當不是最後一個節點時 if(key == this_node.data){ // temp_node = this_node; 訂正,這列不需要 prev_node.r_link = this_node.r_link; this_node.r_link.l_link = prev_node; return; } prev_node = this_node; // prev_node 往右前進一個節點 this_node = this_node.r_link; // this_node 往右前進一個節點 if(key == this_node.data){ // 判斷最後一個節點 // temp_node = this_node; // 訂正,這列不需要 if (front.r_link == this_node) { // 訂正,新增判斷 this 是否為串列僅存的節點 front.r_link = null; rear.r_link = null; } else { prev_node.r_link = front; // 我們將最後一個節點的r_link指向front rear.r_link = prev_node; } else System.out.println("... 找不到資料 ");

3.4 環狀串列

3.4.1 環狀單向鍊結串列 圖 3.27(a):環狀單向鍊結串列(有使用尾端指標) 圖 3.27(a):環狀單向鍊結串列(未使用尾端指標)

3.4.1 環狀單向鍊結串列(未使用尾端指標 rear) 新增或刪除的節點為第一個節點時需額外處理,一般節點的新增 與刪除比照單向 鍊結串列 將資料 10 加到 圖 3.27(a),並維持串列由小到大的排序 刪除圖 3.27(a)資料 22 31 front 22 83 78 98   SKIP 3.4.2 3.4.3

3.5 多項式表示法 陣列表示法,請參考學期初 多項式 投影片 適合表示稀疏型 (即多個係數為 0)的多項式 3.5 多項式表示法 陣列表示法,請參考學期初 多項式 投影片 適合表示稀疏型 (即多個係數為 0)的多項式 7 x4 + 8 x3 + 11 x + 6

作業 3 請實作 3.4.1 之環狀單向鍊結串列,必須含有之方法: 建構子 insert( int data ): 要區別新增的是一般節點、前端節點 delete( int data): 要區別刪除的是一般節點、前端節點 print( ): 將串列各節點的值印出來 length( ): 列印此鍊結串列之長度