360 likes | 633 Views
บทที่ 6 บัญชีรายการเชื่อมโยง (Linked List). วัตถุประสงค์ บอกลักษณะของบัญชีรายการเชื่อมโยงได้ แสดงการนำข้อมูลเข้า ออกจากบัญชีรายการเชื่อมโยงเดี่ยวได้ แสดงการนำข้อมูลเข้า ออก จากบัญชีรายการเชื่อมโยงคู่ได้ เขียนคำสั่งแสดงการนำข้อมูลเข้า ออกจากบัญชีรายการเชื่อมโยงเดี่ยวได้
E N D
บทที่ 6 บัญชีรายการเชื่อมโยง (Linked List) • วัตถุประสงค์ • บอกลักษณะของบัญชีรายการเชื่อมโยงได้ • แสดงการนำข้อมูลเข้า ออกจากบัญชีรายการเชื่อมโยงเดี่ยวได้ • แสดงการนำข้อมูลเข้า ออก จากบัญชีรายการเชื่อมโยงคู่ได้ • เขียนคำสั่งแสดงการนำข้อมูลเข้า ออกจากบัญชีรายการเชื่อมโยงเดี่ยวได้ • เขียนคำสั่งแสดงการนำข้อมูลเข้า ออกจากบัญชีรายการเชื่อมโยงคู่ได้
ความหมาย มีลักษณะการเก็บข้อมูลเป็นโหนด(Node) โดยหนึ่งโหนดจะเก็บหนึ่งค่า โหนดจะประกอบด้วย 2 ส่วนคือ 1. ส่วนที่ทำหน้าที่เก็บข้อมูล ที่ใช้ในการทำงาน เรียกว่า Information Field 2. ส่วนที่เก็บตำแหน่งของสมาชิกตัวถัดไป เรียกว่า Link Field ลักษณะการเก็บดังรูป ลักษณะการเชื่อมโยง จะได้ First เป็นตัวแปรชี้โหนดแรก
บัญชีรายการเชื่อมโยง (Linked List) โหนดสุดท้ายของบัญชีรายการ ที่ไม่ได้ชี้ไปไหนสามารถแทนสัญลักษณ์ได้หลายแบบคือ
ตัวอย่างการสร้าง Link list 4. กำหนด data เป็น char 5. กำหนด next เป็น SinglyNode 7. กำหนดรายละเอียด Singly Node และมีการส่งผ่าน char เข้ามา 8. กำหนดให้ในส่วน data เก็บค่าที่ส่งเข้ามา 9. กำหนดให้ในส่วนของตัวชี้เป็นค่าว่าง
ตัวอย่างการสร้าง Singly Link list SinglyNode newNode=new SinglyNode(‘A’); SinglyNode nNode = new SinglyNode(‘B’); newNode nNode SinglyNode first = newNode; first.next = nNode; newNode,first first nNode
ชนิดของบัญชีรายการเชื่อมโยงชนิดของบัญชีรายการเชื่อมโยง 1. SinglyLinkedLists เป็นลักษณะบัญชีรายการเชื่อมโยงที่มี Linkedfield เพียง field เดียว ซึ่งจะต้องมีตัวชี้ข้อมูลแรกของบัญชีรายการเสมอ และตัวสุดท้ายของบัญชีรายการต้องมีค่าเป็นนัล(null) เสมอ first
ชนิดของบัญชีรายการเชื่อมโยงชนิดของบัญชีรายการเชื่อมโยง การนำเข้าข้อมูล Singly Linked Lists 1. การนำข้อมูลเข้าบัญชีรายการเป็นรายการแรก newNode newNode , first
การนำข้อมูลเข้าบัญชีรายการเชื่อมโยงการนำข้อมูลเข้าบัญชีรายการเชื่อมโยง 2. การนำโหนดใหม่มาเพิ่มทางหัวของบัญชีรายการ public sNode insert(Object data) // sNode insert มีการส่งผ่านข้อมูลเข้าคือ data { sNode n = new sNode(data); // สร้างโหนด n if (first==null)// ตรวจสอบว่า first เท่ากับ null หรือไม่ { first = n;// ถ้าเท่ากับ null ให้ชี้ไปที่ n } else { n.next = first; first = n; } return n; } 2 first 1 n public class sNode // ประกาศรายละเอียด sNode { public Object data; public sNode next; public sNode(Object data) { this.data = data; this.next = null; } }
การนำข้อมูลเข้าบัญชีรายการเชื่อมโยงการนำข้อมูลเข้าบัญชีรายการเชื่อมโยง 3. การนำโหนดใหม่เข้ามาต่อท้ายบัญชีรายการ public sNode insert(Object data) // sNode insert มีการส่งผ่านข้อมูลเข้าชื่อ data { sNode n = new sNode(data);// สร้างโหนด n sNode x = first; // กำหนดให้ x ชี้ไปที่ first while (x != null)// วน loop หาโหนดสุดท้าย x = x.next; // กำหนดให้ x ชี้ไปที่โหนดถัดไป x.next = n;// กำหนดให้ x.next ชี้ไปที่ n } first n public class sNode // ประกาศรายละเอียด sNode { public Object data; public sNode next; public sNode(Object data) { this.data = data; this.next = null; } }
การนำข้อมูลเข้าบัญชีรายการเชื่อมโยงการนำข้อมูลเข้าบัญชีรายการเชื่อมโยง 4. นำโหนดใหม่เพิ่มเข้าบัญชีรายการหลังตำแหน่งที่กำหนด public sNode insert(Object data) { sNode n = new sNode(data); // สร้างโหนด n โดยนำ data ที่ส่งเข้ามาเก็บไว้ในโหนด n.next= p.next;// กำหนดให้ n.next ชี้ไปยังโหนดถัดจาก p p.next= n; // กำหนดให้ p.next ชี้ไปที่ n } 1 2 p first n
การนำข้อมูลออกจากบัญชีรายการเชื่อมโยงการนำข้อมูลออกจากบัญชีรายการเชื่อมโยง 1. การนำข้อมูลตำแหน่งแรกออกจากบัญชีรายการ public void del(sNode node)// del มีการส่งผ่านโหนดแรกเข้ามา { sNode first = node;// กำหนดให้ first ชี้ไปที่โหนดแรก ที่ส่งเข้ามา first = first.next;// เลื่อนตัวชี้ first ไปยังโหนดถัดไป } first first
การนำข้อมูลออกจากบัญชีรายการเชื่อมโยงการนำข้อมูลออกจากบัญชีรายการเชื่อมโยง 2. การนำข้อมูลตำแหน่งที่หลังโหนดที่ระบุออกจากบัญชีรายการ public void delp(sNode node) // delp มีการส่งโหนดแรกเข้ามา { sNode first = node;// กำหนดให้ first ชี้ไปยังโหนดแรกที่ส่งมา if (first==null)// ตรวจสอบว่า ส่งโหนดว่างมาหรือไม่ System.out.println("Empty List "); else q.next = p.next;// ให้ q.next ชี้ไปยังโหนดถัดจาก p } q p first 1
Linked Stacksหรือ Available Stacks คือ Singly Linked List ที่มีการเชื่อมโยงแบบสแตก การนำข้อมูลเข้า-ออกจะทำที่หัวของบัญชีรายการหรือที่ตำแหน่ง first ดังรูปการนำข้อมูลเข้า first first
การนำข้อมูลเข้า Linked Stacks public sNode insert(Object data) // insert มีการส่งค่า data { sNode n = new sNode(data); // สร้าง n if (first==null) // first เป็นค่าว่างแสดงว่าเป็นโหนดแรก { first = n;// ให้ first ชี้ที่ n } else { n.next = first; first = n; } return n; } public class sNode// ประกาศรายละเอียดsNode { public Object data; public sNode next; public sNode(Object data) { this.data = data; this.next = null; } } 2 1 n first
การนำข้อมูลออกจาก Linked Stacks public void del(sNode node)// del มีการส่งโหนดแรกเข้ามา { sNode first = node;// ให้ first ชี้ไปที่โหนดที่ส่งมา first = first.next;// เลื่อน first ไปโหนดถัดไป } 2 1 first
Linked Queue หมายถึง Singly Linked List ในลักษณะของคิว คือต้องมีตัวชี้ทั้งทางออก(Front)และทางเข้า(Rear) ของข้อมูล ดังรูป การนำข้อมูลเข้า Linked Queue public sNode insert(Object data) { sNode n = new sNode(data);// สร้าง n โดยใส่ data ที่ส่งมาไว้ในโหนด if (front==null) // ตรวจสอบว่าเป็นโหนดแรกของบัญชีรายการหรือไม่ { front = n;// ถ้าใช่ ให้ front ชี้ไปที่โหนดใหม่ } else { rear.next=n;//ให้ rear.next ชี้ไปที่ n rear = n; } // ให้ rear ชี้ไปที่ n return n; } n 2 1 front rear
การนำข้อมูลออกจาก Linked Queue public void Lqdel(sNode node) // Lqdel ส่งตำแหน่งโหนดแรกเข้ามา { sNode front = node;// ให้ front ชี้ไปที่โหนดที่ส่งมา if front==null // ตรวจสอบว่า front มีข้อมูลหรือไม่ System.out.println("Empty List "); else front=front.next; // เลื่อนไปโหนดถัดไป } 1 front rear
Circle Linked Linear List เป็น Singly Linked List ที่ Linked field ของโหนดสุดท้ายชี้ไปที่โหนดแรก ดังรูป first first
Circle Linked Linear List ข้อดี สามารถเข้าถึง(Access)ได้ทุกโหนดเมื่อกำหนดจุดเริ่มต้น ณ ตำแหน่งใดๆ บนบัญชีรายการเชื่อมโยง 2. การ deletenode ทำได้ง่ายกว่าโดยสามารถค้นหาโหนดที่อยู่หน้าโหนดที่จะ Delete ได้โดยตรงจากโหนดที่ delete นั่นเอง
Circle Linked Linear List การนำข้อมูลเข้า Circulary Linked Linear List public sNode insert(Object data) { sNode n = new sNode(data); if (first==null) { first = n; first.next = n; } } else { n.next = first.next; first.next = n; } return n; } n 1 n,first 2 3 4 n first
งาน 1. จงเขียนโปรแกรมแสดงการนำข้อมูลเข้าบัญชีรายการแบบคิว จำนวน 5รายการพร้อมวาดภาพประกอบคำสั่ง 2. จงเขียนโปรแกรมแสดงการ นำข้อมูลเข้าบัญชีรายการแบบสแตก จำนวน 5 รายการ พร้อมวาดภาพประกอบคำสั่ง
1 n1,f,r 2 n2,r 3 n3,r 4 n4,r 5 n4,r
1 n1,f 2 n2,f 3 n3,f 4 n4,f 5 n4,f
Doubly Linked Linear List • หมายถึง การเชื่อมโยงที่มีลักษณะ 2 ทางคือข้างหน้าและข้างหลังของโหนด • Link field ที่อยู่ทางซ้ายจะชี้โหนดที่อยู่ก่อนหน้าโหนดนั้นเรียกว่า Left Link หรือ LLINK • Link field ที่อยู่ทางขวาจะชี้โหนดที่อยู่ถัดไป เรียกว่า Right Link หรือ RLINK • ลักษณะการเชื่อมโยงเป็นดังนี้ • อาจเรียกลักษณะการเชื่อมโยงดังกล่าวได้ว่า Doubly Linked Linear List หรือ Two way Chain หรือ Two way linked
ชนิดของ Doubly Linked List 1. Ordinary Doubly Linked List คือลักษณะของ Doubly Linked List ที่มีตัวชี้ซ้าย(LLINK) ของโหนดซ้ายสุดเป็น null และตัวชี้ขวา(RLINK) ของโหนดขวาสุดเป็น null ดังรูป 2. Circular Doubly Linked List คือลักษณะของ Doubly Linked List ที่มี Link ทางซ้ายของโหนดซ้ายสุดชี้ไปยังโหนดทางขวาสุด และ Link ทางขวาของโหนดขวาสุด ชี้ไปยังโหนดซ้ายสุด
การเพิ่มข้อมูลใน Doubly Linked List การเพิ่มโหนดใหม่เข้าไปใน Ordinary doubly Linked list public class doublyNode { public doublyNode bef; public char data; public doublyNode next; public doublyNode(char data) { this.data = data; this.next = null; this.bef = null; } n
การเพิ่มข้อมูลใน Doubly Linked List public static void main(String[] args) { doublyNode newNode = new doublyNode('A'); // สร้าง newNode เก็บค่า A System.out.println("newNode.data = "+newNode.data); // พิมพ์ค่า A doublyNode first = newNode; // กำหนดให้ first ชี้ที่ newNode System.out.println(" first.data = "+first.data); // พิมพ์ค่า first.data doublyNode nNode = new doublyNode('B'); // สร้าง nNode เก็บค่า B first.next = nNode; nNode.bef = first; 1 2 newNode ,first nNode
การเพิ่มข้อมูลใน Doubly Linked List while (first != null)// วน loop พิมพ์ค่าในแต่ละโหนดเริ่มจาก first { System.out.print(first.data+" "); first = first.next; } first = nNode; // ให้ first =ชี้ที่เดียวกัน nNode System.out.println(" "); // ขึ้นบรรทัดใหม่ while (first != null)// วน loop พิมพ์ค่าในแต่ละโหนดเริ่มจากโหนดสุดท้าย { System.out.print(first.data+" "); first = first.bef; // เลื่อนไปโหนดข้างหน้า } } } 1 2 newNode ,first nNode
การลบข้อมูลออกจาก DoublyLinked List การนำโหนดออกจาก OrdinaryDoubly Linked List ให้ L เป็นตัวชี้โหนดซ้ายสุดของบัญชีรายการ r เป็นตัวชี้โหนดขวาสุดของบัญชีรายการ old เป็นโหนดที่จะลบทิ้ง public void doubdel(sNode node) { if (r==null)// ตัวชี้ขาวสุดถ้าเป็นค่าว่าง แสดงว่าไม่มีข้อมูล System.out.println("Empty List "); else { if (l==r) // ถ้าตัวชี้โหนดซ้ายสุด กับตัวชี้โหนดขวาสุด ชี้ที่เดียวกันแสดงว่า บัญชีรายการมี 1 โหนด {l := nil; r:=nil; }// เคลียร์ตัวชี้ l และ r else if (l==old)// ตรวจสอบว่าโหนดที่ต้องการลบเป็นโหนดซ้ายสุด หรือไม่ {L = L.next; L.bef = null; } old r
การลบข้อมูลออกจาก DoublyLinked List else if (r==old) // ตรวจสอบว่า โหนดที่ต้องการลบเป็นโหนดขวาสุด หรือไม่ { r = r.bef; // เลื่อน r ไปข้างหน้า 1 โหนด r.next := null; } else // ต้องการลบโหนดตรงกลางๆ { old.bef.next = old.next; old.next.bef= old.bef; } } 2 old 1
งาน 1. จงเขียนโปรแกรมแสดงการสร้างบัญชีรายการเชื่อมโยง Ordinary Doubly Link List แบบคิว5รายการ 2.จงเขียนโปรแกรมแสดงการสร้างบัญชีรายการเชื่อมโยง Ordinary Doubly Link List แบบสแตก 5รายการ 3. จงเขียนโปรแกรมแสดงการนำข้อมูลออกจากบัญชีรายการเชื่อมโยง Ordinary Doubly Link List แบบคิว3 รายการ 4.จงเขียนโปรแกรมแสดงการนำข้อมูลออกจากบัญชีรายการเชื่อมโยง Ordinary Doubly Link List แบบสแตก 3รายการ
n1 ,f ,r n2 , r n3 , r n4 , r n5 , r
n1 ,f n2 , f n3 , f n4 , f n5 , f