880 likes | 1.33k Views
บทที่ 4 ลิงก์ลิสต์ ( Linked List ). By Juthawut Chantharamalee.
E N D
บทที่ 4 ลิงก์ลิสต์ (Linked List) By Juthawut Chantharamalee วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
คำว่า “ลิสต์ (Lists)”หรือบางครั้งอาจเรียกว่า “รายการ” ถือว่าเป็นการจัดเก็บข้อมูลชนิดหนึ่ง และด้วยคุณสมบัติของลิสต์ที่เป็นไปในรูปเชิงเส้น คือมีลำดับต่อเนื่อง เช่น ลิสต์รายชื่อพนักงาน ลิสต์รายชื่อนักศึกษาสาขาคอมพิวเตอร์ หรือลิสต์รายการเพลง เป็นต้น และถ้าหากต้องการเลือกฟังเพลงใด ก็สามรถค้นหาเพลงที่ต้องการฟัง รวมถึงสามารถเพิ่มรายการเพลงใหม่เข้าไปในลิสต์ หรือลบรายการเพลงบางรายการออกจากลิสต์ได้ เป็นต้น วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
รูปที่ 4.1 ตัวอย่างลิสต์ที่ใช้ชีวิตประจำวัน ซึ่งในที่นี้คือลิสต์รายการเพลง วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น (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) ลักษณะของลิสแบบทั่วไป เราสามารแทรกหรือลบรายการลิสต์ ณ ตำแหน่งใดๆ ก็ได้ โดยปราศจากข้อจำกัดในด้านการดำเนินการภายในลิสต์ นอกจากนี้แล้ว ลิสต์แบบทั่วไปยังสามารถแบ่งออกเป็นลิสต์แบบสุ่ม (Random List) ซึ่งข้อมูลภายในลิสต์จะไม่เรียงลำดับ และ ลิสต์แบบเรียงลำดับ (Order List) ที่ข้อมูลภายในลิสต์จะถูกจัดเรียงอย่างเหมาะสมด้วยคีย์ โดยคีย์อาจจะเป็นฟิลด์หนึ่งหรือหลายๆ ฟิลด์ที่ใช้เป็นตัวชี้คุณสมบัติของรายการข้อมูลเหล่านั้น วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
ลิสต์แบบมีข้อจำกัด (Restricted List) ข้อมูลที่อยู่ภายในลิสต์แบบมีข้อจำกัด ไม่ว่าจะเป็นการเพิ่มหรือลบข้อมูลออกจากลิสต์จะต้องกระทำที่จุดปลายด้านใดด้านหนึ่งของลิสต์เท่านั้น โครงสร้างลิสต์แบบมีข้อจำกัด อาจอยู่ในรูปแบบของลิสต์ชนิด FIFO หรือลิสต์แบบ LIFO ก็ได้ เช่น ลิสต์แบบ FIFO ก็คือคิว ในขณะที่ลิสต์แบบ LIFO ก็คือสแต๊ก วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
รูปที่ 4.3 การแบ่งประเภทของลิสต์ชนิดต่างๆ วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
การดำเนินงานพื้นฐานของลิสต์ (Basic Operations) การดำเนินการพื้นฐานของลิสต์ ประกอบด้วยการแทรก (Insertion) การลบ (Delete) การอ่าน (Retrieval) และการท่องเข้าไปในลิสต์ (Traversal) โดยการแทรกก็คือการเพิ่มสมาชิกใหม่เข้าไปในลิสต์ การลบก็คือการลบนำสมาชิกออกจากลิสต์ การอ่านก็คือการดึงข้อมูลหรือสารสนเทศจากลิสต์ออกมาใช้งาน และการท่องไปในลิสต์ก็คือ การประมวลผลในแต่ละอิลิเมนต์ภายในลิสต์ตามลำดับ เช่น การท่องเข้าไปในลิสต์เพื่อหาผลรวมของคะแนนดิบของนักศึกษาทั้งหมด และนำมาคิดเป็นคะแนนเฉลี่ย เป็นต้น วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
การแทรก (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) การลบสมาชิกออกจากลิสต์ จะต้องทำการค้นหาตำแหน่งข้อมูลที่ต้องการลบก่อน เมื่อพบตำแหน่งที่ต้องการลบแล้ว จึงนำสมาชิกตำแหน่งนั้นออกจากลิสต์ ซึ่งแสดงดังรูปที่ 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) เมื่อต้องการอ่านข้อมูลจากลิสต์ ขั้นตอนแรกจะต้องทำการค้นหาตำแหน่งข้อมูลที่ต้องการลบให้พบเสียก่อน จากนั้นทำการอ่านหรือดึงข้อมูลออกมาใช้งาน โดยดำเนินการดังกล่าวไม่ได้มีการเปลี่ยนแปลงข้อมูลในลิสต์แต่อย่างใด ซึ่งแสดงดังรูปที่ 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) กระบวนการท่องเข้าไปในลิสต์ จะต้องทำการเดินท่องเข้าไปยังแต่ละอิลิเมนต์ตามลำดับภายในลิสต์ ซึ่งมักใช้อัลกอริทึมแบบลูปในการท่องเข้าไปในลิสต์มากกว่าที่จะดำเนินการค้นหา สำหรับการประมวลผลในแต่ละอิลิเมนต์ภายในลูป นั้นหมายความว่าทุกๆ อิลิเมนต์ภายในลิสต์ได้ถูกประมวลผลเรียบร้อยแล้ว วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
แนวคิดของลิงก์ลิสต์ (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 id name gpa (a) โหนดที่บรรจุเพียงฟิลด์เดียว (b) โหนดที่บรรจุฟิลด์ 3 ฟิลด์ name addr phone (c) โหนดที่บรรจุโครงสร้างข้อมูลไว้ภายใน รูปที่ 4.10 แสดงถึงโหนดที่บรรจุข้อมูลในรูปแบบต่างๆ และลิงก์ที่ใช้สำหรับเชื่อมโยงไปยังโหนดถัดไป วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
โครงสร้างข้อทูลแบบลิงก์ลิสต์ (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
ข้อดีของลิงก์ลิสต์ 1. เป็นโครงสร้างที่ง่ายต่อการเพิ่มหรือลบข้อมูล 2. ไม่จำเป็นต้องขยับอิลิเมนต์ของลิสต์ไปข้างหน้าเพื่อให้เกิดพื้นที่ว่าง ในกรณีที่มีการลบอิลิเมนต์ตรงส่วนหน้าหรือส่วนกลางของลิสต์เช่นเดียวกับอาร์เรย์ 3. ใช้พื้นที่หน่วยความจำได้เต็มประสิทธิภาพ เนื่องจากหากข้อมูลภายในลิสต์มีน้อยก็ใช้น้อยซึ่งผิดกับอาร์เรย์ที่สูญเสียพื้นที่ไปในทันที ถึงแม้จะไม่มีข้อมูลภายในลิสต์ก็ตาม วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
4 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) ฟังก์ชันการดำเนินการงานบนลิงก์ลิสต์มี 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