PowerPoint Presentation

Similar documents
陣列與鏈結串列 Array and Linked List

PowerPoint Presentation

資料結構之C語言重點複習

Tree

PowerPoint Presentation

PowerPoint Presentation

C 1

CC213

Microsoft PowerPoint - STU_C_Lang_CH13.ppt

本章內容 3-1 串列的定義 3-2 用陣列直接儲存串列 循序配置串列 3-3 串列加上鏈結 鏈結配置串列 3-4 用結構體陣列實作鏈結串列 3-5 指標與結構體 3-6 動態配置節點實作鏈結串列 3-7 鏈結串列的其他運算 3-8 環狀鏈結串列 3-9 雙向鏈結串列 *3-10 鏈結串列的應用 2

新・明解C言語入門編『索引』

¸ßÐÛÊÐÕþ¸®½ÌÓý¾ÖôßËù„ÙŽCêP„WУ¾ÅÊ®ÄêÈËÊÂÈ˃TŁþ‹óôßÆ·¹ÜȦÌá°¸

鏈結串列 有序串列 (ordered list) 有序串列代表的是一種資料結構, 它的元素以某種順序排列 ( 該順序具有一定的意義, 不可錯置 ) 在現實中, 我們很容易可以找到有序串列的實例, 如下 : 一年的月份 : ( 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八

untitled

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

untitled

untitled

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Microsoft PowerPoint - 04-array_pointer.ppt

C/C++基礎程式設計班

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft PowerPoint - Class5.pptx

Excel VBA Excel Visual Basic for Application

C++ 程式設計

untitled

1

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ex

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

CC213

新版 明解C++入門編

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

表 决, 审 议 程 序 符 合 有 关 法 律 法 规 和 本 公 司 章 程 的 规 定 3 本 议 案 尚 需 提 交 股 东 大 会 审 议, 与 该 等 交 易 有 利 害 关 系 的 关 联 股 东 将 放 弃 在 股 东 大 会 上 对 相 关 议 案 的 投 票 权 ( 二 ) 公

<4D F736F F D20B9F0D5FEB0ECB7A2A3A A3A93532BAC52E646F63>

103_02.xls

<313032A655A874B2D5B3CCA743BFFDA8FABCD0B7C7AAED2E786C73>

柳州历史上的今天内文改版式.FIT)

生 產 準 備 您 接 近 生 產 之 注 意 事 項 : 備 妥 住 院 用 物, 勿 遠 行 ( 生 產 用 物 包 ) 最 好 有 人 在 家 陪 伴, 或 和 陪 產 者 保 持 連 繫, 有 任 何 狀 況 可 立 即 趕 到 可 做 家 事 散 步 蹲 下 等 運 動, 以 不 太 累

省十二届人大常委会

