Chapter 3 鏈結串列結構 資料結構導論 - C語言實作.

Slides:



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

第三章 鏈結串列 Linked List 版權屬作者所有,非經作者 同意不得用於教學以外用途.
第三章 鏈結串列 Linked List.
第三章 鏈結串列 Linked Lists.
Hadoop 單機設定與啟動 step 1. 設定登入免密碼 step 2. 安裝java step 3. 下載安裝Hadoop
Chapter 5 遞迴 資料結構導論 - C語言實作.
資料結構 第2章 陣列.
Chap5 Graph.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第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.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
資料結構 第3章 鏈結串列.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列
選擇排序法 通訊一甲 B 楊穎穆.
佇列 (Queue).
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
鏈結串列 (Linked List).
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
4.1 單項鏈結串列 4.2 環狀串列 4.3 雙向鏈結串列 4.4 鏈結串列之應用
串列(List) 撰寫一串列程式.
Chap 4 鏈結串列 Linked Lists.
第12章 樹狀搜尋結構 (Search Trees)
資料結構與C++程式設計進階 鏈結串列 講師:林業峻 CSIE, NTU 6/ 10, 2010.
類別(class) 類別class與物件object.
(Circular Linked Lists)
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
鏈結串列 (Linked List) 註:要會指標(Pointer)
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
五、链 表 1、单链表 2、双向链表 3、链表应用.
Ch03 鏈結串列結構 淡江大學 周清江.
Chapter 4 堆疊和佇列 資料結構導論 - C語言實作.
學習 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 鏈結串列.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
自我參考結構 (self-reference – 1)
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第 19 章 XML記憶體執行模式.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
Linked Lists Prof. Michael Tsai 2013/3/12.
挑戰C++程式語言 ──第8章 進一步談字元與字串
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
資料結構 老師:李崇明 助教:楊斯竣.
樣版.
C qsort.
資料結構使用Java 第6章 鏈結串列(Linked List).
第14章 結構與其他資料形式.
陣列與結構.
Chapter 4 鏈結串列 Linked List 2019/5/14.
資料結構 – 鏈結串列 Linked List 綠園.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
資料表示方法 資料儲存單位.
程式設計--Quick Sort 通訊一甲 B 楊穎穆.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
資料結構使用Java 第5章 串列程式實作.
Chapter 2 Entity-Relationship Model
鏈結串列 Link List chapter 6 德明科技大學資訊科技系.
Array(陣列) Anny
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
鏈結串列 (Linked List).
Presentation transcript:

Chapter 3 鏈結串列結構 資料結構導論 - C語言實作

3.1 前言 陣列結構(Array)和鏈結串列(Linked List): 陣列的使用是透過陣列變數及對應的索引來存取陣列個別元素。 鏈結串列儲存資料的方式是將個別資料項次(data item)透過鏈結串在一起。 資料結構導論 - C語言實作

3.2單向鏈結串列 給定一組未經排序的六筆資料{5,78,65,31,83,98} ,經由小而大排序後再存入一個大小為10的一維陣列DATA中,如圖3.1所示。 假設我們希望將資料45加入這些排序過的資料中並維持由小到大的順序,利用陣列結構在處理資料的插入是相當麻煩的。 圖3.1 陣列結構DATA[10] 資料結構導論 - C語言實作

3.2單向鏈結串列 圖3.2 陣列結構DATA[10](插入45後的結果) 圖3.3 陣列結構DATA[10](刪除31後的結果) 資料結構導論 - C語言實作

3.2單向鏈結串列 以C語言為例,宣告單向鏈結串列的語法如下: 【範例】定義一個單向鏈結串列之節點資料型態 struct node{ /* 定義一個單向鏈結節點類別(結構) */ int data; /* data 用來儲存節點資料值 */ struct node *link; /* 為一個 node 指標,它指向下一個節點 */ };   資料結構導論 - C語言實作

3.2單向鏈結串列 【範例】定義一個單向鏈結串列之的開端節點指標front 以C語言為例,宣告單向鏈結串列的開端節點指標語法如下: struct node *front; front = (struct node *) malloc(sizeof(struct node)); front->link = NULL;   前端指標 front 資料結構導論 - C語言實作

