งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

โครงสร้างข้อมูลแบบรายการโยง (Link List)

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "โครงสร้างข้อมูลแบบรายการโยง (Link List)"— ใบสำเนางานนำเสนอ:

1 โครงสร้างข้อมูลแบบรายการโยง (Link List)
บทที่ 4 โครงสร้างข้อมูลแบบรายการโยง (Link List)

2 โครงสร้างข้อมูลแบบรายการโยง
เป็นการจัดเก็บข้อมูลที่เรียงต่อกันไปเหมือนอาร์เรย์ แต่ไม่ได้กำหนดขนาดไว้แน่นอน สามารถที่จะรับข้อมูลเพิ่ม ได้เรื่อย ๆ มีความยืดหยุ่นสูง อาจจะยุ่งยากและซับซ้อนกว่าอาร์เรย์ แต่เป็นที่นิยมใช้กันมาก ข้อมูลที่มีการจัดเก็บในลิงค์ลิสต์ไม่จำเป็นต้องเก็บอยู่ในตำแหน่งที่ติดกัน สามารถจะเก็บตำแหน่งใดก็ได้เพราะมีตัวเชื่อมโยง หรือ ลิงค์ฟิลด์ สำหรับเก็บ Address ต่อไป

3 ลักษณะโครงสร้างข้อมูลแบบรายการโยง
จะประกอบด้วยหน่วยเก็บข้อมูลหรือโหนด (Node) โดยหนึ่งโหนดมีส่วนประกอบสำคัญ 2 ส่วนคือ ส่วนที่เก็บข้อมูล (Info) ส่วนที่เก็บ Address ของโหนดถัดไป (Link) Info Link 1 โหนด

4 ลักษณะโครงสร้างข้อมูลแบบรายการโยง
A B C ^

5 ประเภทรายการโยง รายการโยงแบบเดี่ยว (Singly Linked Lists)
รายการโยงแบบคู่ (Doubly Linked Lists)

6 รายการโยงแบบเดี่ยว โหนดหนึ่ง ๆ จะประกอบไปด้วย 2 ส่วน คือ ส่วนที่เก็บข้อมูลและส่วนที่เป็นลิงค์ฟิลด์ การทำงานกับรายการโยงแบบเดี่ยวมี 5 ขั้นตอน ดังนี้ การสร้าง การเพิ่ม การลบโหนด การแทรกโหนด การแสดงข้อมูลในรายการโยง

7 การสร้างรายการโยง เป็นการจองเนื้อที่ในหน่วยความจำสำหรับจัดเก็บข้อมูลใหม่ และจะต้องมีการสร้างตัวชี้ไปยังโหนดแรก ในที่นี้ชื่อ Head ถ้าไม่กำหนดตัวชี้นี้ การอ่านข้อมูลจะไม่ทราบว่าจะเริ่มอ่าน ณ ตำแหน่งใด สัญลักษณ์ต่าง ๆ มีดังนี้ Node(P) หมายถึง โหนดที่ถูกชี้ด้วย P New(P) หมายถึง การสร้างโหนดใหม่ INFO(P) หมายถึง ข้อมูลที่เก็บอยู่ในโหนดที่ถูกชี้ด้วย P LINK(P) หมายถึง ตำแหน่งที่อยู่ของโหนดถัดจากโหนด P

8 LINK(LINK(Head))  โหนดที่ 3 INFO(LINK(LINK(Head)))  120
การสร้างรายการโยง INFO LINK Head 60 90 120 ^ INFO(Head)  60 LINK(Head)  โหนดที่ 2 INFO(LINK(Head))  90 LINK(LINK(Head))  โหนดที่ 3 INFO(LINK(LINK(Head)))  120 LINK(LINK(LINK(Head)))  Null

9 การสร้างรายการโยง Tail Head 60 90 120 ^ เพิ่มตัวชี้อีก 1 ตัวคือ Tail
ทำให้ทราบว่าตำแหน่งสุดท้ายอยู่ที่ใด สามารถเพิ่มข้อมูลเข้าไปต่อท้ายได้ง่าย

