Linked Lists Prof. Michael Tsai 2013/3/12.

Slides:



Advertisements
Similar presentations
電腦與問題解決 5-1 電腦解題概論 5-2 電腦解題程序 5-3 演算法概論.
Advertisements

動畫與遊戲設計 Data structure and artificial intelligent
数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
第三章 鏈結串列 Linked List.
计算机硕士专业基础—C语言 赵海英
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
Chapter 3: Stack.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
佇列 (Queue).
佇列與推疊 (Queue and Stack)
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
Chap 3 堆疊與佇列 Stack and Queue.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
Data Structure(資料結構) 授課老師: 蕭志明 助理教授 Ext:6779
第12章 樹狀搜尋結構 (Search Trees)
Chapter 3 行程觀念 (Process Concept)
Linked Lists Prof. Michael Tsai 2012/3/13 作業一今天5pm到期 下次作業起 2:20pm到期
第十五章 Linked List, Stack and Queue
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
(Circular Linked Lists)
第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章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
Data Structure.
佇列(queue) Lai Ah Fur.
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
樹 2 Michael Tsai 2013/3/26.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
感謝同學們在加分題建議. 我會好好研讀+反省~
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
Sorting in Linear Time Michael Tsai 2013/5/21.
自我參考結構 (self-reference – 1)
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
資料結構與C++程式設計進階 實作練習 講師:林業峻 CSIE, NTU 6/ 24, 2010.
Hashing Michael Tsai 2013/06/04.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
Disjoint Sets Michael Tsai 2013/05/14.
第 六 讲 栈和队列(一).
1. 志明打算就客戶服務開發一個語音互動(IVR)系統, 顧客可透過電話鍵盤與系統進行互動。
Hashing Michael Tsai 2017/4/25.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Data Structure.
Chapter 2 Entity-Relationship Model
Graph 1 Michael Tsai 2012/4/24 連載: 學生上課睡覺姿勢大全
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

Linked Lists Prof. Michael Tsai 2013/3/12

大家來吐Array的槽 Array有什麼不好? 插入新element 刪除原本的element Time complexity= O(??) 1 3 新的 4 2 5 1 3 4 2 5 空 1 3 2 5 1 3 4 2 5

Array的複雜度 Indexing (拿某一個元素) O(1) ?? 在開頭Insert/Delete Dynamic Array (滿了以後 擴充成兩倍) Linked List (今天要學的) Indexing (拿某一個元素) O(1) ?? 在開頭Insert/Delete O(n), only feasible if not full O(n) 在尾巴Insert/Delete O(1), only feasible if not full O(1), if not full O(n), if full 在中間Insert/Delete 浪費的空間

新朋友: Linked List 要怎麼讓資料 1. 可以隨便亂排 2. 但是我們仍然知道他的順序? 答案: 資料亂排 但是, 另外存“下一個是誰” index [0] [1] [2] [3] [4] 資料 ㄇ ㄆ ㄅ ㄉ ㄈ 下一個是誰 4 1 -1 3 開始 1

概念上, 應該是長這樣 真正的樣子: 開始 ㄅ ㄆ ㄇ ㄈ ㄉ Null index [0] [1] [2] [3] [4] 資料 ㄇ ㄆ 下一個是誰 4 1 -1 3 開始 2

增加一個人? 開始 ㄅ ㄆ ㄇ ㄈ ㄉ Null ㄐ index [0] [1] [2] [3] [4] [5] 資料 ㄇ ㄆ ㄅ ㄉ ㄈ 下一個是誰 4 1 -1 3 4 5 1 -1 3 4 1 -1 3 開始 2

刪掉一個人 開始 ㄅ ㄆ ㄇ ㄈ ㄉ Null ㄐ index [0] [1] [2] [3] [4] [5] 資料 ㄇ ㄆ ㄅ ㄉ ㄈ ㄐ 下一個是誰 4 5 1 -1 3 4 5 1 -1 3 開始 2

來看一些code (用malloc/free) 怎麼宣告一個node的struct? struct ListNode { int data; struct ListNode *next; }; 怎麼拿一個新的node? struct ListNode *new; new=(struct ListNode*)malloc(sizeof(struct listNode));

來看一些code new是指標, 指到一個struct listNode的變數. 那如果要拿這個變數裡面的data呢? 可以這樣寫: (*new).data 或者, new->data 要拿next呢? (*new).next new->next

來看一些code 假設head指到第一個struct ListNode 那麼我要拿到551的下一個ListNode的位址怎麼寫? 342 551 假設head指到第一個struct ListNode 那麼我要拿到551的下一個ListNode的位址怎麼寫? head->link->link (連續技)

製造兩個node struct ListNode *head, *tmp; 342 551 struct ListNode *head, *tmp; tmp=(struct ListNode*)malloc(sizeof(struct ListNode)); if (tmp==NULL) exit(-1); // exit program on error tmp->data=551; tmp->next=NULL; head=tmp; tmp->data=342; tmp->next=head;

