710 likes | 863 Views
Linked Lists. บทที่ 4 รายการเชื่อมโยงข้อมูล. วัตถุประสงค์เพื่อ. เข้าใจหลักการและแนวคิดของลิสต์แบบเชิงเส้น อธิบายการดำเนินงานพื้นฐานของลิสต์ได้ เปรียบเทียบโครงสร้างการทำงานระหว่างอาร์เรย์กับลิงก์ลิสต์ได้ อธิบายโครงสร้างข้อมูลแบบลิงก์ลิสต์ได้
E N D
Linked Lists บทที่ 4 รายการเชื่อมโยงข้อมูล
วัตถุประสงค์เพื่อ • เข้าใจหลักการและแนวคิดของลิสต์แบบเชิงเส้น • อธิบายการดำเนินงานพื้นฐานของลิสต์ได้ • เปรียบเทียบโครงสร้างการทำงานระหว่างอาร์เรย์กับลิงก์ลิสต์ได้ • อธิบายโครงสร้างข้อมูลแบบลิงก์ลิสต์ได้ • เข้าใจขั้นตอนการทำงานของอัลกอริทึมต่างๆ ที่ใช้งานบนลิงก์ลิสต์ • บอกคุณสมบัติเพิ่มเติมของเซอร์คูลาร์ลิงก์ลิสต์ ดับเบิลลิงก์ลิสต์ เมือเทียบกับซิงเกิลลิงก์ลิสต์ได้ • สามารถนำเทคนิควิธีการของลิงก์ลิสต์นำไปประยุกต์ใช้งานได้อย่างเหมาะสม
หัวข้อที่บรรยาย • แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น • การดำเนินงานพื้นฐานของลิสต์ • แนวคิดของลิงก์ลิสต์ • ลิงก์ลิสต์คืออะไร • ประเภทของลิงก์ลิสต์ • โครงสร้างข้อมูลแบบลิงก์ลิสต์
หัวข้อที่บรรยาย(ต่อ) • คุณสมบัติของลิงก์ลิสต์ • อัลกอริทึมของลิงก์ลิสต์ • ลิงก์ลิสต์ชนิดอื่นๆ • ตัวอย่างการสร้างลิงก์ลิสต์ • การนำลิงก์ลิสต์ไปประยุกต์ใช้งาน
แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้นแนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น • คุณสมบัติเรียงลำดับของข้อมูลภายในลิสต์ที่มีลักษณะเป็นลำดับต่อเนื่องกัน • สมาชิกแต่ละตัวจะเชื่อมโยงกับสมาชิกตัวถัดไปในลักษณะเป็นรายการต่อเนื่องกันไป
ลิสต์แบบทั่วไป • สามารถแทรกหรือลบรายการลิสต์ ณ ตำแหน่งใดๆ ก็ได้ โดยปราศจากข้อจำกัดในการดำเนินงานภายในลิสต์ • แบ่งได้ 2 ประเภท • ลิสต์แบบสุ่ม ซึ่งข้อมูลภายในลิสต์จะไม่เรียงลำดับ • ลิสต์แบบเรียงลำดับ ข้อมูลภายในลิสต์ถูกจัดเรียงอย่างเหมาะสมด้วยคีย์
ลิสต์แบบมีข้อจำกัด • ข้อมูลภายในลิสต์แบบมีข้อจำกัด ไม่ว่าจะเพิ่มหรือลบข้อมูลจะต้องกระทำที่จุดปลายด้านใดด้านหนึ่งของลิสต์เท่านั้น • ตัวอย่างของลิสต์ประเภทนี้ คือ FIFO, LIFO
การดำเนินงานพื้นฐานของลิสต์การดำเนินงานพื้นฐานของลิสต์ • การแทรก (Insertion) • การลบ (Deletion) • การอ่าน (Retrieval) • การท่องเข้าไปในลิสต์ (Traversal)
การแทรก • ยกตัวอย่างการแทรกลิสต์แบบเรียงลำดับ จะใช้คีย์เป็นตัวระบุข้อมูล
การลบ • การลบสมาชิกจะทำการค้นหาตำแหน่งข้อมูลที่ต้องการลบ เมื่อพบจึงนำสมาชิกตำแหน่งนั้นออกจากลิสต์
การอ่าน • ต้องทำการค้นหาตำแหน่งข้อมูลที่ต้องการอ่านจากนั้นจึงทำการอ่านหรือดึงข้อมูลออกมาใช้งานโดยไม่มีการเปลี่ยนแปงข้อมูลภายในลิสต์
การท่องเข้าไปในลิสต์ • จะทำการเดินท่องเข้าไปยังแต่ละสมาชิกตามลำดับภายในลิสต์ ซึ่งมักใช้อัลกอริทึมแบบลูปในการท่องเข้าไปในลิสต์มากกว่าที่ดำเนินการด้วยวิธีการค้นหา • สำหรับการประมวลผลในแต่ละสมาชิกภายในลูป จะดำเนินการจนกระทั่งออกจากลูป นั่นหมายความว่าทุกๆ สมาชิกภายในลิสต์ได้ถูกประมวลผลเรียบร้อยแล้ว
แนวคิดของลิงก์ลิสต์ • ทั้งอาร์เรย์และลิงก์ลิสต์มีคุณสมบัติเป็นรายการต่อเนื่องหรือลิสต์นั่นเอง • ข้อมูลภายในหน่วยความจำของลิงก์ลิสต์จะไม่ได้อยู่ในลำดับต่อเนื่องเหมือนกับอาร์เรย์ แต่จะถูกเชื่อมโยงด้วยลิงก์หรือพอยน์เตอร์ • สมาชิกภายในลิงก์ลิสต์แต่ละตัวจะบรรจุแอดเดรสเพื่อชี้ไปยังตำแหน่งโหนดตัวถัดไปซึ่งแต่ละโหนดจะบรรจุข้อมูล 2 ส่วน คือ • ข้อมูล (Data) จัดเก็บสารสนเทศที่สามารถนำไปใช้ประโยชน์ • ลิงก์ (Link) ใช้สำหรับเชื่อมโยงข้อมูล เริ่มจากเฮดพอยน์เตอร์ชี้ไปยังตำแหน่งโหนดแรกของลิสต์ จากนั้นลิงก์แต่ละโหนดก็จะเชื่อมโยงไปยังโหนดต่อไป
ตัวอย่างการแทนที่ลิงก์ลิสต์ในหน่วยความจำตัวอย่างการแทนที่ลิงก์ลิสต์ในหน่วยความจำ
โครงสร้างข้อมูลแบบลิงก์ลิสต์โครงสร้างข้อมูลแบบลิงก์ลิสต์ • โครงสร้างโหนดส่วนหัว • โครงสร้างโหนดข้อมูล
โครงสร้างโหนดส่วนหัว • มีหนึ่งพอยน์เตอร์ที่ชี้ไปยังลิสต์ คือ เฮดพอยน์เตอร์ • เกิดขึ้นหลังจากที่ได้ Create List ขึ้นมา • บรรจุข้อมูลที่เกี่ยวกับลิสต์ เรียกว่า Metadata
โครงสร้างโหนดข้อมูล • ประกอบด้วยส่วนข้อมูลและลิงก์ • ชนิดข้อมูลของลิสต์จะขึ้นอยู่กับการนำไปประยุกต์ใช้
คุณสมบัติของลิงก์ลิสต์คุณสมบัติของลิงก์ลิสต์ • ลิงก์ลิสต์จะใช้เฮดพอยน์เตอร์ชี้ไปยังโหนดแรกของลิสต์ ในขณะที่พอยน์เตอร์หรือลิงก์ของแต่ละโหนดจะเชื่อมโยงลิงก์ไปยังโหนดตัวถัดไป โดยโหนดตัวสุดท้ายที่ไม่มีลิงก์ให้เชื่อมต่อจะถูกกำหนดค่าให้เป็น null • โหนดข้อมูลจะประกอบด้วย Data และ Link • ไม่มีความสัมพันธ์ทางกายภาพระหว่างโหนด • ข้อมูลที่จัดเก็บภายในหน่วยความจำไม่จำเป็นต้องอยู่ติดกัน • กรณีเฮดพอยน์เตอร์ไม่มีตัวชี้หรือไม่มีสมาชิก จะถูกกำหนดเป็น null คือลิสต์ว่างนั่นเอง
การสร้างลิสต์ด้วยลิงก์ลิสต์การสร้างลิสต์ด้วยลิงก์ลิสต์ • ลิงก์ลิสต์จัดเป็นโครงสร้างที่ง่ายต่อการเพิ่มและลบข้อมูล ไม่ว่าจะกระทำที่ส่วนหน้า ส่วนหลัง หรือส่วนกลางของข้อมูล
การเพิ่มและลบข้อมูลภายในลิงก์ลิสต์การเพิ่มและลบข้อมูลภายในลิงก์ลิสต์
ข้อดีของลิงก์ลิสต์ • เป็นโครงสร้างที่ง่ายต่อการเพิ่มหรือลบข้อมูล • ไม่จำเป็นต้องขยับอิลิเมนต์ของลิสต์ไปข้างหน้าเพื่อให้เกิดพื้นที่ว่าง ในกรณีที่มีการลบอิลิเมนต์ตรงส่วนหน้าหรือส่วนกลางของลิสต์เช่นเดียวกับอาร์เรย์ • ใช้พื้นที่เนื้อที่หน่วยความจำได้เต็มประสิทธิภาพ เนื่องจากหากข้อมูลภายในลิสต์มีน้อยก็ใช้น้อย ซึ่งผิดกับอาร์เรย์ที่ต้องสูญเสียพื้นที่ไปในทันที ถึงแม้จะไม่มีข้อมูลภายในลิสต์ก็ตาม
อัลกอริทึมของลิงก์ลิสต์อัลกอริทึมของลิงก์ลิสต์ • การสร้างลิสต์ (Create List) • การเพิ่มข้อมูลลงในลิงก์ลิสต์ (Insert Node) • การลบข้อมูลออกจากลิงก์ลิสต์ (Delete Node) • การค้นหาข้อมูลในลิงก์ลิสต์ (Search List) • การดึงข้อมูลจากลิงก์ลิสต์ (Retrieve Node) • ลิสต์ว่าง (Empty List) • ลิสต์เต็ม (Full List) • จำนวนสมาชิกในลิสต์ (List Count) • การท่องเข้าไปในลิสต์ (Traverse List) • การยกเลิกการใช้งานลิสต์ (Destroy List)
การสร้างลิสต์ (Create List) • เป็นฟังก์ชั่นการกำหนดโครงสร้างโหนดส่วนหัว และกำหนดค่าเริ่มต้นให้กับ Metadata สำหรับลิสต์
อัลกอริทึมการสร้างลิสต์อัลกอริทึมการสร้างลิสต์ Algorithm createList (list) Initializes metedata for list. Pre list is metadata structure passed by reference Post metedata initialized • allocate (list) • set list head to null • set list count to 0 end createList
การเพิ่มข้อมูลลงในลิงก์ลิสต์ (Insert Node) • เป็นฟังก์ชั่นสำหรับแทรกโหนดเพิ่มเข้าไปในลิสต์ • ต้องรู้ว่าโหนดก่อนหน้า (Predecessor) ของโหนดใหม่ที่แทรกคือโหนดใด หลังจากนั้นทำการแทรกข้อมูลเพิ่มตามขั้นตอนดังนี้ • จัดสรรหน่วยความจำสำหรับโหนดใหม่พร้อมกับข้อมูล • กำหนดตัวชี้ให้กับลิงก์ฟิลด์ของโหนดใหม่ • นำตัวชี้ที่อยู่ก่อนหน้าโหนดใหม่ชี้มายังโหนดใหม่ • ลิงก์ของโหนดใหม่จะชี้ไปยังโหนดข้างหลัง (Successor)
การแทรกโหนดมี 4 รูปแบบ • การแทรกโหนดในลิสต์ว่าง • การแทรกโหนดที่ตำแหน่งแรก • การแทรกโหนดตรงส่วนกลางของลิสต์ • การแทรกโหนดที่ท้ายลิสต์
การแทรกโหนดในลิสต์ว่างการแทรกโหนดในลิสต์ว่าง
การแทรกโหนดที่ตำแหน่งแรกการแทรกโหนดที่ตำแหน่งแรก
การแทรกโหนดตรงส่วนกลางของลิสต์การแทรกโหนดตรงส่วนกลางของลิสต์
การแทรกโหนดที่ท้ายลิสต์การแทรกโหนดที่ท้ายลิสต์
อัลกอริทึมการแทรกโหนดอัลกอริทึมการแทรกโหนด Algorithm insertNode (list, pPre, dataIn) Inserts data into a new node in the list. Prelist is metadata 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 1 allocate (pNew) 2 set pNew data to dataIn 3 if (pPre null) Adding before first node or to empty list. 1 set pNew link to list head 2 set list head to pNew 4 else Adding in middle or at end. 1 set pNew link to pPre link 2 set pPre link to pNew 5 end if 6 return true end insertnode
การลบข้อมูลออกจากลิงก์ลิสต์ (Delete Node) • เป็นการนำพื้นที่โหนดที่ถูกลบส่งคืนแก่หน่วยความจำระบบ • ปรับเปลี่ยนตัวชี้ใหม่ • ขั้นตอนการลบโหนดมีดังนี้ • ค้นหาตำแหน่งของโหนดที่ต้องการลบ (pLoc) ให้พบก่อน • ทำให้ทราบตำแหน่งของ Predecessor (pPre) • กำหนดลิงก์ฟิลด์ของโหนด Predecessor ชี้ไปยังโหนด Successor ซึ่งเป็นโหนดที่อยู่ด้านหลังของโหนดที่ถูกลบ • คืนพื้นที่หน่วยจำแก่ระบบ
การลบโหนดมี 2 รูปแบบ • การลบโหนดที่ตำแหน่งแรก • การลบโหนดโดยทั่วไป
การลบโหนดที่ตำแหน่งแรกการลบโหนดที่ตำแหน่งแรก
อัลกอริทึมการลบโหนด Algorithm deleteNode (list, pPre, pLoc, dataOut) Delete data from list & returns it to calling module. Pre list is metadata structure to a valid list pPre is pointer to predecessor node pLoc is a pointer to predecessor node pLoc is a pointer to node to be deleted dataOut is variable to receive deleted data Post data have been deleted and returned to caller 1 move pLoc data to dataOut 2 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 4 end if 5 recycle (pLoc) end deleteNode
การค้นหาข้อมูลในลิงก์ลิสต์ (Search List) • เป็นฟังก์ชั่นที่ใช้สำหรับค้นหาข้อมูลภายในลิสต์ • สามารถค้นพบได้จากอัลกอริทึมที่ใช้งานรูปแบบต่างๆ เช่น การแทรกโหนด การลบโหนด การดึงข้อมูล • ใช้วิธีการค้นหาข้อมูลแบบ Sequential Search หรือเรียกอีกอย่างหนึ่งว่า Ordered List Search • หลักการค้นหาข้อมูลจะใช้คีย์เป็นตัวค้นหา data key field1 field2 : fieldN end data
ตารางแสดงผลลัพธ์การค้นหาข้อมูลภายในลิสต์ตารางแสดงผลลัพธ์การค้นหาข้อมูลภายในลิสต์
ตัวอย่างการค้นหาข้อมูลในลิสต์แบบเรียงลำดับตัวอย่างการค้นหาข้อมูลในลิสต์แบบเรียงลำดับ
อัลกอริทึมการค้นหาข้อมูลอัลกอริทึมการค้นหาข้อมูล Algorithm searchList (list, pPre, pLoc, target) Searches list and passes back address of node containing target and its logical predecessor. Pre list is metadata structure to a valid list pPre is pointer variable for predecessor pLoc is pointer variable for current node target is the key being sought Post pLoc points to first node with equal / greather key –or- null if target > key of last node pPre points to largest node smaller than key -or- null if target < key of first node Return true if found, false if not found
อัลกอริทึมการค้นหาข้อมูล(ต่อ)อัลกอริทึมการค้นหาข้อมูล(ต่อ) 1 set pPre to null 2 set pLoc to list head 3 loop (pLoc not null AND target > pLoc key) 1 set pPre to pLoc 2 set pLoc to pLoc link 4 end loop 5 if (pLoc null) set return value 1 set found to false 6 else 1 if (target equal pLoc key) 1 set found to true 2 else 1 set found to false 3 end if 7 end if 8 return found end searchList
การดึงข้อมูลจากลิงก์ลิสต์ (Retrieve Node) • เป็นการดึงข้อมูลออกจากโหนดเพื่อนำออกมาใช้งาน • เริ่มต้นด้วยการค้นหาโหนดจากตำแหน่งข้อมูลที่ต้องการ • ถ้าพบจะทำการเคลื่อนย้ายข้อมูลไปยังพื้นที่เอาต์พุตในส่วนของโมดูลที่เรียกใช้งาน และรีเทิร์นค่าตรรกะเป็นจริง • ถ้าไม่พบก็จะรีเทิร์นค่าตรรกะเป็นเท็จกลับไป
อัลกอริทึมการดึงข้อมูลอัลกอริทึมการดึงข้อมูล Algorithm retrieveNode (list, key, dataOut) Retrieves data from a list. Pre list is metadata structure to a valid list Key is target of data to be retrieved dataOut is variable to receive data Post data placed in dataOut -or- error returned if not found Return true if successful, false if data not found 1 set found to searchList (list, pPre, pLoc, key) 2 if (found) 1 move pLoc data to dataOut 3 end if 4 return found end retrieveNode
ลิสต์ว่าง (Empty List) • เป็นฟังก์ชั่นที่ใช้ตรวจสอบว่าภายในลิสต์ว่างหรือไม่ • เป็นโมดูลแบบง่ายที่รีเทิร์นค่าตรรกะ ณ ขณะนั้นกลับไป • รีเทิร์นค่าตรรกะเป็นจริงกลับไปเมื่อลิสต์ว่างในทางตรงกันข้ามก็จะรีเทิร์นค่าตรรกะเท็จกลับไป
อัลกอริทึมลิสต์ว่าง Algorithm emptyList (list) Return Boolean indicating whether the list is empty. Pre list is metadata structure to a valid list Return true if list empty, false if list contains data 1 if (list count equal 0) 1 return true 2 else 1 return false end emptyList
ลิสต์เต็ม (Full List) • เป็นฟังก์ชั่นที่ใช้ตรวจสอบว่าภายในลิสต์นั้นเต็มหรือไม่ • จัดเป็นโมดูลแบบง่ายเช่นกัน ด้วยการรีเทิร์นค่าตรรกะในขณะนั้นกลับไป • แต่บางทีอาจไม่จำเป็นต้องใช้ โดยเฉพาะในภาษา C เนื่องจากลิงก์ลิสต์ใช้หน่วยความจำแบบไดนามิก
อัลกอริทึมลิสต์เต็ม Algorithm fullList (list) Returns Boolean indicating whether or not the list is full. Pre list is metadata structure to a valid list Return false if room for new node; true if memory full 1 if (memory full) 1 return true 2 else 1 return false 3 end if 4 return true end fullList
จำนวนสมาชิกในลิสต์ (List Count) • เป็นฟังก์ชั่นที่ภายในโมดูลจะมีเพียงประโยคคำสั่งเดียวเท่านั้น • แจ้งจำนวนสมาชิกหรือจำนวนอิลิเมนต์ที่มีอยู่ในขณะนั้นให้กับโมดูลที่เรียก