Q8. 公 營 事 業 機 構 之 公 務 員 兼 具 勞 工 身 分 者, 於 97 年 3 月 19 日 以 前, 原 選 擇 參 加 勞 保, 調 任 其 他 公 營 事 業 機 構 時, 應 改 參 加 公 保 所 謂 調 任 其 他 公 營 事 業 機 構 之 判 別 依 據 ( 或 標

untitled

学生工作部处2010年工作总结

天人炁功行入與感應經驗分享

YYW1.nps

穨邱秀玲綜合展望報告.PDF

決議、附帶決議及注意事項

_汪_文前新ok[3.1].doc

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :

1

1








CC213

Searching and Sorting

Microsoft PowerPoint - ds-1.ppt [兼容模式]

强迫症毁灭天才

Microsoft Word - part doc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

C/C++ 语言 - 循环

Microsoft Word - F7801B_ch03習題解答.doc

untitled

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

epub 33-8

ebook39-5

nooog

貳 錄 取 名 單 資 訊 管 理 系 企 業 管 理 系 休 閒 事 業 管 理 系 應 用 英 語 系 幼 兒 保 育 系

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

untitled

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : : : /16 : : 96 : : : ISBN 7

FY.DOC

杭师大党字〔2011〕15号中共杭州师范大学委员会关于进一步加强和改进发展党员工作的意见

<4D F736F F D A67EAF64BEC7BCFABEC7AAF7C2B2B3B95FA5FEB3A1AAA95F2D31312E31362E646F63>

得 依 法 召 集 股 東 臨 時 會 第 十 一 條 : 股 東 常 會 之 召 集 應 於 開 會 三 十 日 前, 股 東 臨 時 會 之 召 集 應 於 開 會 十 五 日 前, 將 開 會 日 期 地 點 及 召 集 事 由 通 知 各 股 東 並 公 告 之 第 十 二 條 : 本 公

同 時, 那 些 百 萬 富 翁 們 正 乘 坐 着 私 家 噴 射 機 駛 往 歐 洲, 甘 願 花 大 把 的 鈔 票 接 受 替 代 療 法 並 且 重 獲 了 健 康 替 代 療 法 總 是 很 靈 嗎? 不, 當 然 不 是 在 這 世 界 上 没 有 盡 善 盡 美 的 事 物 但 是

<4D F736F F D B2C431A6B8A4A4A4DFA8C6B0C8B77CC4B3ACF6BFFD E646F63>

untitled

高校发展动态

untitled

Microsoft Word - ACL chapter02-5ed.docx

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

C. p->data.a D. p.data.a 5 若需建立如圖所示的儲存結構, 以下正確的語法組是 : G q p c A. char **q, *p, c; p=&c; q=*p; C. char **q, *p, c; p=&c; q=&p; B. char *q, *p, c; p=&c;

第7章-并行计算.ppt

Ps22Pdf

华恒家庭网关方案

Microsoft PowerPoint - VB14.ppt

C/C++语言 - C/C++数据

1

Transcription:

陣列與鏈結串列 NTU CSIE

Outline 結構陣列鏈結串列 單向鏈結串列之資料型態 單向鏈結串列之基本運算 作業

結構陣列 優點 缺點 使用容易 刪除與插入造成資料移動頻繁浪費不必要之記憶體陣列長度為常數, 可能會不夠用 #include<stdio.h> struct _student int math; int english; int computer; ; typedef struct _student student; int main() student s[5]; return 0; student student student student student math english computer s [0] [1] [2] [3] [4]

Outline 結構陣列 鏈結串列 單向鏈結串列之資料型態 單向鏈結串列之基本運算 作業

靜態與動態結構 struct _node 資料型態變數名稱 ; int data; struct _node *next; ; typedef struct _node node; node c; node *; c.next = NULL; = (node *)malloc(sizeof(node)); ->next = NULL; 資料型態 struct _node * node 資料 int data NULL c 變數名稱 next 資料型態 struct _node * struct _node * node 資料 int data NULL (malloc) 變數名稱 next

鏈結串列節點 節點 : 鏈結串列中最基本的單位 資料 結構指標 節點 下一個節點 節點 = 資料 + 結構指標

定義鏈結串列節點結構 鏈結串列透過儲存元素在記憶體之位址為指標 (Pointer) 或鏈結 (Link) 取得下一個節點 定義節點結構 struct _node 資料型態變數名稱 ; int data; struct _node *next; ; typedef struct _node node; 資料型態 struct _node * node 資料 int data 下一個節點 變數名稱 next

單向鏈結串列 單向鏈結串列之結構如下圖所示 : 指向串列前端之指標 NULL 鏈結起點 鏈結終點

小練習 ( 建立鏈結串列節點 )(ex01 build-1.c) 定義一個鏈結串列節點結構如下圖所示, 並使用 指標指向動態配置之節點 struct _node * node int struct _node * 10 NULL (malloc) data next

連續鏈結串列 node *, *ptr; = (node *)malloc(sizeof(node)); ptr = ; int value; scanf("%d", &value); ptr->data = value; ptr->next = (node *)malloc(sizeof(node)); ptr = ptr->next; 4 5 8 ptr NULL

小練習 ( 建立鏈結串列 ) 定義一個鏈結串列, 將順序輸入的資料存在動態資料結構上 (ex: 輸入 5 筆 ), 然後將此串列資料順序列印出來 (ex04 build-3 add list.c) 4 5 8 ptr NULL 若想要反序列印呢?

小練習 ( 建立鏈結串列 ) 定義一個鏈結串列, 將順序輸入的資料存在動態資料結構上 (ex: 輸入 5 筆 ), 然後將此串列資料反序列印出來 (ex06 build-4 reverse.c) 5 4 2 1 NULL ptr

Outline 結構陣列 鏈結串列 單向鏈結串列之資料型態 單向鏈結串列之基本運算 - 函式整合版 作業

新增節點 動態配置一節點之記憶體 node *getnode () /* 此函數產生一個新節點 */ node *p; p = (node *) malloc(sizeof(node)); /* malloc 會動態地配置大小為 sizeof 的記憶體 */ /* sizeof 會傳回一個型態為 node 之值 */ if ( p == NULL) printf (" 記憶體不足 "); exit(1); return(p); node * p int struct _node * node x x (malloc) data next

釋放節點 歸還一個節點之記憶體 void freenode (node *p) /* 此函數將節點還給記憶體 */ free(p); node * int x data (malloc) p struct _node * x (malloc) next

插入節點 由鏈結串列加入一個節點 一個節點之插入有三種情況 : 節點加於第一個節點之前 new_node ptr=null 節點加於最後一個節點之後 加於節點中間任何一個位置 ptr new_node NULL new_node NULL ptr NULL

插入節點 節點加於最後一個節點之後 NULL (2) ptr (3) new_node NULL (1) Ex1: node *new_node; //(1) new_node = getnode(); ptr->next = new_node//(2) /* 指向新節點 */ new_node -> next = NULL; Ex2: ptr->next = (node *)malloc(sizeof(node)); //(1&2) ptr = ptr->next; //(3) NULL

插入節點 節點加於第一個節點之前 new_node (1) Ex1: node *new_node new_node = getnode(); //(1) new_node->next = ; //(2) = new_node; (2) ptr NULL Ex2: = (node *)malloc(sizeof(node)); //(1) -> next = ptr; //(2) ptr = ; //(3) NULL

插入節點 加於節點中間任何一個位置 new_node(1) (2) (3) node *new_node; //(1) new_node = getnode(); //(2) new_node->next = ptr->next; //(3) /* 新節點指向下一節點 */ ptr->next = new_node; //(4) /* 節點 ptr 指向新節點 */ ptr (4) NULL NULL

插入節點 node *insert_node (node *, node *ptr, node data) node *new_node; /* 新節點指標變數 */ new_node = getnode(); /* 建立新節點, 取得一個可用節點 */ *new_node = data; /* 建立節點內容 */ new_node->next = NULL; /* 設定指標初值 */ if ( ptr == NULL ) /* 指標 ptr 是否是 NULL */ /* 第一種情況 : 插入第一個節點 */ new_node->next = ; /* 新節點成為串列開始 */ = new_node; else if ( ptr->next == NULL ) /* 是否是串列結束 */ /* 第二種情況 : 插入最後一個節點 */ ptr->next = new_node; /* 最後指向新節點 */ else /* 第三種情況 : 插入成為中間節點 */ new_node->next = ptr->next; /* (3) 新節點指向下一節點 (3)*/ ptr->next = new_node; /* 節點 ptr 指向新節點 (4)*/ return ();

小練習 ( 插入鏈結串列節點 ) (ex07 interface i.c) 延續上一小練習 寫一個使用者介面, 輸入 i, 接著輸入一個數字 value, 可插入一筆資料節點中之 data 為 value 於串列最後 建立一個鏈結串列如下圖所示 : 輸入 l, 可將全部內容列印出來 struct _node * int struct _node * node 10 (malloc) node *, *ptr; node n; char key; int value; = NULL; node 20 (malloc) scanf("%d",&value); n.data = value; ptr = ; if(==null) =insert_node(, NULL, n); else while(ptr->next!= NULL) ptr = ptr->next; =insert_node(, ptr, n); printf("insert ok\n"); node 30 NULL (malloc) data next

尋找節點 走訪串列, 將找到之節點位置回傳 node *find_node(node *, int num) node *ptr; ptr = ; /* 指向串列起始 */ while ( ptr!= NULL ) /* 走訪串列 */ return (ptr); if ( ptr->data == num ) /* 找尋 data */ return (ptr); ptr = ptr->next; /* 指向下一節點 */ scanf("%d",&value); ptr = find_node(, value); (ptr!= NULL) ("found: %d\n", ptr->data); else printf("not found\n");

小練習 ( 尋找鏈結串列節點 ) (ex07 interface i.c) 延續上一小練習 寫一個使用者介面, 輸入 f, 接著輸入一個數字 value, 可將一筆資料節點中之 data 與 value 相同者印出資料

刪除節點 由鏈結串列中刪除一個節點一個節點之刪除有三種情況 : 刪除第一個節點 ptr 刪除最後一個節點 刪除中間任何一個節點 previous NULL previous NULL ptr ptr NULL

刪除節點 刪除第一個節點 (1) (2) ptr NULL = ->next; //(1) freenode(ptr); //(2) return(); /* reset 起始節點指標 */ NULL

刪除節點 刪除最後一個節點 previous = ; while ( previous->next!= ptr ) /* 找節點 ptr 的前節點 */ previous = previous->next; previous->next = NULL; //(1) /* 最後一個節點 */ freenode(ptr); //(2) /* 此函數將節點歸還給記憶體 */ previous NULL (1) (2) NULL ptr NULL

刪除節點 刪除中間任何一個節點 previous = ; while ( previous->next!= ptr ) /* 找節點 ptr 的前節點 */ previous = previous->next; /* 第三種情況 : 刪除中間節點 */ previous->next = ptr->next; //(1) freenode(ptr); //(2) /* 此函數將節點歸還給記憶體 */ previous (1) (2) ptr NULL NULL

刪除節點 node *delete_node(node *, node *ptr) node *previous; /* 指向前一節點 */ if ( ptr == ) /* 是否是串列開始 */ /* 第一種情況 : 刪除第一個節點 */ = ->next; else previous = ; while ( previous->next!= ptr ) /* 找節點 ptr 的前節點 */ previous = previous->next; if ( ptr->next == NULL ) /* 是否是串列結束 */ /* 第二種情況 : 刪除最後一個節點 */ previous->next = NULL; /* 最後一個節點 */ else /* 第三種情況 : 刪除中間節點 */ previous->next = ptr->next; /* 圖 (3) 之步驟 (1) */ freenode(ptr); /* 此函數將節點歸還給記憶體 */ return(); scanf("%d",&value); ptr = find_node(, value); if(ptr!= NULL) = delete_node(, ptr); printf("delete ok\n"); else printf("can not delete\n");

小練習 ( 刪除鏈結串列節點 ) (ex07 interface i.c) 延續上一小練習 寫一個使用者介面, 輸入 d, 接著輸入一個數字 value, 可將一筆資料節點中之 data 與 value 相同者刪除 ( 假設輸入之 value 不會重覆 )

鏈結串列長度 計算鏈結串列 之長度 int length (node * ) /* 此函數計算節點之鏈結長度 */ int num=0; node *q = ; while (q!= NULL) num ++; q = q->next; return(num);

Outline 結構陣列 鏈結串列 單向鏈結串列之資料型態 單向鏈結串列之基本運算 作業

小練習 (ex07 interface i.c) 將上述鏈結串列功能整合起來成為同一程式 功能 輸入 i, 接著輸入一個數字, 可插入節點中之 data 為 value 於串列最後 輸入 d, 接著輸入一個數字, 可將節點中之 data 與 value 相同者刪除 ( 假設輸入之 value 不會重覆 ) 輸入 f 接著輸入一個數字, 可將一筆資料節點中之數字相同者印出 輸入 l 印出串列所有節點內容並顯示目前資料筆數 輸入 q 離開程式 bonus: 可設計插入位置於最前 / 中間 / 最後

回家作業 (ex08 member data.c) 使用鏈結串列製作一個會員資料表 功能 輸入 i 新增節點在串列最後, 可輸入姓名, 電話, Email 輸入 d 接著輸入姓名, 可將節點中之姓名相同者刪除 ( 假設輸入之姓名不會重覆 ) 輸入 f 接著輸入一個姓名, 可將節點中之姓名相同者印出資料 輸入 l 印出串列所有節點內容並顯示目前人數 輸入 q 離開程式 提示 : 使用 strcmp 來實作 (string.h ) strcmp(data[0], data[0]) 第一個字串大於第二個字串回傳正值, 反之回傳負值 相等則為 0 bonus: 可設計插入位置於最前 / 中間 / 最後