插入一個新node在某node後面 struct ListNode *x; //指到要插入的node的位置 struct ListNode *new; new=(struct ListNode*)malloc(sizeof(struct ListNode)); new->data=123; 下一步呢? 先處理new->next還是x->next? new->next=x->next; x->next=new; new x 123 342 342 551

刪除某一個node struct ListNode *head; //指到一開始的node的位置 struct ListNode *x; //指到要刪除的node的位置 struct ListNode *trail; //指到x的前一個node的位置 分兩種狀況處理: x是頭, 還有x不是頭 if (trail) //x不是第一個node trail->next=x->next; else head=x->next; free(x); 551 x head 342 x trail … 342 342 551

Examples 印出整個linked list 找到某個node有data的前一個node的位置 struct ListNode *tmp; for(tmp=head; tmp!=NULL; tmp=tmp->next) printf(“%d “, tmp->data); 找到某個node有data的前一個node的位置 int a=123; //假設我們要找資料是123的node的前一個node位置 for(tmp=head; tmp!=NULL; tmp=tmp->next) { if (tmp->next!=NULL) { //因為tmp->next可能是NULL! if (tmp->next->data==a) break; // break出去的時候, tmp就是我們要的 }

Array和Linked List的複雜度比較 Dynamic Array (滿了以後 擴充成兩倍) Linked List Indexing (拿某一個元素) O(1) O(n) 在開頭Insert/Delete O(n), only feasible if not full 在尾巴Insert/Delete O(1), only feasible if not full O(1), if not full O(n), if full O(n)找到尾巴 O(1) insert/delete 在中間Insert/Delete O(n) 找到位置 浪費的空間 (不是拿來存資料的部分) 0 (存滿以後) O(n) (最多可能有一半的空間是空的) (每個node都有拿來存next node的位址欄位)

<動腦時間> 有沒有什麼是array比linked list好的? 什麼時候用array? 什麼時候用linked list? <練習題1> 我想要找linked list裡面從尾巴數過來的第k個node, 要怎麼寫code? 時間複雜度為? 練習題1答案: O(n), Karumanchi 3.10 problem 2,4,5

Example: Stacks & Queues 如果是一塊記憶體要放很多stack或queue 就很難做到很efficient 例如如果某一stack滿了, 就要把一堆資料往後擠 就不是O(1)了 T_T 解決: 跟Linked List當朋友

Stack 要怎麼拿來當stack呢? (想想怎麼做主要的operation) push & pop 請一位同學來講解 head當作stack top 怎麼寫code? 那pop呢? head 訊 工 程 系 Null 資

Queue 類似stack的作法 不過頭尾都要有一個指標 從頭拿, 從尾放 怎麼拿? (DeQueue) struct ListNode* tmp; tmp=front; front=front->link; tmp_data=tmp->data; free(tmp); return tmp_data; rear front 資 訊 工 程 Null

Queue 那怎麼放? 假設new是指到新的node rear->next=new; new->next=NULL; 系 rear 那怎麼放? 假設new是指到新的node rear->next=new; new->next=NULL; rear=new; front 資 訊 工 程

練習題2: 把linked list反過來 反過來: 把 變成 怎麼弄? 3 14 2 8 1 a 1 2 8 3 14 b a 1 2 8 3 14 b Program 4.16 on p 171 答案: Karumanchi 3.10 problem 16

Singly v.s. doubly linked list Singly linked list: 3 14 2 8 1 head Doubly linked list: 3 14 2 8 1 head 什麼時候需要用雙? Singly linked list只能往後, 不能往前 (要從最前面開始重新找) Doubly linked list用在常常需要”倒帶”的時候 好處: 倒帶方便 (O(1)) (想想在singly linked list裡面要刪掉一個node時, 必須要找到前一個node) 壞處: 兩個pointer的儲存空間 Insert/delete的時候稍微慢一點(要處理兩個pointer, next & prev) 刪掉前後各一個node?

回收很慢 要把一個用完的linked list每個node都free掉 (Why?) 有幾項就要幾項的時間: O(n) 懶人方法: 丟到一個”回收桶”, 之後需要的時候再撿出來 希望丟=O(1), 而且撿=O(1) 怎麼做? 關鍵:找尾巴很慢. (不是O(1)) 但是又不想多花空間紀錄尾巴 回收桶 a 3 14 2 8 1

Circular List “開始”的那個箭頭, 指在尾巴 最後一個node指回開頭 有什麼好處? 串接很方便! 丟進回收桶=O(1) !! 也可以有doubly circular linked list! 3 14 2 8 1 temp head 回收桶

暫停! 來回想一下我們學了哪些種類的linked list Singly linked list Doubly linked list Circular Non-circular (chain) Doubly linked list

Today’s Reading Assignments Karumanchi 3.1-3.8 有很多的source code, 特別是3.6的部分是基礎, 一定要看懂! Karumanchi 3.10 problem {2,4,5},{15,16},{24,25,27}