10 คำสั่งสร้างรายการโยงด้วยภาษาซี
typedef struct node { int info; struct node *link; } node; node *Head, *Tail; int info; node INFO Link

11 การเพิ่มโหนด ก่อนที่จะมีการเพิ่มข้อมูลเข้าไปในโหนดจะต้องสร้างโหนดก่อน
ซึ่งการเพิ่มโหนดมี 2 วิธีคือ การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย การเพิ่มโหนดไว้ก่อนโหนดแรก กำหนดตัวชี้ 2 ตัวคือ Head, Tail

12 การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย
ถ้ามีข้อมูลมาเป็นตัวแรกในรายการโยง คือ 10 จะมีขั้นตอนวิธีดังนี้ 1. Head = Tail = Null P 2. New(P) Head 3. INFO(p) = 10 10 ^ 4. Link(p) = Null Tail 5. Head = p 6. Tail = p

13 การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย
เพิ่มข้อมูล 40 เข้าไปในรายการโยง 1. New(P) 4. Link(Tail) = p 2. INFO(P) = 40 5. Tail = p 3. Link(p) = Null P Tail Head 10 ^ 40 ^ Tail

14 การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย
เพิ่มข้อมูล 90 เข้าไปในรายการโยง 1. New(P) 4. Link(Tail) = p 2. INFO(P) = 90 5. Tail = p 3. Link(p) = Null Tail P Tail Head 10 40 ^ 90 ^

15 เปรียบเทียบคำสั่งในภาษาซี
New(P) INFO(P) = info Link(P) = Null Link(Tail) = P Tail = P P = new node P->info= info P->link = null Tail->Link= P Tail = P

16 โปรแกรมเพิ่มโหนดในภาษาซี
#include <stdio.h> #include <conio.h> typedef struct node { int data; struct node *next; } node; main() { node *head,*tail,*p; int info; head = NULL; printf(“Enter number = “);scanf(“%d”,&info); p = new node; p->data = info; p->next = NULL; if (head==NULL) { head=p; tail=p; } else { tail->next = p; tail = p; } }

17 การเพิ่มโหนดไว้ก่อนโหนดแรก
เพิ่มข้อมูล 40 เข้าไปในรายการโยง 1. New(P) 2. info(P) = 40 3. link(P) = Head 4. Head = p P Head Tail Head 40 10 ^

18 การเพิ่มโหนดไว้ก่อนโหนดแรก
เพิ่มข้อมูล 90 เข้าไปในรายการโยง 1. New(P) 2. info(P) = 90 3. link(P) = Head 4. Head = p P Head Tail Head 90 40 10 ^

19 การลบโหนด โหนดที่ต้องการลบ
จะต้องค้นหาตั้งแต่โหนดแรกคือ Head ชี้อยู่ ถ้าค่าที่ต้องการลบตรงกับโหนดใด ก็จะลบออกได้ 10 Head 20 30 40 ^ Tail โหนดที่ต้องการลบ

20 การลบโหนดโดยเลื่อนตัวชี้ Head
10 20 30 40 ^ Tail Head Head Head 10 20 40 ^ Tail Head

21 การลบโหนด เป็นการดึงโหนดออกจากรายการโยง ทำได้ 3 วิธี ลบโหนดแรก
ลบโหนดตรงกลาง ลบโหนดสุดท้าย

22 ลบโหนดแรก 10 Head 20 30 40 ^ Tail P Head = Link(Head) หรือ Head = Link(P) Head 20 30 40 ^ Tail

23 ลบโหนดภายใน Head 10 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P

24 ลบโหนดภายใน 10 Head 20 30 40 ^ Tail P Link(Link(Head)) = Link(P)

25 ลบโหนดภายใน Head 10 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P BeforeP 10 Head 20 30 40 ^ Tail P BeforeP

26 การแก้ปัญหาโดยเพิ่มตัวชี้ BeforeP
10 Head 20 30 40 ^ Tail P BeforeP Link(BeforeP) = Link(P)

27 การลบโหนดสุดท้าย 10 Head 20 30 40 ^ Tail BeforeP P Tail = BeforeP Link(Tail) = Null 10 Head 20 30 Tail BeforeP ^