3.2單向鏈結串列 【範例】動態要求一個節點的空間 new_node struct node *new_node; new_node = (struct node *) malloc(sizeof(struct node)); if (new_node == NULL) { printf(“\n所需的記憶體空間無法配置”); }   前端指標 new_node 資料結構導論 - C語言實作

3.2單向鏈結串列 【範例】釋放不再用到的節點空間 free(temp_node);   資料結構導論 - C語言實作

3.2單向鏈結串列 【範例】建立一個包含兩個節點的單向鏈結串列 前端指標 10 struct node *front; struct node *first, *second; front = (struct node *) malloc(sizeof(struct node)); first = (struct node *) malloc(sizeof(struct node)); second = (struct node *) malloc(sizeof(struct node)); front->link = first; first->data = 10; first->link = second; second->data = 20; second->link = NULL;   NULL 10 20 first 前端指標 front second 資料結構導論 - C語言實作

3.2單向鏈結串列 【範例】宣告單向鏈結串列的尾端指標rear 前端指標 尾端指標 10 struct node *rear; rear->link = NULL; rear->link = second; NULL 10 20 first 前端指標 front second 尾端指標 rear 資料結構導論 - C語言實作

3.2單向鏈結串列 我們將利用圖3.7中一個包含六筆資料的有序單向鏈結串列為例子來介紹幾種基本的運作。 圖3.7 有序單向鏈結串列 圖3.7 有序單向鏈結串列 資料結構導論 - C語言實作

3.2單向鏈結串列 圖3.8 將資料45插入圖3.7之鏈結串列之結果 圖3.9 從鏈結串列中刪除資料78 資料結構導論 - C語言實作

3.2.3 將單向鏈結串列反轉 單向鏈結串列是一個具有方向性的資料表示法,要將一個單向鏈結串列反轉就是要將節點與節點之間的順序關係倒轉。 (a) 反轉前的單向鏈結串列 (b) 反轉後的單向鏈結串列 圖3.12 單向鏈結串列之反轉範例 資料結構導論 - C語言實作

3.2.3 將單向鏈結串列反轉 以C語言為例,反轉一個單向鏈結串列的處理程序列語法如下: 【反轉一個單向鏈結串列】   【反轉一個單向鏈結串列】   int invert_list(struct node *head) { struct node *mid_node, *last_node;  mid_node=NULL; while( head!=NULL ) last_node=mid_node; /* 把中間節點傳遞給結尾指標 */ mid_node=head; /* 把前頭節點傳遞給中間指標 */ head=head->link; /* 前頭指標往前進一個節點 */ mid_node->link=last_node; /* 反轉原本的前頭與中間節點順序關係 */ } return(mid_node); /* 將反轉後的開端指標傳回 */ 資料結構導論 - C語言實作

3.2.4 計算串列之長度 串列之長度指的是串列中儲存資料之節點個數,不包含front及rear。 以C語言為例,計算串列之長度語法如下:     【計算串列之長度】   void length(struct node *front_) { int count = 0; struct node *this_node; if (front_->link != NULL) /* queue is not empty */ this_node = front_->link; while(this_node->link != NULL) count ++; this_node = this_node->link; } 資料結構導論 - C語言實作

3.2.4 計算串列之長度 printf(" ==> 串列長度為 : %d\n",count); } else printf(" !!! 空串列,串列長度為 : 0 \n");       資料結構導論 - C語言實作

3.2.5 串列之合併 假設我們希望將兩個單向鏈結串列x與y合併,我們必須將串列y中的所有節點合併到串列x的所有節點後面,產生一個合併後的串列z。在合併的處理中我們發現可能會有下列三種可能狀況出現: (1). 當串列x是空的則合併後的串列z就是串列y。 (2). 當串列y是空的則合併後的串列z就是串列x。 (3). 如果串列x與y都不是空串列,則必須將串列y中所有的節點搬移到串列x的所有節點之後,即可完成兩個串列合併的動作。       資料結構導論 - C語言實作

3.2.5 串列之合併 假設串列x與y皆為非空的串列,我們發現合併的動作包含下列幾個步驟: 1.將front_z 指向串列x的第一個節點。 圖3.16 串列之合併       資料結構導論 - C語言實作

