ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
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
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.