28 การแทรกโหนด เป็นการแทรกโหนดใหม่เข้าไปในรายการโยง
ก่อนจะแทรกจะต้องค้นหาตำแหน่งที่จะแทรก มีการกำหนดตัวชี้ P สำหรับค้นหาตำแหน่งที่จะแทรก โดย P จะเริ่มต้นชี้ที่ตำแหน่ง Head ก่อนเสมอ

29 การแทรกโหนดใหม่ P Head 10 20 40 Head 10 20 40 P 1 2 Newnode 30

30 การแทรกโหนดใหม่ Head Newnode 30 10 20 40 P 1 2 Link(P) = Newnode 2. Link(Newnode) = Link(P)

31 การแทรกโหนดใหม่ Newnode 30 Head 10 20 40 Tail P 1 2 2. Link(Newnode) = Link(P) Link(P) = Newnode

32 การแสดงข้อมูล เป็นการดึงเอาข้อมูลที่มีอยู่มาแสดง
กำหนดให้ตัวชี้ P เริ่มชี้ที่โหนด Head แล้วเลื่อนตัวชี้ P ไปเรื่อย ๆ จนถึงโหนดสุดท้าย หรือ Tail

33 Head 10 20 ^ 40 Tail P P P 10 20 40

34 สร้างฟังก์ชันเมนู Showmenu() { printf(“ M E N U \n”); printf(“ 1. Add Link List\n”); printf(“ 2. Delete Link List\n”); printf(“ 3. Insert After \n”); printf(“ 4. Display Data\n”); printf(“ 5. Exit \n”); printf(“ Please Select [1-5] “); }

35 คำสั่งสร้างรายการโยงด้วยภาษาซี
typedef struct node { int code; char name[15]; float gpa; struct node *next; } node; node *Head, *Tail; int info; data next name gpa code next

36 รายการโยงแบบคู่(Doubly Linked List)
รายการโยงแบบคู่ยังคง 1 โหนดยังคงประกอบด้วย 2 ส่วนก็คือ ส่วนของข้อมูล (Info) ส่วนลิงค์ฟิลด์ (Link) สำหรับลิงค์ฟิลด์จะมี 2 ตัวคือ ลิงค์ฟิลด์แรกจะเก็บตำแหน่งที่อยู่โหนดก่อนหน้า หรือด้านซ้าย(Prev) ลิงค์ฟิลด์ที่สองเก็บตำแหน่งที่อยู่โหนดถัดไป หรือด้านขวา (Next)

37 รายการโยงแบบคู่ 1 node prev data next Data คือ ข้อมูลที่เก็บในโหนด Next คือ เก็บตำแหน่งที่อยู่โหนดถัดไป Prev คือ เก็บตำแหน่งที่อยู่โหนดก่อนหน้า

38 ^ 10 20 30 P Data(P) คือ ค่า 20 Next(P) คือ โหนดถัดจากโหนด P หรือโหนดที่ 3 Prev(P) คือ โหนดก่อนโหนด P หรือโหนดที่ 1 Data(Next(P)) คือ ค่า 30 Data(Prev(P)) คือ ค่า 10 Prev(Next(P)) คือ โหนดที่ 2 Next(Prev(P)) คือ โหนดที่ 2

39 รายการโยงแบบคู่ การทำงานกับรายการโยงแบบคู่มี 5 ขั้นตอน ดังนี้ การสร้าง
การเพิ่ม การลบโหนด การแทรกโหนด การแสดงข้อมูลในรายการโยง

40 การสร้างรายการโยงแบบคู่
เหมือนกับรายการโยงแบบเดี่ยว แต่มีตัวชี้ 2 ตัวคือ Next และ Prev กำหนดตัวชี้โหนดแรกชื่อ Head ตัวชี้โหนดสุดท้ายชื่อ Tail

41 คำสั่งสร้างรายการโยงด้วยภาษาซี
typedef struct node { int data; struct node *next,*prev; } node; node *Head, *Tail; int info; node prev data next

42 การเพิ่มโหนดในรายการโยง
สามารถเพิ่มได้ 2 วิธี คือ การเพิ่มโหนดใหม่ต่อจากโหนดสุดท้าย การเพิ่มโหนดใหม่ก่อนหน้าโหนดแรก

