Linked List (ลิงค์ลิสต์)
Linked List เนื่องจากการจัดเก็บข้อมูลแบบ Array จะต้องจองเนื้อที่ทั้งหมดที่จะใช้ไว้ก่อน เช่น ต้องการจัดเก็บข้อมูลจำนวน 1,000 ค่า แต่ละค่าใช้เนื้อที่ 2 byte เนื้อที่ทั้งหมดจะเป็น 2,000 byte
Linked List ดังนั้นในการใช้งานตัวแปรแบบ array จะต้องหาเนื้อที่ที่อยู่ติดกัน 2,000 byte และเนื้อที่ว่างที่ได้ จะไม่สามารถนำไปใช้กับการจัดเก็บข้อมูลอื่น ๆ ได้ ถ้าไม่สามารถหาเนื้อที่ว่างติดกัน 2,000 byte ได้ ก็จะไม่สามารถใช้งานได้ เช่น ไม่สามารถสั่งให้โปรแกรมทำงาน (execute) ได้ ถึงแม้ว่าจะ compile ผ่านแล้วก็ตาม เพราะเมื่อมีการสั่งให้โปรแกรมทำงาน ตัวแปรทุกตัวที่ใช้จะต้องมีการจับจองเนื้อที่ใน หน่วยความจำ เมื่อไม่สามารถจับจองเนื้อที่ได้ compiler ของภาษาที่ใช้เขียนโปรแกรมอาจจะแจ้งข้อผิด พลาด (error)ว่า Out of memory หรือ Not enough memory หรือ Insufficience memory ฯลฯ
Linked List ปัญหาของตัวแปร Array 1. ต้องได้เนื้อที่ว่างที่อยู่ติดกันตามจำนวนเนื้อที่ทั้งหมด ถ้ามีเนื้อที่ว่างดังนี้ จุดที่ 1 ว่าง 1,900 byte จุดที่ 2 ว่าง 800 byte จุดที่ 3 ว่าง 1,990 byte จุดที่ 4 ว่าง 10 byte จะเห็นว่าไม่มีจุดใดเลยที่มีเนื้อที่ว่างติดกัน 2,000 byte ดังนั้นโปรแกรมนี้ไม่สามารถทำงานได้ 2. กรณีที่จองเนื้อที่ไว้ 2,000 byte เก็บข้อมูล 1,000 ค่า แต่การใช้งานจริง ๆ เก็บข้อมูลเพียง 100 ค่า ใช้เนื้อที่ไปเพียง 200 byte ทำให้เหลือเนื้อที่ที่ไม่ได้ใช้ 1,800 byte ซึ่งเนื้อที่ 1,800 byte จะถูกกันไว้ สำหรับตัวแปรนั้น ๆ ดังนั้นเนื้อที่ที่เหลือจะไม่สามารถนำไปใช้งานอื่นได้ 3. กรณีที่จองเนื้อที่ไว้เก็บข้อมูล 1,000 ค่า แต่การใช้งานจริง ๆ ต้องการมากกว่า 1,000 ค่า เช่น ต้องการเพิ่ม อีก 2 ค่า ก็ไม่สามารถที่จะเพิ่มเติมข้อมูลได้ (จองไว้แค่ไหน ใช้แค่นั้น) จากปัญหาของ array ทั้ง 3 ข้อ สามารถแก้ปัญหาได้โดยใช้ linked lists
ลักษณะ Linked lists ลักษณะ Linked lists Linked lists จะไม่มีการจองเนื้อที่ หรือที่อยู่ (address)ใน memory ไว้ก่อน เมื่อต้องการใช้จึงจะทำการขอ เนื้อที่ ซึ่งก็จะทำการขอเนื้อที่สำหรับ 1 ค่า เมื่อต้องการใช้สำหรับข้อมูลต่อไป ก็จะทำการขอเนื้อที่อีก และเนื้อที่ที่ ขอใหม่ ไม่จำเป็นต้องเป็นเนื้อที่ที่อยู่ติดกัน แต่เป็นเนื้อที่บริเวณใดก็ได้ ที่หาและพบว่าว่าง ดังนั้น เมื่อเนื้อที่ไม่ได้อยู่ ติดกัน จะต้องมีตัวที่ทำหน้าที่จำว่าข้อมูลตัวต่อไปเก็บอยู่ที่ address ใด ซึ่งตัวที่ทำหน้าที่จำจะหมายถึงตัวที่ทำหน้าที่ เชื่อมระหว่างข้อมูลใด ๆ กับข้อมูลตัวต่อไป ซึ่งการเชื่อมนี้เรียกว่า link และเมื่อเชื่อมข้อมูลหลาย ๆ ค่าเข้าด้วยกัน 1 ชุด จะเรียกว่า list
ลักษณะ Linked lists ข้อมูล 1 ค่า จะเรียกว่า node ซึ่งแต่ละ node จะประกอบด้วย - ข้อมูลที่จัดเก็บ - address ของ node (ข้อมูล) ต่อไป
ลักษณะ Linked lists list ของข้อมูลตัวเลขจำนวน 5 ค่า ดังแสดงในภาพที่ 3
ลักษณะ Linked lists จากการจัดเก็บข้อมูลของ list ในภาพที่ 3 สามารถเขียนใหม่เพื่อให้เห็นอยู่ในลักษณะของ link ได้ชัดเจนเรียกว่า ภาพเสมือนดังแสดงในภาพที่ 4
Linked lists แก้ปัญหา Array แก้ปัญหาที่ 1 เนื่องจาก linked list จะขอเนื้อที่ครั้งละ 1 ค่า และเนื้อที่ที่ขอไม่จำเป็นต้องติดกัน ดังนั้น สามารถใช้เนื้อที่ ว่างตามจุดต่าง ๆ ได้ เช่น ต้องการเนื้อที่สำหรับข้อมูล 1,000 ค่า แต่ละ ค่าใช้ 2 byte ก็จะทำการขอเนื้อที่ทีละ 1 ค่า คือ 2 byte จำนวน 1,000 ครั้ง ซึ่งสามารถใช้เนื้อตามจุดที่ 1-4 ดังแสดงจุดที่ว่างในปัญหาของ array ข้อที่ 1ได้
Linked lists แก้ปัญหา Array แก้ปัญหาที่ 2 เนื่องจาก linked list จะขอเนื้อที่ครั้งละ 1 ค่า และขอเมื่อต้องการใช้ ดังนั้นจะไม่มีการสูญเสียเนื้อที่ใน memory ไปฟรี ๆ นั่นคือ ใช้เนื้อที่ตามจริง ต้องการแค่ไหนใช้เนื้อที่ไปแค่นั้น แก้ปัญหาข้อที่ 3 เนื่องจาก linked list จะขอเนื้อที่ไปได้เรื่อย ๆ ดังนั้นเมื่อมีข้อมูลเพิ่มก็สามารถขอเนื้อที่ได้อีกนั่นคือ ขอได้ไปเรื่อยๆ ไม่มีข้อจำกัด จนกว่า เนื้อที่ใน memory จะเต็ม (ไม่ว่าง )
ประเภทและOperation ของ Linked lists ประเภทของ linked lists linked lists แบ่งเป็น 2 ประเภท คือ 1. Singly linked lists ( list ที่มี linked เดียว ) 2. Doubly linked list ( list ที่มี 2 linked ) Operation ของ linked lists Operation ของ linked lists มี 2 อย่าง คือ 1. Insert (เพิ่มข้อมูลใน list) มี 2 ลักษณะ คือ - การเพิ่ม node ต่อท้าย list ( Append ) - การเพิ่มโดยการแทรกระหว่าง node ( Insert ) 2. Delete (ลบข้อมูลออกจาก list)