1 / 71

Linked Lists

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

Télécharger la présentation

Linked Lists

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linked Lists บทที่ 4 รายการเชื่อมโยงข้อมูล

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

  3. หัวข้อที่บรรยาย • แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น • การดำเนินงานพื้นฐานของลิสต์ • แนวคิดของลิงก์ลิสต์ • ลิงก์ลิสต์คืออะไร • ประเภทของลิงก์ลิสต์ • โครงสร้างข้อมูลแบบลิงก์ลิสต์

  4. หัวข้อที่บรรยาย(ต่อ) • คุณสมบัติของลิงก์ลิสต์ • อัลกอริทึมของลิงก์ลิสต์ • ลิงก์ลิสต์ชนิดอื่นๆ • ตัวอย่างการสร้างลิงก์ลิสต์ • การนำลิงก์ลิสต์ไปประยุกต์ใช้งาน

  5. ลิสต์ (Lists) หรือ รายการ

  6. แนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้นแนวคิดพื้นฐานเกี่ยวกับลิสต์แบบเชิงเส้น • คุณสมบัติเรียงลำดับของข้อมูลภายในลิสต์ที่มีลักษณะเป็นลำดับต่อเนื่องกัน • สมาชิกแต่ละตัวจะเชื่อมโยงกับสมาชิกตัวถัดไปในลักษณะเป็นรายการต่อเนื่องกันไป

  7. ลิสต์แบบทั่วไป • สามารถแทรกหรือลบรายการลิสต์ ณ ตำแหน่งใดๆ ก็ได้ โดยปราศจากข้อจำกัดในการดำเนินงานภายในลิสต์ • แบ่งได้ 2 ประเภท • ลิสต์แบบสุ่ม ซึ่งข้อมูลภายในลิสต์จะไม่เรียงลำดับ • ลิสต์แบบเรียงลำดับ ข้อมูลภายในลิสต์ถูกจัดเรียงอย่างเหมาะสมด้วยคีย์

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

  9. การดำเนินงานพื้นฐานของลิสต์การดำเนินงานพื้นฐานของลิสต์ • การแทรก (Insertion) • การลบ (Deletion) • การอ่าน (Retrieval) • การท่องเข้าไปในลิสต์ (Traversal)

  10. การแทรก • ยกตัวอย่างการแทรกลิสต์แบบเรียงลำดับ จะใช้คีย์เป็นตัวระบุข้อมูล

  11. การลบ • การลบสมาชิกจะทำการค้นหาตำแหน่งข้อมูลที่ต้องการลบ เมื่อพบจึงนำสมาชิกตำแหน่งนั้นออกจากลิสต์

  12. การอ่าน • ต้องทำการค้นหาตำแหน่งข้อมูลที่ต้องการอ่านจากนั้นจึงทำการอ่านหรือดึงข้อมูลออกมาใช้งานโดยไม่มีการเปลี่ยนแปงข้อมูลภายในลิสต์

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

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

  15. อาร์เรย์ VS ลิงก์ลิสต์

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

  17. โครงสร้างข้อมูลแบบลิงก์ลิสต์โครงสร้างข้อมูลแบบลิงก์ลิสต์ • โครงสร้างโหนดส่วนหัว • โครงสร้างโหนดข้อมูล

  18. โครงสร้างโหนดส่วนหัว • มีหนึ่งพอยน์เตอร์ที่ชี้ไปยังลิสต์ คือ เฮดพอยน์เตอร์ • เกิดขึ้นหลังจากที่ได้ Create List ขึ้นมา • บรรจุข้อมูลที่เกี่ยวกับลิสต์ เรียกว่า Metadata

  19. โครงสร้างโหนดข้อมูล • ประกอบด้วยส่วนข้อมูลและลิงก์ • ชนิดข้อมูลของลิสต์จะขึ้นอยู่กับการนำไปประยุกต์ใช้

  20. คุณสมบัติของลิงก์ลิสต์คุณสมบัติของลิงก์ลิสต์ • ลิงก์ลิสต์จะใช้เฮดพอยน์เตอร์ชี้ไปยังโหนดแรกของลิสต์ ในขณะที่พอยน์เตอร์หรือลิงก์ของแต่ละโหนดจะเชื่อมโยงลิงก์ไปยังโหนดตัวถัดไป โดยโหนดตัวสุดท้ายที่ไม่มีลิงก์ให้เชื่อมต่อจะถูกกำหนดค่าให้เป็น null • โหนดข้อมูลจะประกอบด้วย Data และ Link • ไม่มีความสัมพันธ์ทางกายภาพระหว่างโหนด • ข้อมูลที่จัดเก็บภายในหน่วยความจำไม่จำเป็นต้องอยู่ติดกัน • กรณีเฮดพอยน์เตอร์ไม่มีตัวชี้หรือไม่มีสมาชิก จะถูกกำหนดเป็น null คือลิสต์ว่างนั่นเอง

  21. การสร้างลิสต์ด้วยลิงก์ลิสต์การสร้างลิสต์ด้วยลิงก์ลิสต์ • ลิงก์ลิสต์จัดเป็นโครงสร้างที่ง่ายต่อการเพิ่มและลบข้อมูล ไม่ว่าจะกระทำที่ส่วนหน้า ส่วนหลัง หรือส่วนกลางของข้อมูล

  22. การเพิ่มและลบข้อมูลภายในลิงก์ลิสต์การเพิ่มและลบข้อมูลภายในลิงก์ลิสต์

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

  24. อัลกอริทึมของลิงก์ลิสต์อัลกอริทึมของลิงก์ลิสต์ • การสร้างลิสต์ (Create List) • การเพิ่มข้อมูลลงในลิงก์ลิสต์ (Insert Node) • การลบข้อมูลออกจากลิงก์ลิสต์ (Delete Node) • การค้นหาข้อมูลในลิงก์ลิสต์ (Search List) • การดึงข้อมูลจากลิงก์ลิสต์ (Retrieve Node) • ลิสต์ว่าง (Empty List) • ลิสต์เต็ม (Full List) • จำนวนสมาชิกในลิสต์ (List Count) • การท่องเข้าไปในลิสต์ (Traverse List) • การยกเลิกการใช้งานลิสต์ (Destroy List)

  25. การสร้างลิสต์ (Create List) • เป็นฟังก์ชั่นการกำหนดโครงสร้างโหนดส่วนหัว และกำหนดค่าเริ่มต้นให้กับ Metadata สำหรับลิสต์

  26. อัลกอริทึมการสร้างลิสต์อัลกอริทึมการสร้างลิสต์ 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

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

  28. การแทรกโหนดมี 4 รูปแบบ • การแทรกโหนดในลิสต์ว่าง • การแทรกโหนดที่ตำแหน่งแรก • การแทรกโหนดตรงส่วนกลางของลิสต์ • การแทรกโหนดที่ท้ายลิสต์

  29. การแทรกโหนดในลิสต์ว่างการแทรกโหนดในลิสต์ว่าง

  30. การแทรกโหนดที่ตำแหน่งแรกการแทรกโหนดที่ตำแหน่งแรก

  31. การแทรกโหนดตรงส่วนกลางของลิสต์การแทรกโหนดตรงส่วนกลางของลิสต์

  32. การแทรกโหนดที่ท้ายลิสต์การแทรกโหนดที่ท้ายลิสต์

  33. อัลกอริทึมการแทรกโหนดอัลกอริทึมการแทรกโหนด 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

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

  35. การลบโหนดมี 2 รูปแบบ • การลบโหนดที่ตำแหน่งแรก • การลบโหนดโดยทั่วไป

  36. การลบโหนดที่ตำแหน่งแรกการลบโหนดที่ตำแหน่งแรก

  37. การลบโหนดโดยทั่วไป

  38. อัลกอริทึมการลบโหนด 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

  39. การค้นหาข้อมูลในลิงก์ลิสต์ (Search List) • เป็นฟังก์ชั่นที่ใช้สำหรับค้นหาข้อมูลภายในลิสต์ • สามารถค้นพบได้จากอัลกอริทึมที่ใช้งานรูปแบบต่างๆ เช่น การแทรกโหนด การลบโหนด การดึงข้อมูล • ใช้วิธีการค้นหาข้อมูลแบบ Sequential Search หรือเรียกอีกอย่างหนึ่งว่า Ordered List Search • หลักการค้นหาข้อมูลจะใช้คีย์เป็นตัวค้นหา data key field1 field2 : fieldN end data

  40. ตารางแสดงผลลัพธ์การค้นหาข้อมูลภายในลิสต์ตารางแสดงผลลัพธ์การค้นหาข้อมูลภายในลิสต์

  41. ตัวอย่างการค้นหาข้อมูลในลิสต์แบบเรียงลำดับตัวอย่างการค้นหาข้อมูลในลิสต์แบบเรียงลำดับ

  42. อัลกอริทึมการค้นหาข้อมูลอัลกอริทึมการค้นหาข้อมูล 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

  43. อัลกอริทึมการค้นหาข้อมูล(ต่อ)อัลกอริทึมการค้นหาข้อมูล(ต่อ) 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

  44. การดึงข้อมูลจากลิงก์ลิสต์ (Retrieve Node) • เป็นการดึงข้อมูลออกจากโหนดเพื่อนำออกมาใช้งาน • เริ่มต้นด้วยการค้นหาโหนดจากตำแหน่งข้อมูลที่ต้องการ • ถ้าพบจะทำการเคลื่อนย้ายข้อมูลไปยังพื้นที่เอาต์พุตในส่วนของโมดูลที่เรียกใช้งาน และรีเทิร์นค่าตรรกะเป็นจริง • ถ้าไม่พบก็จะรีเทิร์นค่าตรรกะเป็นเท็จกลับไป

  45. อัลกอริทึมการดึงข้อมูลอัลกอริทึมการดึงข้อมูล 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

  46. ลิสต์ว่าง (Empty List) • เป็นฟังก์ชั่นที่ใช้ตรวจสอบว่าภายในลิสต์ว่างหรือไม่ • เป็นโมดูลแบบง่ายที่รีเทิร์นค่าตรรกะ ณ ขณะนั้นกลับไป • รีเทิร์นค่าตรรกะเป็นจริงกลับไปเมื่อลิสต์ว่างในทางตรงกันข้ามก็จะรีเทิร์นค่าตรรกะเท็จกลับไป

  47. อัลกอริทึมลิสต์ว่าง 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

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

  49. อัลกอริทึมลิสต์เต็ม 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

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

More Related