Professional Documents
Culture Documents
บทที่ 3
โครงสร้ างข้อมูลลิงค์ลิสต์ (Link List)
ในการประมวลผลข้อมู ลบ่ อยครั้ง จะมี การท างานที่ เกี่ย วข้องกับ การจัด เก็บ ข้อมู ลและ
ประมวลผลข้อมู ลที่จัด เก็บ อยู่ ในลิ สต์ ซึ่ งวิ ธีการเก็ บ ข้อมู ลแบบลิ สต์วิ ธีการหนึ่ งคื อ จัด เก็ บ ใน
ลักษณะของอาร์เรย์ที่ได้กล่าวมาแล้วในบทที่ 2 โดยโครงสร้างข้อมูลในอาร์เรย์ จะเป็ นตาแหน่งที่
ต่อเนื่องกันของข้อมูลในหน่วยความจา ไม่ข้ นึ อยู่กับข้อมูลที่เก็บ ซึ่งเราสามารถคานวณหาตาแหน่ ง
ของข้อมู ลต่างๆในอาร์เรย์ได้ง่าย แต่อาร์ เรย์ก็มีขอ้ เสี ยบางประการ เช่นต้องเสี ยเวลามากในกรณี
ของการเพิ่ม หรื อลบอิ ลิเมนต์ออกจากอาร์ เรย์ โดยแสดงตัวอย่างดังรู ป ที่ 3.1 และ 3.2 อีกประการ
หนึ่ งอาร์เรย์มีการใช้พ้ืนที่ของหน่ วยความจาส่ วนหนึ่ งคงที่แน่ นอน เราไม่สามารถขยายพื้นที่ของ
อาร์เรย์ได้เมื่อต้องการ หรื อในทางตรงกันข้าม หากมีการนาข้อมูลเข้าสู่ อาร์เรย์จานวนน้อยกว่าที่เรา
จัดสรรเนื้อที่ในการเก็บข้อมูล ก็จะทาให้เสี ยเนื้อที่หน่วยความจาโดยไม่มีประโยชน์ ด้วยเหตุผลดังนี้
จึงเรี ยกโครงสร้างข้อมูลแบบอาร์เรย์ว่า โครงสร้างข้อมูลแบบสแตติก(Static Data Structure)
1) หาตาแหน่งที่ตอ้ งการเพิ่มข้อมูล
10 20 40 50 ...
30
2) จัดเตรี ยมเนื้อที่ว่าง
10 20 40 50 ...
30
3) เพิม่ ข้อมูลเข้าไปในอาร์เรย์
10 20 30 40 50 ...
1) หาตาแหน่งที่ตอ้ งการลบข้อมูล
10 20 30 40 50 ...
2) มีเนื้อที่ว่าง
20
10 30 40 50 ...
3) หลังจากลบข้อมูลในอาร์เรย์
10 30 40 50 ...
int *pt ;
เมื่อประมวลผลคาสั่ง *pt = 10 ;
จะเกิดการจัดเก็บข้อมูลดังภาพ
500
pt 500 10
จากการทางานของตัวแปรแบบพอยเตอร์ จะเห็นว่าพอยเตอร์ไม่ได้ทาการเก็บค่าที่กาหนด
โดยตรงแต่จะใช้วิธีเก็บตัวชี้ ที่ใช้ช้ ี ไปยังหน่ วยความจาที่กาหนดค่าให้ ซึ่งเป็ นไปในลักษณะการ
กาหนดค่าให้โดยอ้อม
47
3. การแทนโครงสร้ างข้อมูลลิงค์ลิสต์
โครงสร้ างข้อมู ลแบบลิ งค์ลิ ส ต์เป็ นโครงสร้ างข้อ มู ล แบบรายการเชิ งเส้ น ที่ มี ลักษณะ
แตกต่างจากโครงสร้างข้อมู ลแบบรายการเชิ งเส้นที่ ผ่านมา เนื่ องจากการด าเนิ นการเพิ่ มหรื อลบ
ข้อมูลในโครงสร้างสามารถกระทาที่ขอ้ มูลตรงตาแหน่ งใด ๆ ในโครงสร้างก็ได้ ดังนั้นลักษณะ
ของโครงสร้างจึงมีความยืดหยุ่นกว่าและไม่มีขีดจากัดความจุของข้อมูลในโครงสร้าง เนื่องจากมี
การเรี ยกใช้ ห น่ วยความจ าแบบพลวั ต (Dynamic Memory Allocation) แต่ ข้ ั น ตอนในการ
ดาเนินการกับโครงสร้างจะมีความยุ่งยากซับซ้อนมากกว่า
นอกจากนี้ ข้อมู ลในโครงสร้ างไม่ จาเป็ นต้องอยู่ ในตาแหน่ งที่เก็บ ข้อมู ลแบบเรี ย งต่อกัน
แต่ใช้ หลักการของการเชื่อมโยงข้อมูลที่อยู่คนละที่ให้รวมเป็ นกลุ่มข้อมูลเดียวกันการแทน แบบ
ใช้พอยน์เตอร์ น้ ี ต้องมีพ้ืนที่เพิ่มเติมเป็ นส่ วนพอยน์เตอร์ (pointer) หรื อลิงค์ (link) เพื่อแสดงให้
เห็นชัดว่าโหนดที่ต่อจากโหนดนั้นคือโหนดใด ลักษณะของแต่ละโหนดจึงประกอบด้วยช่อง 2 ช่อง
ดังรู ปที่ 3.3
DATA LINK
ลักษณะโครงสร้างข้อมูลลิงค์ลิสต์ที่ประกอบด้วยโหนดหลายๆโหนดเชื่อมต่อกันสามารถดังรู ป ที่
3.4
Header D1 D2 D3 D4 NULL
D1 0 D1 -1 D1 NULL
start 6
จากโครงสร้างในรู ปที่ 3.6 แสดงลาดับของข้อมูลได้ดงั นี้ Ple , Yee , Ben , Kee , Ying ,
Pop , Yaa , Dome และ Keff แต่การแทนข้อมูลในลักษณะนี้มีขอ้ จากัดที่ตวั โครงสร้าง กล่าวคือ
จากัดจานวนของสมาชิกไว้เท่ากับขนาดของอาร์เรย์
การแทนลิงค์ลิสต์อีกวิธีหนึ่ง คือการประกาศจองหน่วยความจาเป็ นเรคอร์ด ซึ่งประกอบ
ด้วยส่วนที่เป็ นข้อมูล และส่วนที่เป็ นพอยน์เตอร์
50
START
Ple Yee Ben Kee
Keff NULL
pt
หลังการเลื่อนไปข้อมูลตัวถัดไป
ก่อนการเลื่อนไปข้อมูลตัวถัดไป
5. การดาเนินการกับโครงสร้ างข้อมูลลิงค์ลิสต์
5.1 การสร้ างโหนดและกาหนดโครงสร้ าง
การสร้างโหนด คือ การเตรี ยมโครงสร้างระเบียบสาหรับจัดเก็บข้อมูล เช่น ถ้าต้องการ
จัดเก็บข้อมูลจานวนเต็ม โครงสร้างของโหนดจะมีลกั ษณะดังรู ปที่ 3.9
ลั ก ษณ ะของโหนด
DATA LINK
START
p q
()
AVAIL
NULL
Storage Pool
()
เส้นที่แสดงรายการเชื่อมโยงเดิม
AVAIL คือ พอยน์เตอร์ ตาแหน่งของโหนดแรกใน Storage Pool
p คือ พอยน์เตอร์ที่ช้ ีโหนดก่อนโหนดที่จะเพิ่มเข้ามาใหม่
q คือ พอยน์เตอร์ที่ช้ ีโหนดหลังโหนดที่จะเพิ่มเข้ามาใหม่
NULL
AVAIL NEW Node(Get Node)
Step(1) : NEW AVAIL
NULL
AVAIL NEW
Step(2) : Avail Link(Avail)
NULL
Step(3): Link(NEW) NULL AVAIL
NULL NULL
NEW
AVAIL
NULL
START
NULL
DATA LINK
รูปที่ 3.14 แสดงขั้นตอนการเพิ่มข้ อมูลต่อจากโหนดที
1 Storage Pool
NEW
่กาหนดX NULL
2 DATA(NEW) = X
p = PT
3 q = Link(p)
4 Link(p) = NEW
DATA LINK
NEW X NULL
p = PT q
5 Link(NEW) = q
DATA LINK
NEW X
p q
DATA LINK
1 Storage Pool
2 DATA(NEW) = X NEW X NULL
NEW X NULL
START
p N q
NULL
START )
p N q
NULL
START
p N q
NULL
AVAIL NULL
Storage Pool
ขั้นตอนการลบโหนด
Algorithm DEL(DATA, LINK , START, AVAIL,PT, PTF)
1. [Delete first node] {กรณี ที่ 1 ลบโหนดแรก}
If PTF =NULL then
Set START = LINK[START]
Else {กรณีที่ 2 และ 3 การลบโหนดที่อยู่หลังโหนดที่กาหนด}
Set LINK[PTF] = LINK[PT] [Delete node N]
2. [Return Delete node to the AVAIL list]
Set LINK[PT] = AVAIL
AVAIL = PT
3. [Finish algorithm]
Exit.
6.1 โครงสร้ างข้อมูลลิงค์ลิสต์ แบบ Singly Linked List (SLL) แบ่งออกเป็ น 2 ประเภท
• โครงสร้างข้อมูลลิงค์ลิสต์แบบ Ordinary Singly Linked List (OSLL) โครงสร้างลิงค์
ลิสต์แบบ OSLL คือ โครงสร้างข้อมูลลิงค์ลิสต์ที่มีลกั ษณะของโหนดต่อเชื่อมกันไปในทิศทาง
เดียวกันเหมือนกับโครงสร้างข้อมูลลิงค์ลิสต์ที่กล่าวมาแล้วตั้งแต่ตน้
• โครงสร้างข้อมูลลิงค์ลิสต์แบบ Circular Singly Linked List (CSLL) มีลกั ษณะคล้าย
กับแบบ OSLL ยกเว้นพอยน์เตอร์ NULL ของโหนดสุ ดท้ายสามารถชี้กลับมายังตาแหน่งเริ่ มต้น
ของโครงสร้างข้อมูลได้ ดังรู ปที่ 3.18
60
LINK
HEAD LINK(HEAD)=HEAD
รูปที่ 3.19 แสดงลักษณะของ Circular Singly Linked List แบบที่มี Head Node
ลักษณะที่สาคัญของ CLL
เมื่อมีการดาเนินการอย่างใดอย่างหนึ่งกับสมาชิ กทุกตัวในโครงสร้างข้อมูลแบบ CLL
สามารถตั้งต้นที่สมาชิกตัวไหนก่อนก็ได้
head Ying
Ple Pop
Yee
p q
การประกาศลิงค์ลิตส์ แบบโยงคู่
#define STRING25 25
typedef struct pt
{
char info [string20]
struct pt *rlink, *llink;
}
pt;
pt *head , *start , *p , *q ;
head Ying
Ple Pop
Yee
3 4
2 1
Ben
Ying
Ple
Pop
start
แบบฝึ กหัดบทที่ 3
7. วาดรู ปและอธิบายขั้นตอนการลบข้อมูลออกจากลิงค์ลิสต์
©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©