Transcript ลิสต์
Linked Lists บทที่ 4 รายการเชื่อมโยงข้ อมูล วัตถุประสงค์ เพือ่ • • • • • • เข้ าใจหลักการและแนวคิดของลิสต์แบบเชิงเส้ น อธิบายการดาเนินงานพื ้นฐานของลิสต์ได้ เปรี ยบเทียบโครงสร้ างการทางานระหว่างอาร์ เรย์กบั ลิงก์ลสิ ต์ได้ อธิบายโครงสร้ างข้ อมูลแบบลิงก์ลสิ ต์ได้ เข้ าใจขันตอนการท ้ างานของอัลกอริ ทมึ ต่างๆ ที่ใช้ งานบนลิงก์ลสิ ต์ บอกคุณสมบัตเิ พิ่มเติมของเซอร์ คลู าร์ ลงิ ก์ลสิ ต์ ดับเบิลลิงก์ลิสต์ เมือเทียบกับ ซิงเกิลลิงก์ลสิ ต์ได้ • สามารถนาเทคนิควิธีการของลิงก์ลสิ ต์นาไปประยุกต์ใช้ งานได้ อย่างเหมาะสม หัวข้ อที่บรรยาย • • • • • • แนวคิดพื ้นฐานเกี่ยวกับลิสต์แบบเชิงเส้ น การดาเนินงานพื ้นฐานของลิสต์ แนวคิดของลิงก์ลสิ ต์ ลิงก์ลสิ ต์คืออะไร ประเภทของลิงก์ลสิ ต์ โครงสร้ างข้ อมูลแบบลิงก์ลสิ ต์ หัวข้ อที่บรรยาย (ต่ อ) • • • • • คุณสมบัติของลิงก์ลสิ ต์ อัลกอริทมึ ของลิงก์ลสิ ต์ ลิงก์ลสิ ต์ชนิดอื่นๆ ตัวอย่างการสร้ างลิงก์ลสิ ต์ การนาลิงก์ลสิ ต์ไปประยุกต์ใช้ งาน ลิสต์ (Lists) หรือ รายการ แนวคิดพืน้ ฐานเกีย่ วกับลิสต์ แบบเชิงเส้ น • คุณสมบัติเรี ยงลาดับของข้ อมูลภายในลิสต์ที่มีลกั ษณะเป็ นลาดับ ต่อเนื่องกัน • สมาชิกแต่ละตัวจะเชื่อมโยงกับสมาชิกตัวถัดไปในลักษณะเป็ นรายการ ต่อเนื่องกันไป ลิสต์ แบบทั่วไป • สามารถแทรกหรื อลบรายการลิสต์ ณ ตาแหน่งใดๆ ก็ได้ โดยปราศจาก ข้ อจากัดในการดาเนินงานภายในลิสต์ • แบ่งได้ 2 ประเภท – ลิสต์แบบสุม่ ซึง่ ข้ อมูลภายในลิสต์จะไม่เรี ยงลาดับ – ลิสต์แบบเรี ยงลาดับ ข้ อมูลภายในลิสต์ถกู จัดเรี ยงอย่างเหมาะสมด้ วยคีย์ ลิสต์ แบบมีข้อจากัด • ข้ อมูลภายในลิสต์แบบมีข้อจากัด ไม่วา่ จะเพิ่มหรื อลบข้ อมูลจะต้ อง กระทาที่จดุ ปลายด้ านใดด้ านหนึง่ ของลิสต์เท่านัน้ • ตัวอย่างของลิสต์ประเภทนี ้ คือ FIFO, LIFO การดาเนินงานพืน้ ฐานของลิสต์ • • • • การแทรก (Insertion) การลบ (Deletion) การอ่าน (Retrieval) การท่องเข้ าไปในลิสต์ (Traversal) การแทรก • ยกตัวอย่างการแทรกลิสต์แบบเรี ยงลาดับ จะใช้ คีย์เป็ นตัวระบุข้อมูล การลบ • การลบสมาชิกจะทาการค้ นหาตาแหน่งข้ อมูลที่ต้องการลบ เมือ่ พบจึง นาสมาชิกตาแหน่งนันออกจากลิ ้ สต์ การอ่ าน • ต้ องทาการค้ นหาตาแหน่งข้ อมูลที่ต้องการอ่านจากนันจึ ้ งทาการอ่าน หรื อดึงข้ อมูลออกมาใช้ งานโดยไม่มีการเปลี่ยนแปงข้ อมูลภายในลิสต์ การท่ องเข้ าไปในลิสต์ • จะทาการเดินท่องเข้ าไปยังแต่ละสมาชิกตามลาดับภายในลิสต์ ซึง่ มักใช้ อัลกอริทมึ แบบลูปในการท่องเข้ าไปในลิสต์มากกว่าที่ดาเนินการด้ วย วิธีการค้ นหา • สาหรับการประมวลผลในแต่ละสมาชิกภายในลูป จะดาเนินการ จนกระทัง่ ออกจากลูป นัน่ หมายความว่าทุกๆ สมาชิกภายในลิสต์ได้ ถกู ประมวลผลเรี ยบร้ อยแล้ ว แนวคิดของลิงก์ ลสิ ต์ • ทังอาร์ ้ เรย์และลิงก์ลสิ ต์มีคณ ุ สมบัติเป็ นรายการต่อเนื่องหรื อลิสต์นนั่ เอง • ข้ อมูลภายในหน่วยความจาของลิงก์ลสิ ต์จะไม่ได้ อยูใ่ นลาดับต่อเนื่อง เหมือนกับอาร์ เรย์ แต่จะถูกเชื่อมโยงด้ วยลิงก์หรื อพอยน์เตอร์ • สมาชิกภายในลิงก์ลสิ ต์แต่ละตัวจะบรรจุแอดเดรสเพื่อชี ้ไปยังตาแหน่ง โหนดตัวถัดไปซึง่ แต่ละโหนดจะบรรจุข้อมูล 2 ส่วน คือ – ข้ อมูล (Data) จัดเก็บสารสนเทศที่สามารถนาไปใช้ ประโยชน์ – ลิงก์ (Link) ใช้ สาหรับเชื่อมโยงข้ อมูล เริ่มจากเฮดพอยน์เตอร์ ชี ้ไปยัง ตาแหน่งโหนดแรกของลิสต์ จากนันลิ ้ งก์แต่ละโหนดก็จะเชื่อมโยงไปยังโหนด ต่อไป อาร์ เรย์ VS ลิงก์ ลสิ ต์ ตัวอย่ างการแทนที่ลงิ ก์ลสิ ต์ ในหน่ วยความจา โครงสร้ างข้ อมูลแบบลิงก์ ลสิ ต์ • โครงสร้ างโหนดส่วนหัว • โครงสร้ างโหนดข้ อมูล โครงสร้ างโหนดส่ วนหัว • มีหนึง่ พอยน์เตอร์ ที่ชี ้ไปยังลิสต์ คือ เฮดพอยน์เตอร์ • เกิดขึ ้นหลังจากที่ได้ 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 1 allocate (list) 2 set list head to null 3 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. Pre list 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 ตารางแสดงผลลัพธ์ การค้ นหาข้ อมูลภายในลิสต์ เงื่อนไข ตาแหน่ งตัวก่ อนหน้ า ตาแหน่ งที่ค้นหา รีเทิร์นค่ า (Conditions) (pPre) (pLoc) (Return) Target < first node Null First node False Target = first node Null First node True First < target < last Lastest node < target First node > target False Target = middle node Node’s predecessor Equal node True Target = last node Last’s predecessor Last node True Target > last node Last node Null False ตัวอย่ างการค้ นหาข้ อมูลในลิสต์ แบบเรียงลาดับ อัลกอริทมึ การค้ นหาข้ อมูล 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) • เป็ นฟั งก์ชนั่ ที่ภายในโมดูลจะมีเพียงประโยคคาสัง่ เดียวเท่านัน้ • แจ้ งจานวนสมาชิกหรื อจานวนอิลเิ มนต์ที่มีอยูใ่ นขณะนันให้ ้ กบั โมดูลที่ เรี ยก อัลกอริทึมจานวนสมาชิกในลิสต์ Algorithm listCount (list) Returns integer representing number of nodes in list. Pre list is metadata structure to a valid list Return count for number of nodes in list 1 return (list count) end listCount การท่ องเข้ าไปในลิสต์ (Traverse List) • เริ่มต้ นที่โหนดแรก และสแกนไปทีละโหนดจนกระทัง่ สิ ้นสุดทีโ่ หนด สุดท้ าย • ตรรกะของการท่องเข้ าไปในลิสต์ สามารถใช้ อลั กอริทมึ เพื่อใช้ งานได้ อย่างหลากหลาย เช่น – การเปลี่ยนแปลงค่าในแต่ละโหนด – การพิมพ์ข้อมูลภายในลิสต์ – การคานวณหาผลรวมของฟิ ลด์ภายในลิสต์ – การคานวณหาค่าเฉลี่ย การท่ องเข้ าไปในลิสต์ (Traverse List) • มีการกาหนดตัว Walking Pointer เพื่อให้ พอยน์เตอร์ นี ้เคลื่อนที่ จากโหนดไปยังโหนดในแต่ละอิลเิ มนต์ที่ได้ โปรเซส • โดยการมีการกาหนดลูปให้ กบั Walking Pointer set pWalk to list head loop (more nodes) process (pWalker data) set pWalker to next link end loop การท่ องเข้ าไปในลิสต์ (Traverse List) • เริ่มต้ นการติดตัง้ Walking Pointer ที่โหนดแรกภายในลิสต์ • ทาการประมวลผลท่องไปทีละโหนดเป็ นลาดับเรื่ อยๆ ไป จนสุดท้ าย • สามาระออกแบบวิธีการท่องเข้ าไปในลิสต์ได้ 2 วิธี – ผู้ใช้ กาหนดการควบคุมลูปด้ วยการเรี ยกใช้ ฟังก์ชนั่ เพื่อท่องไปยังอิลิเมนต์ ถัดไปภายในลิสต์ – ใช้ โมดูลการท่องเข้ าไปในลิสต์ด้วยการเรี ยกใช้ อลั กอริทมึ ที่ได้ เตรี ยมมาให้ อยู่ แล้ วมาทาการประมวลผลข้ อมูล การท่ องเข้ าไปในลิสต์ (Traverse List) ตัวอย่ างการใช้ งานการท่ องเข้ าไปในลิสต์ อัลกอริทึมการท่ องไปในลิสต์ Algorithm getNext (list, fromWhere, dataOut) Traverses a list. Each call returns the location of an element in the list. Pre list is metadata structure to a valid list fromWhere is 0 to start at this first element Post dataOut contains data and true returned -or- if end of list, returns false Return true if next element located false if end of list อัลกอริทึมการท่ องไปในลิสต์ (ต่ อ) 1 if (empty list) 1 return false 2 if (fromWhere is beginning) Start from first 1 set list pos to list head 2 move current list data to dataOut 3 return true 3 else continue from pos 1 if (end of list) End of list 1 return false 2 else 1 set list pos to next node 2 move current list data to dataOut 3 return true 3 end if 4 end if end getNext การยกเลิกการใช้ งานลิสต์ (Destroy List) • เมื่อลิสต์ไม่มีความต้ องการที่จะใช้ งานต่อไป จะถูกยกเลิกใช้ งาน โดยใช้ ฟั งก์ชนั่ Destroy List • ดาเนินการลบโหนดทุกโหนดที่ยงั คงอยูภ่ ายในลิสต์ออกไปทังหมด ้ • ส่งคืนพื ้นที่หน่วยความจาให้ กบั ระบบ อัลกอริทึมการยกเลิกการใช้ งานลิสต์ Algorithm destroyList (pList) Deletes all data in list. Pre list is metadata structure to a valid list Post all data deleted 1 loop (not at end of list) 1 set list head to successor node 2 release memory to heap 2 end loop No data left in list. Reset metadata. 3 set list pos to null 4 set list count to 0 end destroyList ลิงก์ ลสิ ต์ ชนิดอืน่ ๆ • เซอร์ คลู าร์ ลงิ ก์ลสิ ต์ (Circular-Linked List) • ดับเบิลลิงก์ลสิ ต์ (Double-Linked List) เซอร์ คูลาร์ ลงิ ก์ ลสิ ต์ (Circular-Linked List) • เป็ นลิงก์ลสิ ต์ที่จะใช้ ลงิ ก์ของโหนดสุดท้ ายเชื่อมโยงไปยังโหนดแรกของ ลิสต์ ดับเบิลลิงก์ ลสิ ต์ (Double-Linked List) • เป็ นลิงก์ลสิ ต์ที่มีความสามารถสูง • แต่ละโหนดจะประกอบไปด้ วยพอยน์เตอร์ 2 ตัว โดยตัวแรกจะชี ้ไปยังตัว ถัดไป (Successor) และอีกตัวหนึง่ จะชี ้ไปยังตัวก่อนหน้ า (Predecessor) ดับเบิลลิงก์ ลสิ ต์ (Double-Linked List) • ภายในโครงสร้ างโหนดส่วนหัว มีข้อมูล 3 ฟิ ลด์ คือ ตัวนับ ตาแหน่งเฮด พอยน์เตอร์ และพอยน์เตอร์ ฟิลด์ rear • แต่ะโหนดของดัลเบิลลิงก์ลสิ ต์จะบรรจุตวั ชี ้หรื อพอยน์เตอร์ อยู่ 2 ตัว – Backward pointer ที่ชี ้ไปยังข้ างหลัง คือ ตัวก่อนหน้ า (Predecessor) – Forward pointer จะชี ้ไปยังข้ างหน้ า คือตัวถัดไป (Successor) ตัวอย่ างการแทรกโหนดในดับเบิลลิงก์ลสิ ต์ ตัวอย่ างการแทรกโหนดในดับเบิลลิงก์ลสิ ต์ ตัวอย่ างการลบโหนดในดับเบิลลิงก์ ลสิ ต์ ตัวอย่ างการสร้ างลิงก์ ลสิ ต์ • ตัวอย่างการสร้ างคลาสที่ใช้ แทนโหนดหนึง่ ๆ ในลิงก์ลสิ ต์ (SimpleNode.java) • ตัวอย่างการสร้ างลิงก์ลสิ ต์แบบทางเดียว (SimpleLinkedList.java) • ตัวอย่างการนาลิงก์ลสิ ต์ที่สร้ างขึ ้นมาใช้ งาน (TestSimpleLinkedList.java) • สร้ างลิงก์ลสิ ต์ขึ ้นมา แล้ วนาข้ อมูลมาเก็บลงไป 5 ชุด • เนื่องจากข้ อมูลถูกเพิ่มเข้ าไปทางหัวของลิงก์ลสิ ต์ ทาให้ ข้อมูลที่เก็บอยูใ่ น ลิงก์ลสิ ต์ เรี ยงลาดับที่ตรงกันข้ าม กับการเพิ่มข้ อมูลเข้ าไป • นาข้ อมูล 6 แทรกลงในลิงก์ลิสต์ตาแหน่งถัดจากโหนดที่ 3 • ลบข้ อมูลออกทีละชุดจนกลายเป็ นลิงก์ลสิ ต์วา่ ง การนาลิงก์ ลสิ ต์ ไปประยุกต์ ใช้ งาน • ลิงก์ลสิ ต์ถกู นาไปใช้ ในการเก็บข้ อมูลที่ไม่ทราบจานวนของข้ อมูลทังหมด ้ • สามารถเพิ่มข้ อมูลเข้ าไปในโครงสร้ างข้ อมูลได้ เรื่ อยๆ • การเพิ่มหรื อลบข้ อมูลสามารถทาได้ ง่ายและรวดเร็ วโดยการกาหนดค่าตัวชี ้ ใหม่ • แต่ลงิ ก์ลสิ ต์มีข้อเสียในเรื่ องการเข้ าถึงข้ อมูล เนื่องจากต้ องอ่านข้ อมูลไป ตามลาดับทีละชุดข้ อมูล ทาให้ เมื่อมีข้อมูลจานวนมาก จะต้ องใช้ เวลา พอสมควร • ลิงก์ลสิ ต์เหมาะกับงานที่มีการเพิ่มและลบข้ อมูลอยูต่ ลอด แต่มีการเข้ ามา อ่านข้ อมูลที่เก็บไว้ น้อยครัง้ สรุปท้ ายบทที่ 4 • ลิสต์เชิงเส้ น มี 2 ประเภท คือ แบบสุม่ และแบบเรี ยงลาดับ • การดาเนินงานพื ้นฐานของลิสต์ ประกอบด้ วย การแทรก การลบ การ อ่าน การท่องเข้ าไปในลิสต์ การค้ นหาลิสต์ • เซอร์ คลู าร์ ลงิ ก์ลสิ ต์ คือ ลิงก์ฟิลด์ของโหนดสุดท้ ายจะเชื่อมโยงไปยัง โหนดแรกของลิสต์ • ดับเบิลลิงก์ลสิ ต์ แต่ละโหนดจะมีตวั ชี ้หรื อพอยน์เตอร์ 2 ตัว Any Questions ?