3.2.5 串列之合併(1) 以C語言為例,將 y 串列合併到 x 串列之後,並以 front_z 為新串列的前端,其語法如下:     【將 y 串列合併到 x 串列之後,並以 front_z 為新串列的前端】   void cancatenate(struct node *front_x, struct node *front_y, struct node *front_z) { struct 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; }   資料結構導論 - C語言實作

3.2.5 串列之合併(1) else /* front_x, front_y 均非空串列 */ { front_z->link = front_x->link; this_node = front_x->link; while(this_node->link != NULL) this_node = this_node->link; this_node->link = front_y->link; }       資料結構導論 - C語言實作

3.2.5 串列之合併(2) 以C語言為例,將 y 串列合併到 x 串列之後,並以 front_z 為新串列的前端,其語法如下:   【將 y 串列合併到 x 串列之後,並以 front_z 為新串列的前端】   void cancatenate(struct node *front_x, struct node *rear_x, struct node *front_y, struct node *rear_y, struct node *front_z, struct node *rear_z) { struct 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;   資料結構導論 - C語言實作

3.2.5 串列之合併(2) else /* front_x, front_y 均非空串列 */ { front_z->link = front_x->link; this_node = rear_x->link; this_node->link = front_y->link; rear_z->link = rear_y->link; }       資料結構導論 - C語言實作

3.2.6 釋放鏈結串列的空間 當我們在程式的執行過程中不再需要用到某個鏈結串列時,我們便需要將此鏈結串列所使用的空間加以釋放。詳細的C 語言程式片斷如下所列:         【歸還單向鏈結串列】   void free_list(struct node *front_) { struct node *this_node; struct node *temp_node; if (front_->link != NULL) /* queue is not empty */ this_node=front_link; while ( this_node != NULL ) temp_node=this_node; 資料結構導論 - C語言實作

3.2.6 釋放鏈結串列的空間 this_node=this_node->link; free(temp_node); } else { printf("Find a empty list.\n");       資料結構導論 - C語言實作

3.2.7 列印(走訪)串列中所有節點的值 void print(struct node *front_) { struct node *this_node; if (front_->link != NULL) this_node = front_->link; printf(" ==> 串列內容為 : "); while(this_node->link != NULL) printf("%d ->",this_node->data); this_node = this_node->link; } printf("%d \n",this_node->data); else printf(" !!! 空串列\n");       資料結構導論 - C語言實作

範例程式2:節點資料之排序(p.3-28) /*******************************************************************/ /*【程式名稱】: 3_singlelist.c */ /*【程式功能】: 節點資料由小至大排序之單向鏈結串列的資料增刪與列印 */ /*【資料結構】: 單向鏈結串列(singly linked list),節點結構 */ /*【變數名稱及用途】 */ /* struct node : 定義 node 為一個節點結構 */ /* data : 用來儲存節點資料值 */ /* link : 為一個 node 指標,它指向下一個節點 */ /* front : 為一個 node 指標,它指向單向鏈結串列的前端 */ /* rear : 為一個 node 指標,它指向單向鏈結串列的尾端 */ 資料結構導論 - C語言實作

#include <stdio.h> #include <stdlib.h> #define N 6 void create_single_list(void); void free_single_list(void); int empty(void); void insert_node(int key); void delete_node(int key); void print(void); void reverse(void); /*------------------------------*/ /* 定義 node 為一個節點結構 */ struct node{ /* 定義一個單向鏈結節點結構 */ int data; /* data 用來儲存節點資料值 */ struct node *link; /* 為一個 node 指標,它指向下一個節點 */ }; struct node *front, *rear; 資料結構導論 - C語言實作

/* 產生一個空串列,它只有 front 及 rear 兩個節點 */ void create_single_list(void) /* Constructor */ { front = (struct node *) malloc(sizeof(struct node)); rear = (struct node *) malloc(sizeof(struct node)); front->link = NULL; rear->link = NULL; } void free_single_list(void) /* Destructor */ struct node *this_node, *temp_node; if (front->link != NULL) this_node = front->link; while(this_node->link != NULL) temp_node = this_node; this_node = this_node->link; free(temp_node); free(this_node); else; free(front); free(rear); 資料結構導論 - C語言實作

if(front->link == NULL) /* 空串列 */ return 1; /* true */ else /* 判斷是否為空串列 */ int empty(void) { if(front->link == NULL) /* 空串列 */ return 1; /* true */ else return 0; /* false */ } /* 將資料(key)插入單向鏈結串列中,並按小至大順序排列 */ void insert_node(int key) struct node *new_node, *prev_node, *this_node; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = key; new_node->link = NULL; if (empty()) /* 空串列,插入第一個節點到front之後 */ front->link = new_node; rear->link = new_node; this_node = front->link; if (key < this_node->data) /* 插入到串列之前端 */ new_node->link = this_node; 資料結構導論 - C語言實作

while(this_node->link != NULL) /* 插入到串列中間 */ prev_node = this_node; else { while(this_node->link != NULL) /* 插入到串列中間 */ prev_node = this_node; this_node = this_node->link; if (key < this_node->data) prev_node->link = new_node; new_node->link = this_node; return; } else; this_node->link = new_node; /* 插入到串列尾端 */ rear->link = new_node; 資料結構導論 - C語言實作

/* 自單向鏈結串列中刪除資料(key) */ void delete_node(int key) { struct node *this_node, *prev_node, *temp_node; prev_node = front; this_node = front->link; while(this_node->link != NULL) /* 當不是最後一個節點時 */ if (key == this_node->data) temp_node = this_node; prev_node->link = this_node->link; free(temp_node); return; } prev_node = this_node; this_node = this_node->link; if (key == this_node->data) /* 判斷最後一個節點 */ prev_node->link = NULL; /* 我們將最後一個節點的link指向NULL */ rear->link = prev_node; else printf("... 找不到資料 %d \n",key); 資料結構導論 - C語言實作

/* 從 front 開始列印資料(由小至大) */ void print(void) { struct node *this_node; if (! empty()) /* 若非空串列 */ this_node = front->link; printf(" ==> 串列內容為 : "); while(this_node->link != NULL) printf("%d ->",this_node->data); this_node = this_node->link; } printf("%d \n",this_node->data); else printf(" !!! 空串列\n"); 資料結構導論 - C語言實作

struct node *prev_node, *this_node, *next_node; void reverse(void) { struct node *prev_node, *this_node, *next_node; next_node = front->link; this_node = NULL; while(next_node->link != NULL) prev_node = this_node; this_node = next_node; next_node = next_node->link; this_node->link = prev_node; } next_node->link = this_node; front->link = next_node; void main(void) int i; int a[N] = {5, 65, 31, 83, 78, 21}; create_single_list( ); clrscr( ); printf("\n【將資料插入單向鏈結串列,並保持資料由小至大之排序】...\n"); 資料結構導論 - C語言實作

printf("\n 步驟 <%d> 插入 %d\n",i,a[i]); insert_node(a[i]); print(); for(i = 0; i < N; i++) { printf("\n 步驟 <%d> 插入 %d\n",i,a[i]); insert_node(a[i]); print(); } printf("\n【刪除 5】...\n"); delete_node(5); printf("\n【刪除 83】...\n"); delete_node(83); printf("\n【刪除 31】...\n"); delete_node(31); printf("\n【將串列反轉】...\n"); reverse(); free_single_list(); 資料結構導論 - C語言實作

範例程式3:串列之合併、串列之長度(p.3-36) /******************************************************************/ /**【程式名稱】: 3_concatenate2list_1.c */ /**【程式功能】: 以將兩個單向鏈結串列合併成一個串列 */ /**【資料結構】: 單向鏈結串列(singly linked list),節點結構 */ /**【變數名稱及用途】 */ /** struct node : 定義 node 為一個節點結構 */ /** data : 用來儲存節點資料值 */ /** link : 為一個 node 指標,它指向下一個節點 */ /** front : 為一個 node 指標,它指向單向鏈結串列的前端 */ /** rear : 為一個 node 指標,它指向單向鏈結串列的尾端 */ 資料結構導論 - C語言實作

範例程式4:串列之合併 (使用rear指標) (p.3-43) void main(void) { int i; int a[N] = {0, 1, 2, 3, 4, 5}; int b[N] = {10, 11, 12, 13, 14, 15}; create_list_1( ); create_list_2( ); create_list_3( ); for(i = 0; i < N; i++) { insert(a[i], front_1, rear_1); } printf("\n【單向鏈結串列 1】...\n"); print(front_1); length(front_1); 資料結構導論 - C語言實作

insert(b[i], front_2, rear_2); } printf("\n【單向鏈結串列 2】...\n"); for(i = 0; i < N; i++) { insert(b[i], front_2, rear_2); } printf("\n【單向鏈結串列 2】...\n"); print(front_2); length(front_2); printf("\n【單向鏈結串列 3】...\n"); print(front_3); length(front_3); cancatenate(front_1, rear_1, front_2, rear_2, front_3, rear_3); printf("\n【 合併後的單向鏈結串列】...\n"); 資料結構導論 - C語言實作

3.3 雙向鏈結串列 雙向鏈結串列包含了許多個節點以及紀錄節點間順序關係的鏈結。 一個雙向鏈結串列的節點包含三個欄位: (1).左鏈結欄位(Left Link Field, LLINK) : LLINK鏈結欄是用來指向前一個節點。 (2).資料欄位(Data Filed) : data資料欄仍然用來儲存資料。 (3).右鏈結欄位(Right Link Field, RLINK) : RLINK欄則用來指向下一個節點。         資料結構導論 - C語言實作

3.3 雙向鏈結串列   圖3.17 雙向鏈結串列的節點結構 雙向鏈結串列的一個節點比起單向鏈結串列的一個節點需要更多的記憶體空間,因為雙向鏈結串列的節點有兩個鏈結欄位而單向鏈結串列的節點只有一個鏈結欄位。 雙向鏈結串列的優點為資料較不容易遺失;相對於單向鏈結串列或環狀串列萬一不幸其中有一個鏈結斷裂,那麼後面的串列資料便遺失而永遠無法再復原了。 資料結構導論 - C語言實作

3.3 雙向鏈結串列 【範例】定義一個雙向鏈結串列之節點資料型態 以C語言為例,定義一個雙向鏈結串列之節點資料型態語法如下:       【範例】定義一個雙向鏈結串列之節點資料型態   struct node{ /* 定義一個單向鏈結節點類別(結構) */ int data; /* data 用來儲存節點資料值 */ struct node *l_link; /* 為一個 node 指標,它指向前一個節點 */ struct node *r_link; /* 為一個 node 指標,它指向下一個節點 */ }; l_link data r_link 資料結構導論 - C語言實作

3.3 雙向鏈結串列 【範例】利用雙向鏈結串列結構來表示一組由小到大排序的六筆資料{5, 31,65, 78,83,98} 。         圖3.18 只有使用開端節點指標的雙向鏈結串列 資料結構導論 - C語言實作

3.3 雙向鏈結串列 【範例】宣告雙向鏈結串列的開端與尾端指標並設定起始值 尾端指標 前端指標 struct node *front, *rear; front = (struct node *) malloc(sizeof(struct node)); rear = (struct node *) malloc(sizeof(struct node)); front->link = NULL; rear->link = NULL;   NULL 前端指標 front 尾端指標 rear 資料結構導論 - C語言實作

3.3 雙向鏈結串列     圖3.19 使用開端與節尾節點指標的雙向鏈結串列 資料結構導論 - C語言實作

圖3.20 從雙向鏈結串列插入資料45的鏈結改變示意圖 3.3 雙向鏈結串列 【範例】插入資料45到圖3.18的雙向鏈結串列之詳細過程列於圖3.20 。     圖3.20 從雙向鏈結串列插入資料45的鏈結改變示意圖 資料結構導論 - C語言實作

圖3.21 從圖3.18的雙向鏈結串列刪除資料78之鏈結改變示意圖 3.3 雙向鏈結串列 【範例】從圖3.18的雙向鏈結串列刪除資料78 。     圖3.21 從圖3.18的雙向鏈結串列刪除資料78之鏈結改變示意圖 資料結構導論 - C語言實作

3.3 雙向鏈結串列(p.3-53) 【範例】新增資料到雙向鏈結串列中並維持由小到大的順序 void insert_node(int key) { struct node *new_node, *prev_node, *this_node; new_node = (struct node *) malloc(sizeof(struct node)); new_node->data = key; new_node->l_link = NULL; new_node->r_link = NULL; if (empty()) /* 空串列,插入第一個節點到front之後 */ front->r_link = new_node; rear->r_link = new_node; new_node->l_link = front; new_node->r_link = front; /* 我們將最後一個節點的r_link指向front */ }   資料結構導論 - C語言實作

this_node = front->r_link; else { this_node = front->r_link; if (key < this_node->data) /* 插入到串列之前端 */ front->r_link = new_node; new_node->r_link = this_node; new_node->l_link = front; } while(this_node->r_link != front) /* 插入到串列中間 */ prev_node = this_node; this_node = this_node->r_link; if (key < this_node->data) prev_node->r_link = new_node; new_node->l_link = prev_node; this_node->l_link = new_node; return;   資料結構導論 - C語言實作

this_node->r_link = new_node; /* 插入到串列之尾端 */ else; } this_node->r_link = new_node; /* 插入到串列之尾端 */ new_node->l_link = this_node; new_node->r_link = front; /* 我們將最後一個節點的r_link指向front */ rear->r_link = new_node;   資料結構導論 - C語言實作

3.3 雙向鏈結串列(p.3-55) 【範例】刪除雙向鏈結串列中的一筆資料 void delete_node(int key) { struct 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; free(temp_node); return; } prev_node = this_node; this_node = this_node->r_link;   資料結構導論 - C語言實作

if (key == this_node->data) /* 判斷最後一個節點 */ { temp_node = this_node; prev_node->r_link = front; /* 我們將最後一個節點的r_link指向front */ rear->r_link = prev_node; free(temp_node); } else printf("... 找不到資料 %d \n",key);   資料結構導論 - C語言實作

範例程式5:節點資料之排序(p.3-56) /*【程式名稱】: 3_doublelist.c /*【程式功能】: 節點資料由小至大排序之雙向鏈結串列的資料增刪與列印 */ /*【資料結構】: 雙向鏈結串列(double linked list),節點結構 /****************************************************************/*【變數名稱及用途】 /* struct node : 定義 node 為一個節點結構 /* data : 用來儲存節點資料值 /* r_link : 為一個 node 指標,它指向下一個節點 /* l_link : 為一個 node 指標,它指向前一個節點 /* front : 為一個 node 指標,它指向雙向鏈結串列的前端(串列的頭) */ /* rear : 為一個 node 指標,它指向雙向鏈結串列的尾端(串列的尾) */ /**************************************************************** 資料結構導論 - C語言實作

3.4 環狀串列 (Circular Linked List) 在3.2節所介紹的單向鏈結串列與3.3節所介紹的雙向鏈結串列在表示最後一個節點時將單向鏈結串列的節點鏈結欄位(Link)與雙向鏈結串列的右鏈結欄位(RLINK)設定是空的(NULL)。這樣的做法若是串列的開端指標受到破壞就會造成整個串列的資料流失。         資料結構導論 - C語言實作

3.4.1 環狀單向鏈結串列 環狀單向鏈結串列: 將單向鏈結串列(Singly Linked List)的最後一個節點的指標欄位指向串列的第一個節點就會形成一個具有單一方向性的環型結構,也就是說鏈結單向串列(Circular Singly Linked List)的最後一個節點之鏈結欄不再指向NULL(0或接地)而是指向鏈結串列的第一個節點。   資料結構導論 - C語言實作

3.4.1 環狀單向鏈結串列 【範例】將圖3.7中一個包含六筆資料的有序單向鏈結串列轉換成單向環狀鏈結串列 。 圖3.22 環狀單向鏈結串列 圖3.22 環狀單向鏈結串列 資料結構導論 - C語言實作

圖3.23 新增資料到環狀單向鏈結串列的第一個節點 3.4.1 環狀單向鏈結串列 【範例】新增資料2到圖3.22中的環狀單向鏈結串列 。 圖3.23 新增資料到環狀單向鏈結串列的第一個節點 資料結構導論 - C語言實作

3.4.1 環狀單向鏈結串列 【範例】刪除圖3.22的環狀單向鏈結串列第一個節點 。 圖3.24 刪除環狀單向鏈結串列的第一個節點 圖3.24 刪除環狀單向鏈結串列的第一個節點 資料結構導論 - C語言實作

3.4.2 環狀雙向鏈結串列 【範例】利用圖3.18中一個包含六筆資料的有序雙向鏈結串列轉換成環狀雙向鏈結串列 。   圖3.25 環狀雙向鏈結串列 資料結構導論 - C語言實作

3.4.3利用環狀鏈結串列表示稀疏矩陣 稀疏矩陣(Sparse Matrix): 當一個矩陣的非零元素之個數遠低於零元素之個數,我們就稱該矩陣為稀疏矩陣。   圖3.26 56稀疏矩陣 資料結構導論 - C語言實作

3.4.3利用環狀鏈結串列表示稀疏矩陣 圖3.27 用7*3矩陣表示圖3.26 資料結構導論 - C語言實作

3.4.3利用環狀鏈結串列表示稀疏矩陣 【範例】利用環狀串列來表示稀疏矩陣的內容。 圖3.28 用以表示二維稀疏矩陣的節點結構 圖3.28 用以表示二維稀疏矩陣的節點結構 資料結構導論 - C語言實作

3.4.3利用環狀鏈結串列表示稀疏矩陣 利用C語言來描述環狀串列節點的資料型態宣告列於下: 【範例】定義一個利用環狀串列儲存稀疏矩陣的節點資料型態   struct node{ /* 定義一個環狀鏈結節點類別(結構) */ int row; /* row 用來儲存非零元素的列數 */ int col; /* col 用來儲存非零元素的行數 */ int data; /* data用來儲存非零元素的數值 */ struct node *right; /* 為一個 node 指標,它指向同一列的下一個節點 */ struct node *down; /* 為一個 node 指標,它指向同一行的下一個節點 */ }; 資料結構導論 - C語言實作

