4 linked list
Download
1 / 77

บทที่ 4 ลิงก์ลิสต์ ( Linked List ) - PowerPoint PPT Presentation


  • 157 Views
  • Uploaded on

บทที่ 4 ลิงก์ลิสต์ ( Linked List ). By Juthawut Chantharamalee.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' บทที่ 4 ลิงก์ลิสต์ ( Linked List )' - deanna-forbes


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
4 linked list

บทที่ 4 ลิงก์ลิสต์ (Linked List)

By Juthawut Chantharamalee

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


คำว่า “ลิสต์ (Lists)”หรือบางครั้งอาจเรียกว่า “รายการ” ถือว่าเป็นการจัดเก็บข้อมูลชนิดหนึ่ง และด้วยคุณสมบัติของลิสต์ที่เป็นไปในรูปเชิงเส้น คือมีลำดับต่อเนื่อง เช่น ลิสต์รายชื่อพนักงาน ลิสต์รายชื่อนักศึกษาสาขาคอมพิวเตอร์ หรือลิสต์รายการเพลง เป็นต้น และถ้าหากต้องการเลือกฟังเพลงใด ก็สามรถค้นหาเพลงที่ต้องการฟัง รวมถึงสามารถเพิ่มรายการเพลงใหม่เข้าไปในลิสต์ หรือลบรายการเพลงบางรายการออกจากลิสต์ได้ เป็นต้น

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


รูปที่ 4.1 ตัวอย่างลิสต์ที่ใช้ชีวิตประจำวัน ซึ่งในที่นี้คือลิสต์รายการเพลง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Linear list concepts
แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น (Linear List Concepts)

ด้วยคุณสมบัติเรียงลำดับของข้อมูลภายในลิสต์ที่มีลักษณะเป็นลำดับต่อเนื่อง ดังรูปที่ 4.2 โดยสมาชิกหรืออิลิเมนต์แต่ละตัวจะเชื่อมโยงกับ อิลิเมนต์ตัวถัดไปในลักษณะเป็นรายการต่อเนื่องกันไป เช่น อิลิเมนต์ลำดับสองจะอยู่ถัดจากอิลิเมนต์ลำดับหนึ่ง หรืออิลิเมนต์ลำดับสามจะอยู่ถัดจากอิลิเมนต์ลำดับสอง ซึ่งจะเป็นเช่นนี้ไปเรื่อยๆ จนกระทั้งถึงอิลิเมนต์ลำดับที่ n+1 ซึ่งจะอยู่ถัดจากอิลิเมนต์ลำดับที่ n และตัวคุณสมบัติดังที่กล่าวมานั้นเราเรียกว่าลิสต์นั้นเอง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201