43 การเพิ่มโหนดต่อจากโหนดสุดท้าย
1. Head=Tail=NULL Head Tail 2. New(P) 3. Data(P) = A ^ A ^ 4. Prev(P) = NULL 5. Next(P) = NULL 6. Head = P P 7. Tail = P

44 การเพิ่มโหนดต่อจากโหนดสุดท้าย
1. New(P) Head Tail Tail 2. Data(P) = B 3. Next(P) = NULL ^ A ^ B ^ 4. Prev(P) = Tail 5. Next(Tail) = P P 6. Tail = P

45 การเพิ่มโหนดต่อจากโหนดสุดท้าย
Head Tail Tail ^ A B ^ C ^ 1. New(P) 4. Prev(P) = Tail 2. Data(P) = C 5. Next(Tail) = P P 3. Next(P) = NULL 6. Tail = P

46 การเพิ่มโหนดก่อนโหนดแรก
ในแบบฝึกหัดข้อที่ 9 เขียนขั้นตอนการเพิ่มโหนดใหม่ต่อจากโหนดแรก เช่นเพิ่มโหนด B เข้าไป มีขั้นตอนอย่างไร Head Tail P B ^ A ^

47 การลบโหนดในรายการโยง
Head P P P Tail ^ A B C D Prev(P) Next(P)

48 การลบโหนดในรายการโยง
2 P Tail ^ A B C D Head 1 Prev(P) Next(Prev(P)) = Next(P) Prev(Next(P)) = Prev(P) Next(P)

49 การลบโหนดในรายการโยง
Head ^ A B D ^

50 การแทรกโหนดใหม่ แทรกเป็นโหนดแรก
แทรกตรงกลาง (ก่อนโหนด P หรือหลังโหนด P) แทรกเป็นโหนดสุดท้าย

51 การแทรกก่อนโหนด P ^ A B D Tail P 4 1 3 2 E Newnode

52 การแทรกก่อนโหนด P ^ A B D Tail P 1 E Newnode

53 ^ A B P 4 1 3 2 3. Prev(newnode) =Prev(p) 4. Next(prev(newnode)) = newnode E Newnode 2. Next(newnode) = p 1. Prev(p) = newnode

54 การแทรกหลังโหนด P ^ A B D Head P 4 1 3 2 E Newnode

55 B D P 4 1 3 2 1. Prev(next(p)) = newnode E Newnode 2. Next(newnode) = next(P) 3. Prev(newnode) = P 4. Next(P) = newnode

56 การแสดงข้อมูลในรายการโยง
เป็นการดึงข้อมูลในรายการโยงออกมาแสดงเหมือนกับรายการโยงแบบเดี่ยว โดยดึงข้อมูลตั้งแต่โหนดแรก (Head) มาเรื่อย ๆ จนถึงโหนดสุดท้าย (Tail)

57 แสดงข้อมูลในลิงค์ลิสต์
^ A B D Head Tail A B D P P P แสดงข้อมูลในลิงค์ลิสต์

58 รายการโยงแบบวงกลม (Circular Linked List)
ปกติแล้วไม่ว่าจะเป็นรายการโยงแบบเดี่ยวหรือแบบคู่ link ของโหนดสุดท้ายจะเป็น Null แต่ถ้าเป็นรายการโยงแบบวงกลม กรณีที่เป็นรายการโยงแบบเดี่ยว link โหนดสุดท้ายจะชี้มาที่โหนดแรก กรณีที่เป็นรายการโยงแบบคู่ link ของโหนดแรกจะชี้ไปยังโหนดสุดท้าย และ link ของโหนดสุดท้ายจะชี้มาที่โหนดแรก

59 ตัวอย่างรายการโยงแบบวงกลม
60 90 120 Head Tail ^

60 ตัวอย่างรายการโยงแบบวงกลม
A B D Tail Head


ดาวน์โหลด ppt โครงสร้างข้อมูลแบบรายการโยง (Link List)

งานนำเสนอที่คล้ายกัน


Ads by Google