3.4.3利用環狀鏈結串列表示稀疏矩陣 【範例】稀疏矩陣的環狀串列表示法。 圖3.28 用以表示二維稀疏矩陣的節點結構 圖3.28 用以表示二維稀疏矩陣的節點結構 資料結構導論 - C語言實作

3.5 多項式表示法 多項式 : f(x)=anxn+an-1xn-1+…+a1x1+a0x0是一個單變數x之多項式,其中an,an-1,…,a1,a0為此多項式之係數(Coefficient),而n,n-1,…,1,0等為多項式的指數(Exponent)次方之數值。 【範例】多項式f(x)=6x5+12x3+11 。 圖3.30 利用陣列來表示給定的單變數多項式 資料結構導論 - C語言實作

圖3.31 另外一個利用陣列來表示給定的單變數多項式 3.5 多項式表示法 圖3.31 另外一個利用陣列來表示給定的單變數多項式 資料結構導論 - C語言實作

3.5 多項式表示法 利用鏈結串列來表示單一變數多項式。 【範例】利用單向鏈結串列表示多項式 3.5 多項式表示法 利用鏈結串列來表示單一變數多項式。 【範例】利用單向鏈結串列表示多項式 f(x)=6x5+12x3+11 。 圖3.32 用來表示單變數多項式非零項次的節點結構 圖3.33 利用單向鏈結串列表示多項式 f(x)=6x5+12x3+11 資料結構導論 - C語言實作

3.5 多項式表示法 利用鏈結串列來表示多變數多項式 。 【範例】利用單向鏈結串列表示多變數多項式 3.5 多項式表示法 利用鏈結串列來表示多變數多項式 。 【範例】利用單向鏈結串列表示多變數多項式 f(x,y,z)=6x5y4z3+4x3y2z+3xy 。 圖3.34 用來表示多變數多項式非零項次的節點結構 圖3.35 利用單向鏈結串列表示多項式 f(x,y,z)= 6x5y4z3+4x3y2z+3xy 資料結構導論 - C語言實作