Element 1 (

Element 2

Element 3

Element 3

รูปที่ 4.1 ตัวอย่างลิสต์ที่ใช้ชีวิตประจำวัน ซึ่งในที่นี้คือลิสต์รายการเพลง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


2 general list
ลิสต์เชิงเส้นยังสามารถแบ่งออกเป็น 2 ประเภทด้วยกันคือลิสต์แบบทั่วไป (General List)

ลักษณะของลิสแบบทั่วไป เราสามารแทรกหรือลบรายการลิสต์ ณ ตำแหน่งใดๆ ก็ได้ โดยปราศจากข้อจำกัดในด้านการดำเนินการภายในลิสต์ นอกจากนี้แล้ว ลิสต์แบบทั่วไปยังสามารถแบ่งออกเป็นลิสต์แบบสุ่ม (Random List) ซึ่งข้อมูลภายในลิสต์จะไม่เรียงลำดับ และ ลิสต์แบบเรียงลำดับ (Order List) ที่ข้อมูลภายในลิสต์จะถูกจัดเรียงอย่างเหมาะสมด้วยคีย์ โดยคีย์อาจจะเป็นฟิลด์หนึ่งหรือหลายๆ ฟิลด์ที่ใช้เป็นตัวชี้คุณสมบัติของรายการข้อมูลเหล่านั้น

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Restricted list
ลิสต์แบบมีข้อจำกัด ( 2 ประเภทด้วยกันคือRestricted List)

ข้อมูลที่อยู่ภายในลิสต์แบบมีข้อจำกัด ไม่ว่าจะเป็นการเพิ่มหรือลบข้อมูลออกจากลิสต์จะต้องกระทำที่จุดปลายด้านใดด้านหนึ่งของลิสต์เท่านั้น โครงสร้างลิสต์แบบมีข้อจำกัด อาจอยู่ในรูปแบบของลิสต์ชนิด FIFO หรือลิสต์แบบ LIFO ก็ได้ เช่น ลิสต์แบบ FIFO ก็คือคิว ในขณะที่ลิสต์แบบ LIFO ก็คือสแต๊ก

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


รูปที่ 4.3 การแบ่งประเภทของลิสต์ชนิดต่างๆ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Basic operations
การดำเนินงานพื้นฐานของลิสต์ (Basic Operations)

การดำเนินการพื้นฐานของลิสต์ ประกอบด้วยการแทรก (Insertion) การลบ (Delete) การอ่าน (Retrieval) และการท่องเข้าไปในลิสต์ (Traversal) โดยการแทรกก็คือการเพิ่มสมาชิกใหม่เข้าไปในลิสต์ การลบก็คือการลบนำสมาชิกออกจากลิสต์ การอ่านก็คือการดึงข้อมูลหรือสารสนเทศจากลิสต์ออกมาใช้งาน และการท่องไปในลิสต์ก็คือ การประมวลผลในแต่ละอิลิเมนต์ภายในลิสต์ตามลำดับ เช่น การท่องเข้าไปในลิสต์เพื่อหาผลรวมของคะแนนดิบของนักศึกษาทั้งหมด และนำมาคิดเป็นคะแนนเฉลี่ย เป็นต้น

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Insertion
การแทรก ( (Insertion)

การแทรกข้อมูลสามารถแทรกได้แบบเรียงลำดับหรือแบบสุ่มก็ได้ แต่สำหรับในที่นี้จะมุ่งเน้นเกี่ยวกับลิสต์แบบเรียงลำดับ (Ordered Lists) เป็นสำคัญ โดยการแทรกลิสต์แบบเรียงลำดับนั้น จะใช้คีย์เป็นตัวระบุข้อมูลโดยพิจารณาจากรูปที่ 4.4 ที่มีการแทรกข้อมูลเข้าไประหว่างลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


10 (

20

25

25

insertion

Insertion data

list

10

20

25

30

รูปที่ 4.4 การแทรกข้อมูลภายในลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Deletion
การลบ ( (Deletion)

การลบสมาชิกออกจากลิสต์ จะต้องทำการค้นหาตำแหน่งข้อมูลที่ต้องการลบก่อน เมื่อพบตำแหน่งที่ต้องการลบแล้ว จึงนำสมาชิกตำแหน่งนั้นออกจากลิสต์ ซึ่งแสดงดังรูปที่ 4.5

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Delete element identified by search (

blue

green

red

yellow

Deletion

red

Data

list

blue

green

yellow

รูปที่ 4.5 การลบข้อมูลออกจากลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Retrieval
การอ่าน ( (Retrieval)

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

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


cat (

dog

tiger

monkey

Retrieved element identified by search

Retrieval

dog

list

cat

dog

tiger

monkey

รูปที่ 4.6 การอ่านข้อมูลจากลิสต์ออกมาใช้งาน

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Traversal
การท่องไปในลิสต์ ( (Traversal)

กระบวนการท่องเข้าไปในลิสต์ จะต้องทำการเดินท่องเข้าไปยังแต่ละอิลิเมนต์ตามลำดับภายในลิสต์ ซึ่งมักใช้อัลกอริทึมแบบลูปในการท่องเข้าไปในลิสต์มากกว่าที่จะดำเนินการค้นหา สำหรับการประมวลผลในแต่ละอิลิเมนต์ภายในลูป นั้นหมายความว่าทุกๆ อิลิเมนต์ภายในลิสต์ได้ถูกประมวลผลเรียบร้อยแล้ว

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Linked list concepts
แนวคิดของลิงก์ลิสต์ ( (Linked List Concepts)

โครงสร้างข้อมูลแบบอาร์เรย์และโครงสร้างข้อมูลแบบลิงก์ลิสต์ ก็ล้วนแต่เป็นโครงสร้างข้อมูลแบบเชิงเส้นทั้งสิ้น โดยทั้งอาร์เรย์และลิงก์ลิสต์ก็ยังสามารถพัฒนาโครงสร้างแบบสแต็กและคิว พิจารณารูปที่ 4.7 ที่เป็นการเปรียบเทียบโครงสร้างข้อมูลแบบอาร์เรย์และลิงก์ลิสต์ ที่ต่างมีคุณสมบัติเป็นรายการต่อเนื่องหรือลิงก์ลิสต์นั้นเอง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


(a) Array (

Head

(b) Liked List

รูปที่ 4.7 อาร์เรย์และลิงก์ลิสต์ต่างก็เป็นโครงสร้างข้อมูลแบบเชิงเส้น

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ข้อมูล ( (Data)

ในส่วนข้อมูล จะมีการจัดเก็บสารสนเทศที่สามารถนำไปใช้ประโยชน์ เพื่อนำไปใช้ในการประมวลผลตามที่ต้องการต่อไป

ลิงก์ (Link)

ในส่วนของลิงก์นั้น จะใช้สำหรับเชื่อมโยงไปยังข้อมูล โดยเริ่มจากเฮดพอยน์เตอร์ที่ชี้ไปยังตำแหน่งโหนดแรกของลิสต์ จากนั้นลิงก์ในแต่ละโหนดก็เชื่อมจะเชื่อมโยงไปยังโหนดตัวถัดๆไปเรื่อยๆ ส่วนชื่อของลิสต์จะเป็นชื่อเดียวกันกับชื่อตัวแปรพอยน์เตอร์โดยลิงก์ลิสต์อย่างง่าย คือ ซิงเกิลลิงก์ลิสต์ (Single-Linked List) ซึ่งจะมีเพียงลิงก์เดียวที่ใช้เชื่อมโยงไปยังโหนดตัวถัดไป

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


5000 (

A

5001

7800

6500

D

6501

-1

7698

C

7699

6500

7800

B

7801

7698

8000

5000

รูปที่ 4.8 ตัวอย่างการแทนที่ลิงก์ลิสต์ในหน่วยความจำ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


pHead (

data

link

data

link

data

link

data

link

(a) เฮดพอยน์เตอร์ที่ชี้ไปยังจุดเริ่มต้นของลิงก์แต่ละโหนดเชื่อมโยงต่อกันเป็นสายด้วยลิงก์

(b) ลิงก์ลิสต์ว่างเปล่าที่ภายในลิงก์ไม่มีสมาชิก ตัวเฮดพอยน์เตอร์จะถูกกำหนดค่าเป็นค่า null

รูปที่ 4.9 ลิงก์ลิสต์ (Linked List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โหนดข้อมูลในลิงก์ลิสต์จะมีโครงสร้างที่ประกอบไปด้วย 2 ฟิลด์ด้วยกันคือ ข้อมูลและลิงก์ ให้พิจารณารูปที่ 4.10 ที่แสดงถึงโครงสร้างโหนดที่มีความแตกต่างกัน 3 ชนิด โดยโหนดแบบแรกจะบรรจุเพียงฟิลด์เดียวคือฟิลด์ชื่อ number และลิงก์ ส่วนโหนดแบบที่สองจะประกอบด้วย 3 ฟิลด์ด้วยกันคือฟิลด์ id, name, gpa แล้วตามด้วยลิงก์ ในขณะที่โหนดแบบที่สาม ภายในโหนดประกอบด้วยฟิลด์ทั้งหมดที่ถูกบรรจุอยู่ในโครงสร้างของตัวเอง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


number 2 ฟิลด์ด้วยกันคือ ข้อมูลและลิงก์ ให้พิจารณารูปที่ 4.10 ที่แสดงถึงโครงสร้างโหนดที่มีความแตกต่างกัน 3 ชนิด โดยโหนดแบบแรกจะบรรจุเพียงฟิลด์เดียวคือฟิลด์ชื่อ

id

name

gpa

(a) โหนดที่บรรจุเพียงฟิลด์เดียว

(b) โหนดที่บรรจุฟิลด์ 3 ฟิลด์

name

addr

phone

(c) โหนดที่บรรจุโครงสร้างข้อมูลไว้ภายใน

รูปที่ 4.10 แสดงถึงโหนดที่บรรจุข้อมูลในรูปแบบต่างๆ และลิงก์ที่ใช้สำหรับเชื่อมโยงไปยังโหนดถัดไป

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Linked list data structure
โครงสร้างข้อทูลแบบลิงก์ลิสต์ (Linked List Data Structure)

สำหรับโครงสร้างข้อมูลแบบลิงก์ลิสต์ ประกอบด้วย

โครงสร้างโหนดส่วนหัว (Head Node Structure)

ภายในโหนดส่วนหัว จะมีเพียงพอยต์เตอร์ที่ชี้ไปยังลิสต์ ซึ่งก็คือ เฮดพอยน์เตอร์ โครงสร้างโหนดส่วนนี้จะเกิดขึ้นหลังจากที่ได้ Create List ขึ้นมา โดยภายในบรรจุข้อมูลที่เกี่ยวกับลิสต์ หรือเรียกว่า Metadata ซึ่งเป็นข้อมูลภายในลิสต์ ดังรูปที่ 4.11 (a) ที่ภายในโครงสร้างโหนดส่วนหัวจะมี Metadata อยู่ตัวหนึ่ง ซึ่งในที่นี้คือ count ที่ภายในบรรจุค่าตัวเลขจำนวนเต็ม เช่น ค่าสูงสุดของโหนดที่มีได้

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


list (

count <integer>

head <pointer>

end list

count

head

(a) โครงสร้างของโหนดส่วนหัว (Head Structure)

node

data <data type>

link <pointer>

end node

data

link

(b) โครงสร้างโหนดข้อมูล (Data Node Structure)

รูปที่ 4.11 โครงสร้างโหนดส่วนหัวและโหนดข้อมูลของลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โครงสร้างโหนดข้อมูล ( (Data Node Structure)

โครงสร้างโหนดประกอบด้วยส่วนข้อมูลและลิงก์ ดังรูปที่ 4.12 (b) สำหรับชนิดข้อมูล (Data Type) ของลิสต์นั้นจะขึ้นอยู่กับการนำไปประยุกต์ใช้ แต่ปกติแล้ว ชนิดของข้อมูลจะเป็นไปในลักษณะที่แสดงไว้ด้านล่างและที่สำคัญ ชนิดของข้อมูลจะต้องได้รับการปรับปรุงรายละเอียดอยู่เสมอหลังจากถูกสร้างขึ้น เช่น Key Field ที่นำไปประยุกต์ใช้เพื่อการค้นหาข้อมูลด้วยคีย์

data

key

field1

field2

..

fieldN

end data

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201


คุณสมบัติของลิงก์ลิสต์คุณสมบัติของลิงก์ลิสต์

1. ลิงก์ลิสต์จะต้องใช้เฮดพอยน์เตอร์ (phead) เป็นตัวชี้ไปยังโหนดแรกของลิสต์ ในขณะที่พอยต์เตอร์หรือลิงก์ของแต่ละโหนดก็จะเชื่อมโยงลิงก์ไปยังโหนดตัวถัดไป โดยโหนดตัวสุดท้ายที่ไม่มีลิงก์ให้เชื่อมต่อจะถูกกำหนดค่าให้เป็น null ซึ่งในที่นี้ใช้ลักษณะ แทน 2. โหนดข้อมูลประกอบด้วย Data และ Link โดยที่ - Data คือข้อมูลหรือสารสนเทศที่สามารถนำไปใช้ประโยชน์ - Link คือตัวชี้หรือพอยน์เตอร์ที่ใช้สำหรับเชื่อมโยงไปยังโหนดถัดไป 3. ไม่มีความสัมพันธ์ทางกายภาพระหว่างโหนด

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


4. ข้อมูลที่จัดเก็บภายในหน่วยความจำไม่จำเป็นต้องอยู่ติดกัน 5. กรณีที่เฮดพอยน์เตอร์ไม่มีตัวชี้หรือไม่มีสมาชิก เฮดพอยน์เตอร์จะถูกกำหนดค่าเป็น null ซึ่งหมายถึงลิสต์ที่ว่าง

null

list

10

4

10

20

20

40

20

30

40

count

head

(b) การสร้างลิสต์ด้วยลิงก์ลิสต์

(a) ภาพแสดงหลักการของลิสต์

รูปที่ 4.12 หลักการของลิสต์และการสร้างลิสต์ด้วยลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ลิงก์ลิสต์จัดเป็นโครงสร้างข้อมูลที่ดีโครงสร้างหนึ่ง เพราะว่าเป็นโครงสร้างที่ง่ายต่อการเพิ่มและลบข้อมูลไม่ว่าจะกระทำที่ส่วนหน้า ส่วนหลัง หรือส่วนกลางของข้อมูล โดยพิจารณาจากรูปที่ 4.12 ที่แสดงถึงแนวความคิดของลิสต์ และการสร้างลิสต์และลิงก์ลิสต์ ในขณะที่รูปที่ 4.13 เป็นการนำเสนอภาพในรูปแบบอย่างง่าย เพื่อแสดงถึงความสะดวกต่อการเพิ่มหรือลบข้อมูลภายในลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ข้อดีของลิงก์ลิสต์ ลิงก์ลิสต์จัดเป็นโครงสร้างข้อมูลที่ดีโครงสร้างหนึ่ง เพราะว่าเป็นโครงสร้างที่ง่ายต่อการเพิ่มและลบข้อมูลไม่ว่าจะกระทำที่ส่วนหน้า ส่วนหลัง หรือส่วนกลางของข้อมูล โดยพิจารณาจากรูปที่ 4.12 ที่แสดงถึงแนวความคิดของลิสต์ และการสร้างลิสต์และลิงก์ลิสต์ ในขณะที่รูปที่ 4.13 เป็นการนำเสนอภาพในรูปแบบอย่างง่าย เพื่อแสดงถึงความสะดวกต่อการเพิ่มหรือลบข้อมูลภายในลิงก์ลิสต์

1. เป็นโครงสร้างที่ง่ายต่อการเพิ่มหรือลบข้อมูล 2. ไม่จำเป็นต้องขยับอิลิเมนต์ของลิสต์ไปข้างหน้าเพื่อให้เกิดพื้นที่ว่าง ในกรณีที่มีการลบอิลิเมนต์ตรงส่วนหน้าหรือส่วนกลางของลิสต์เช่นเดียวกับอาร์เรย์ 3. ใช้พื้นที่หน่วยความจำได้เต็มประสิทธิภาพ เนื่องจากหากข้อมูลภายในลิสต์มีน้อยก็ใช้น้อยซึ่งผิดกับอาร์เรย์ที่สูญเสียพื้นที่ไปในทันที ถึงแม้จะไม่มีข้อมูลภายในลิสต์ก็ตาม

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


4 ลิงก์ลิสต์จัดเป็นโครงสร้างข้อมูลที่ดีโครงสร้างหนึ่ง เพราะว่าเป็นโครงสร้างที่ง่ายต่อการเพิ่มและลบข้อมูลไม่ว่าจะกระทำที่ส่วนหน้า ส่วนหลัง หรือส่วนกลางของข้อมูล โดยพิจารณาจากรูปที่ 4.12 ที่แสดงถึงแนวความคิดของลิสต์ และการสร้างลิสต์และลิงก์ลิสต์ ในขณะที่รูปที่ 4.13 เป็นการนำเสนอภาพในรูปแบบอย่างง่าย เพื่อแสดงถึงความสะดวกต่อการเพิ่มหรือลบข้อมูลภายในลิงก์ลิสต์

tom

sam

jim

sara

count

head

insert

bob

5

tom

sam

jim

sara

count

head

insert

june

6

tom

sam

jim

bob

sara

count

head

Delete

5

june

tom

jim

bob

sara

sam

count

head

Delete

6

tom

sam

jim

bob

sara

count

head

รูปที่ 4.13 การเพิ่มหรือลบโหนดตำแหน่งใดๆ ภายในลิงก์ลิสต์ สามารถกระทำได้ง่ายด้วยการเชื่อมโยงลิงก์ใหม่

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Linked list algorithm
อัลกอริทึมของลิงก์ลิสต์ (Linked List Algorithm)

ฟังก์ชันการดำเนินการงานบนลิงก์ลิสต์มี 10 ฟังก์ชัน ประกอบด้วย Create List, Insert Node, Delete Node, Search List, Retrieve List, Empty List, Full List, List Count, Traverse List, และ Destroy List หากแอปพลิเคชันบางตัวจำเป็นต้องมีการให้ฟังก์ชันอื่นๆ เพิ่มเติม ก็สามารถดำเนินการเพิ่มเติมได้อีก โดยแต่ละฟังก์ชันจะมีการกำหนดชื่อเรียกตัวเองพร้อมรายละเอียดอย่างย่อ รวมถึงพารามิเตอร์ที่เรียกใช้ ซึ่งแต่ละอัลกอริทึมสามารถอธิบายรายละเอียดได้ดังต่อไปนี้

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การสร้างลิสต์ ( (Create List)

ฟังก์ชัน Create List เป็นการกำหนดโครงสร้างโหนดส่วนหัว และกำหนดค่าเริ่มต้นให้กับ Metadata สำหรับลิสต์ โดยในทีนี้จะมี Metadata อยู่ 2 ตัวด้วยกัน แต่อาจขยายเพิ่มเติมได้ โดยพิจารณาจากรูปที่ 4.14 ที่แสดงถึงเมื่อมีการสร้างลิสต์ขึ้นมา ให้สังเกตว่า เฮดพอยน์เตอร์จะมีค่าเป็น null เนื่องจากยังไม่มีข้อมูลภายในลิสต์ ซึ่งก็คือลิสต์ว่างเปล่านั้นเอง ส่วนซูโดโค้ดที่ใช้สำหรับสร้างลิสต์ได้แสดงไว้ในอัลกอริทึมที่ 4.1

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


allocate (list) (

set list head to null

set list count to 0

list

0

count

head

รูปที่ 4.14 แสดงการสร้างลิสต์ขึ้นมาเพื่อเตรียมการใช้งาน

Algorithm createList (List)

Initializes metadata for list

Pre list is metadata structure passed by reference

Post metadata initialized

1 allocate (list)

2 set list head to null

3 set list count to 0

end createList

อัลกอริทึมที่ 4.1 การสร้างลิสต์ (Create List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแทรกโหนด ( (Insert Node )

เป็นที่ใช้สำหรับแทรกโหนดเพิ่มเข้าไปในลิสต์ โดยที่โหนดก่อนหน้า (Predecessor) ของโหนดใหม่ที่แทรกนั้นคือโหนดใด โดยมีหลักการดังนี้ 1. จัดสรรหน่วยความจำสำหรับโหนดใหม่พร้อมกับข้อมูล 2. กำหนดตัวชี้ให้กับลิงก์ฟิลด์ของโหนดใหม่ 3. นำตัวชี้ที่อยู่ก่อนหน้าโหนดใหม่ชี้มายังโหนดใหม่

ในการแทรกโหนดเข้าไปในลิสต์นั้น ขั้นตอนแรกจำเป็นต้องรู้ตำแหน่งที่อยู่ของโหนดก่อนหน้า โหนดใหม่ที่ต้องการแทรกเสียก่อน

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ซึ่งโหนดนี้จะระบุตัวชี้ที่เป็นไปได้ทั้ง 2 สถานะด้วยกันคือ อาจเป็นแอดเดรสของโหนดถัดไปหรือ เป็นค่า null ก็ได้

ในการแทรกโหนดเพิ่มเข้าไปในลิสต์สามารถกระทำได้ 4 รูปแบบ คือ 1. การแทรกโหนดในลิสต์ว่าง 2. การแทรกโหนดที่ตำแหน่งแรก 3. การแทรกโหนดตรงส่วนกลางของลิสต์ 4. การแทรกโหนดที่ท้ายลิสต์

และต่อไปนี้คือราบละเอียดการแทรกในรูปแบบต่าง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแทรกโหนดในลิสต์ว่าง (Insert into Empty List )

กรณีนี้เป็นการแทรกโหนดเพิ่มเข้าไปในลิสต์ในขณะที่ลิสต์ว่างเปล่าหรือไม่มีข้อมูลใดๆ อยู่ นั้นหมายถึงเป็นการแทรกสมาชิกตัวแรกเข้าไป ซึ่งขณะนั้นเฮดพอยน์เตอร์จะมีค่าเป็น null เนื่องจากเป็นลิสต์ว่าง หลังจากนั้นก็มีลิสต์ใหม่ที่ต้องการแทรกเพิ่มเข้ามา (pNew) ดังนั้นในกรณีนี้จึงมีการเชื่อมโยงลิงก์ระหว่างกันดังนี้

set pNew link to list head (Null pointer)

set list head to pNew (First node)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


จากซูโดโค้ดข้างต้น แสดงถึงการแทรกโหนดเข้าไปในลิสต์ในขณะที่ลิสต์ว่าง ซึ่งผลการกระทำดังกล่าวก็จะได้ข้อมูลโหนดแรกภายในลิสต์ที่เป็นไปได้ดังรูปที่ 4.15

(a) Before add

list

0

75

count

head

pNew

set pNew link to list head

set list head to pNew

list

1

75

count

head

pNew

(b) After add

รูปที่ 4.15 แสดงการแทรกโหนดเมื่อลิสต์ภายในว่าง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแทรกโหนดที่ตำแน่งแรก (Insert at Beginning)

กรณีนี้เป็นการแทรกโหนดเข้าไปไว้ในโหนดแรก ซึ่งทำให้โหนดที่เคยอยู่ลำดับแรกเดิมต้องมาต่อท้ายโหนดใหม่ที่แรกเข้าไป ขั้นตอนแรกของการแทรกข้อมูลที่โหนดแรกของลิสต์ จะต้องทราบถึงตัวชี้ของตัว Predecessor ก่อน ซึ่งหากไม่มี หรือมีค่าเป็น null ก็หมายความว่าเป็นการแทรกโหนดแรกในลิสต์ที่ว่างเปล่าเหมือนกับในกรณีแรกที่ผ่านมานั้นเอง

set pNew link to list head (To current first node)

set list head to pNew (To new first node)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


สำหรับรูปที่ 4.18 แสดงถึงการแทรกโหนดไว้ที่ท้ายของลิสต์

(a) Before add

list

3

39

52

75

count

head

134

pPre

pNew

set pNew link to pPre link

set pPre link to pNew

list

4

39

52

75

count

head

134

pPre

pNew

(b) After add

รูปที่ 4.18 แสดงการแทรกโหนดไว้ที่ส่วนท้ายของลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm แสดงถึงการแทรกโหนดไว้ที่ท้ายของลิสต์ insertNode (list, pPre, dataIn)

  • Inserts data into a new node in the list

  • Pre list is matadata structure to a valid list.

  • pPre is pointer to data’s logical predecessor

  • dataIn contains data to be inserted

  • Post data have been inserted in sequence

  • Return true if successful. False if memory overflow

  • allocate (pNew)

  • set Pnew data to dataIn

  • if (pPre null)

  • Adding before first node or to empty list.

  • 1 set pNew link to list head

  • 2 set list head to pNew

  • else

  • Adding in middle or end.

  • 1 set pNew link to pPre link

  • 2 set pPre link to pNew

  • 5 end if

  • 6 Return true

  • end insertNode

อัลกอริทึมที่ 4.2 การแทรกโหนด (Insert List Node)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การแทรกโหนดท้ายลิสต์ (Insert at End)

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

set pNew link to null pointer

set pPre link to pNew (Predecessor to new)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การลบโหนด ( (Delete Node )

อัลกอริทึมการลบโหนดออกจากลิสต์ นอกจากจะนำโหนดที่ถูกลบส่งคืนแก่หน่วยความจำระบบเพื่อจะนำไปใช้งานต่อไปแล้ว ยังต้องมีการปรับเปลี่ยนตัวชี้ใหม่ด้วย สำหรับขั้นตอนแรกของการลบโหนด จะต้องค้นหาตำแหน่งของโหนดที่ต้องการลบ (pLoc) และจะต้องทราบตำแหน่งแอดเดรสของ Predecessor (pPro) ซึ่งก็คือโหนดที่อยู่ก่อนหน้าโหนดที่ต้องการลบจากนั้นกำหนดลิงก์ฟิลด์ชี้ไปยัง Successor ซึ่งเป็นโหนดที่อยู่ข้างหลังโหนดที่ถูกลบ และนำพื้นที่หน่วยความจำส่งคืนแก่ระบบอื่นต่อไป โดยมีการลบโหนดในส่วนอื่นๆ ภายในลิสต์อีกดังต่อไปนี้

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การลบโหนดที่ตำแหน่งแรก (Delete First Node )

ในกรณีลบโหนดที่อยู่ลำดับแรกของลิสต์ เมื่อรู้ตำแหน่งแรกโหนดแรกแล้ว (pLoc) ต่อมาก็ให้ทำหารรีเซตเฮดพอยน์เตอร์เพื่อชี้ไปยังโหนด Successor ที่อยู่ถัดจากโหนดแรกที่ต้องการลบ จากนั้นก็จะนำโหนดที่ถูกลบส่งคืนแก่ระบบ และเนื่องจากเป็นการลบโหนดแรกออกจากลิสต์ ตัวโหนด Predecessor (pPre) ที่อยู่ก่อนหน้านั้นจึงไม่มี ดังนั้นโหนด pPre จึงถูกกำหนดค่าให้เป็น null ซึ่งหมายถึงเป็นการลบโหนดที่ตำแหน่งแรกนั้นเอง

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


โดยรูปที่ 4.19 เป็นขั้นตอนแสดงการลบโหนดลำดับแรกออกจากลิสต์

(a) Before delete

list

3

39

75

134

count

head

pPre

pLoc

set list head to pLoc link

Recycle (pLoc)

list

2

Recycle

75

134

count

head

pPre

pLoc

(b) After Delete

รูปที่ 4.19 แสดงการลบโหนดลำดับแรกออกจากลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การลบโหนดโดยทั่วไป ( เป็นขั้นตอนแสดงการลบโหนดลำดับแรกออกจากลิสต์General Delete Node )

การลบโหนดประกอบด้วยการลบโหนดที่อยู่กึ่งกลางภายในลิสต์และการลบโหนดที่ท้ายลิสต์ โดยทั้งสองกรณี ขั้นตอนแรกจำเป็นต้องรู้ตำแหน่งโหนดที่ต้องการลบเสียก่อน จากนั้นก็กำหนดตัวชี้ของโหนด Predecessor ให้ชี้ไปยังโหนด Successor ที่อยู่ถัดจากโหนดในตำแหน่ง pLoc หรือโหนดที่ต้องการลบนั้นเอง โดยแสดงขั้นตอนการกระทำดังรูปที่ 4.20

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


(a) Before delete เป็นขั้นตอนแสดงการลบโหนดลำดับแรกออกจากลิสต์

list

3

39

75

134

count

head

pPre

pLoc

set pPre link to pLoc link

list

2

39

Recycle

134

count

head

pPre

pLoc

(b) After Delete

รูปที่ 4.20 แสดงการลบโหนดออกจากลิสต์โดยทั่วไป

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm เป็นขั้นตอนแสดงการลบโหนดลำดับแรกออกจากลิสต์ DeleteNode (list, pPre, pLoc, dataOut)

  • Deletes data from list & returns it to calling module.

  • Pre list is matadata structure to a valid list.

  • pPre is pointer to predecessor node

  • pLoc is pointer to node to be deleted

  • dataOut is variable to receive deleted data

  • Post data have been deleted and return caller

  • move pLoc data to dataOut

  • if (pPre null)

  • Deleting first node

  • 1 set list head to pLoc link

  • 3 else

  • Deleting other nodes

  • 1 set pPre link to pLoc link

  • end if

  • recycle (pLoc)

  • end DeleteNode

อัลกอริทึมที่ 4.3 การลบโหนด (Delete Node)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การค้นหาข้อมูลภายในลิสต์ (Search List )

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

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


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

data

Key

field1

field2

.

.

fieldN

end data

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


เริ่มแรกการค้นหา จะต้องกำหนดคีย์ที่ต้องการค้นหาให้ได้ก่อน หรือเรียกว่า Target Key โดยการค้นหาภายในลิสต์แบบเรียงลำดับข้อมูลภายในลิสต์แบบเรียงลำดับข้อมูล จะทำการค้นหานับตั้งแต่โหนดแรกไปจนกระทั่งข้อมูลภายในลิสต์ตรงกับค่า Target Key แล้วจริงรีเทิร์นค่าตรรกะเป็นจริงกลับไป ในขณะที่หากไม่สามารถจับคู่กับคีย์ได้ ก็จะรีเทิร์นค่าตรรกะเป็นเท็จกลับไป ซึ่งเงื่อนไขดังกล่าวจะถูกกำหนดไว้ตามกฎเกณฑ์อย่างเหมาะสม ดังตารางรูปที่ 4.21

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


เงื่อนไข จะต้องกำหนดคีย์ที่ต้องการค้นหาให้ได้ก่อน หรือเรียกว่า (Condition)

ตำแหน่งตัวก่อนหน้า(pPre)

ตำแหน่งที่ค้นหา (PLoc)

รีเทิร์นค่า (Return)

Target < first node

Target = first node

First < Target < last

Target = middle node

Target = last node

Target > last node

Null

Null

Largest node < target

Node’s predecessor

Lasts predecessor

Last node

First node

First node

First node > target

Equal node

Last node

Null

False

True

False

True

True

False

รูปที่ 4.21 ตารางแสดงผลลัพธ์ของการค้นหาข้อมูลภายในลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Located first จะต้องกำหนดคีย์ที่ต้องการค้นหาให้ได้ก่อน หรือเรียกว่า

Located middle

Located last

target

target

target

. . .

. . .

5

10

15

20

95

100

pPre

pLoc

pPre

pLoc

pPre

pLoc

(a) การค้นหาข้อมูลในลิสต์พบ (Returntrue)

Located first

Located middle

Located last

Target > 5

Target < 20

Target < 5

Target > 100

. . .

. . .

5

10

15

20

95

100

pPre

pLoc

pPre

pLoc

pPre

pLoc

(b) การค้นหาข้อมูลในลิสต์ไม่พบ (Returnfalse)

รูปที่ 4.20 แสดงการลบโหนดออกจากลิสต์โดยทั่วไป

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ 4.4 การค้นหาข้อมูล (Search List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การดึงข้อมูลจากโหนดออกมาใช้งาน (Retrieve List )

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

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm (RetrieveNode (list, key, dataOut)

  • Return Boolean indicating whether the list is empty.

  • Pre list is matadata structure to a valid list

  • key is target of data to be retrieved

  • dataOut is variable to receive retrieve data

  • Post data placed in dataOut or error returned if not found

  • Return true if successful, false if data not found

  • set found to searchList (list, pPre, pLoc, key)

  • if (found)

  • 1 move pLoc data to dataOut

  • 3 end if

  • 4 return found

  • end RetrieveNode

อัลกอริทึมที่ 4.5 การดึงข้อมูล (Retrieve Node)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ลิสต์ว่าง ( (Empty List )

เป็นฟังก์ชันที่ใช้ตรวจสอบว่าภายในลิสต์ว่างหรือไม่ ซึ่งเป็นโมดูลแบบง่ายที่รีเทิร์นค่าตรรกะ ณ ขณะนั้นกลับไป เช่น รีเทิร์นค่าตรรกะเป็นจริงกลับไปในกรณีลิสต์ว่าง หรือในทางตรงกันข้ามก็รีเทิร์นค่าตรรกะเท็จกลับไป เป็นต้น โดยรายละเอียดของการเขียนซูโดโค้ดนี้ แสดงไว้ในอัลกอริทึมที่ 4.6

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm (emptyList (list)

  • Return Boolean indicating whether the list is empty.

  • Pre list is matadata structure to a valid list

  • Return true if list empty, false if list contains data

  • if (list count equal 0)

  • 1 return true

  • else

  • 1 return false

  • endemptyList

อัลกอริทึมที่ 4.6 ลิสต์ว่าง (Empty List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ลิสต์เต็ม ( (Full List )

เป็นฟังก์ชันที่ใช้ตรวจสอบว่าภายในลิสต์นั้นเต็มหรือไม่ ซึ่งจัดเป็นโมดูลแบบง่ายเช่นกัน ด้วยการรีเทิร์นค่าตรรกะ ณ ขณะนั้นกลับไป อย่างไรก็ตาม ฟังก์ชันนี้อาจไม่จำเป็นต้องใช้ก็ได้ โดยเฉพาะภาษา C เนื่องจากลิงก์ลิสต์ใช้หน่วยความจำแบบไดนามิก โดยรายละเอียดของการเขียนซูโดโค้ดนี้ แสดงไว้ในอัลกอริทึมที่ 4.7

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm (fullList (list)

  • Return Boolean indicating whether the list is empty.

  • Pre list is matadata structure to a valid list

  • Return false if room for new node, true if memory full

  • if (memory full)

  • 1 return true

  • else

  • 1 return false

  • end if

  • return true

  • endfullList

อัลกอริทึมที่ 4.7 ลิสต์เต็ม (Full List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


จำนวนสมาชิกในลิสต์ ( (List Count)

ฟังก์ชัน List Count ภายในโมดูลจะมีเพียงคำสั่งเดียวเท่านั้น แต่ก็เป็นฟังก์ชันที่มีความสำคัญทีเดียว เพราะว่าจะแจ้งจำนวนสมาชิกหรือจำนวนอิลิเมนต์ที่มีอยู่ในขณะนั้นให้กับโมดูลที่เรียก แทนที่จะต้องท่องเข้าไปในลิสต์เพื่อนับสมาชิกและอิลิเมนต์แทน โดยซูโดโค้ดนี้ แสดงไว้ในอัลกอริทึมที่ 4.8

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Algorithm ( listCount (list)

Return integer representing number of nodes in list

Pre list is matadata structure to a valid list.

Return count for number of nodes in list

1 return (list count)

end listCount

อัลกอริทึมที่ 4.8 จำนวนสมาชิกในลิสต์ (ListCount)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การท่องเข้าไปในลิสต์ (Traverse Count)

อัลกอริทึมการท่องเข้าไปในลิสต์ จะเริ่มต้นที่โหนดแรกและสแกนไปทีละโหนดจนกระทั้งสิ้นสุดที่โหนดสุดท้าย ตรรกะของการท่องเข้าไปในลิสต์นั้น สามารถใช้อัลกอริทึมเพื่อใช้งานได้หลากหลาย เช่น 1. การเปลี่ยนแปลงค่าในแต่ละโหนด 2. การพิมพ์ข้อมูลภายในลิสต์ 3. การคำนวณหาผลรวมของฟิลด์ภายในลิสต์ 4. การคำนวณค่าเฉลี่ย

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


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

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


count 2 วิธีด้วยกันคือ

pos

head

list

N

. . .

5

10

15

20

95

100

รูปที่ 4.23 การท่องเข้าไปในลิสต์ (List traversal)

pHead

id

name

score

001

Jan

78

002

June

81

. . .

002

John

81

050

Joy

70

รูปที่ 4.24 การประยุกต์ลิงก์ลิสต์ด้วยการท่องเข้าไปในลิสต์เพื่อหาผลรวมคะแนนทั้งหมดและนำมาคำนวณค่าเฉลี่ย

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ 4.9 การท่องไปยังลิสต์ (Traverse List)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


การยกเลิกการใช้งานลิสต์ (Destroy List)

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

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


  • Algorithm ( destroyList (list)

  • Deletes all data in list

  • Pre list is metadata structure to a valid list.

  • Post all data deleted

  • Loop (not at end of list)

  • 1 set list head to successor node

  • 2 release memory to heap

  • End loop

  • No data left in list. Reset metadata.

  • set list pos null

  • set list count to 0

  • end destroyList

อัลกอริทึมที่ 4.10 การยกเลิกการใช้งานลิสต์ (DestroyList)

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


Other linked lists
ลิงก์ลิสต์ชนิดอื่นๆ ( (Other Linked Lists)

ความรู้เกี่ยวกับลิงก์ลิสต์ที่กล่าวมาในข้างต้นเป็นซิงเกิลลิงก์ลิสต์ (Single-Linked List) เนื่องจากบรรจุเพียงลิงก์เดียวที่ชี้ไปยังโหนดถัดไปเพียงโหนดเดียว ดังนั้นจึงทำให้ลิงก์ลิสต์ประเภทนี้มีข้อจำกัดคือไม่สามารถท่องไปยังลิสต์ในลักษณะจากหลังไปหน้าได้ การเข้าไปดำเนินการใดๆ ภายในลิสต์จึงต้องเริ่มต้นจากโหนดแรกไปยังโหนดสุดท้าย และไม่สามารถเดินแบบย้อนกลับ ซึ่งเนื้อหาต่อไปนี้จะกล่าวถึง ลิงก์ลิสต์ชนิดอื่นๆ ที่มีความซับซ้อนมากว่าซิงเกิลลิงก์ลิสต์ คือ

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


เซอร์คูลาร์ลิงก์ลิสต์ (Circular-Linked List)

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

list

N

5

10

95

count

rear

link

link

link

link

รูปที่ 4.25 Circular-Linked List

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


ดับเบิลลิงก์ลิสต์ ( (Double-Linked List)

ดับเบิลลิงก์ลิสต์จัดเป็นลิงก์ลิสต์ประเภทหนึ่งที่มีความสามารถสูงที่เดียว ดับเบิลลิงก์ลิสต์ในแต่ละโหนดจะประกอบไปด้วยพอยน์เตอร์อยู่ 2 ตัว โดยตัวแรกจะใช้สำหรับชี้ไปยังโหนดตัวถัดไป (Successor) และอีกตัวชี้ไปยังโหนดก่อนหน้า (Predecessor) ซึ่งแสดงได้ดังรูปที่ 4.26

B

F

B

F

. . .

list

count

rear

head

5

95

B = Backward pointer

F = Forward pointer

รูปที่ 4.26 Double-Linked List

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


และต่อไปนี้จะเป็นรูปที่แสดงการแทรกโหนดและการลบโหนดออกจากดับเบิลลิงก์ลิสต์ โดยรูปที่ 4.27 เป็นการแทรกโหนด ส่วนรูปที่ 4.28 เป็นการลบโหนด ในขณะที่อัลกอริทึมที่ 4.11 นั้นเป็นอัลกอริทึมการแทรกในดับเบิลลิงก์ลิสต์ และอัลกอริทึมที่ 4.12 เป็นการลบโหนดในดับเบิลลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


list โดยรูป

0

count

rear

head

list

1

20

count

rear

head

B

F

pPre

pNew

20

B

F

Before

After

(a) การแทรกโหนดเมื่อลิสต์ว่างหรือแทรกโหนดในตำแหน่งแรก

list

2

20

40

count

rear

head

B

F

B

F

pNew

30

pPre

B

F

pSucc

Before

3

20

30

40

list

count

rear

head

B

F

B

F

B

F

After

(b) การแทรกโหนดระหว่างสองโหนด

รูปที่ 4.27 แสดงการลบโหนดออกจากดับเบิลลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


list โดยรูป

3

25

50

75

count

rear

head

B

F

B

F

B

F

pPre

pDlt

pSucc

(a) Before delete

list

2

25

(Recycled)

75

count

rear

head

B

F

B

F

(b) After deleting 50

รูปที่ 4.28 แสดงการลบโหนดออกจากดับเบิลลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ โดยรูป4.11 การแทรกโหนดในดับเบิลลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


อัลกอริทึมที่ โดยรูป4.12 แสดงการลบโหนดออกจากดับเบิลลิงก์ลิสต์

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202


The End โดยรูป

Lesson 4

วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201


ad