1 / 36

9 . โครงสร้างข้อมูลแบบรายการ

9 . โครงสร้างข้อมูลแบบรายการ. Dense List Linked List Applications. การสร้างซอฟต์แวร์. ประกอบด้วย การเลือกโครงสร้างข้อมูล ( Data Structure ) ที่เหมาะสม การออกแบบขั้นตอนวิธี (Algorithm) อย่างมีประสิทธิภาพ Program = Data Structure + Algorithm. Linear Array Link List Stack Queue.

Download Presentation

9 . โครงสร้างข้อมูลแบบรายการ

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. 9. โครงสร้างข้อมูลแบบรายการ Dense List Linked List Applications

  2. การสร้างซอฟต์แวร์ • ประกอบด้วย • การเลือกโครงสร้างข้อมูล (Data Structure) ที่เหมาะสม • การออกแบบขั้นตอนวิธี (Algorithm)อย่างมีประสิทธิภาพ • Program = Data Structure + Algorithm created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai

  3. Linear Array Link List Stack Queue Non-Linear Tree Graph Data Structure created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai

  4. List • เป็นโครงสร้างข้อมูลที่จัดเก็บข้อมูลต่อเนื่องกันโดยที่สามารถทำการเพิ่มหรือลบข้อมูลในลิสต์ตรงตำแหน่งใดก็ได้ตามที่ต้องการ created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai

  5. List • วิธีการสร้างลิสต์แบบง่ายมี 2 วิธี • Array • Link List 2 count 1 3 4

  6. การสร้างลิสต์ด้วย Array • การเพิ่มข้อมูลในลิสต์ Ex. newdata = ‘d’ void insert (datatypenewdata) { position = search(newdata); ptr = cur; while (ptr >= position) { list[ptr+1] = list[ptr]; ptr--; } list[position] = newdata; cur ++; } a b position d e e g t cur g cur t

  7. การสร้างลิสต์ด้วย Array • การลบข้อมูลในลิสต์ Ex. olddata = ‘e’ void delete(datatypeolddata) { position = search(olddata); ptr = position; while (ptr < cur) { list[ptr] = list[ptr+1]; ptr++; } cur --; } a b position g e g cur t t cur

  8. ปัญหาของตัวแปรแบบ Array • ตัวแปรแบบ Array มีการจองเนื้อที่ที่อยู่ติดกันตามจำนวนที่ต้องการไว้ก่อน เช่น ถ้าต้องการจัดเก็บข้อมูลจำนวน 10,000 ค่า แต่ละค่าใช้เนื้อที่ 2 byte เนื้อที่ทั้งหมดที่ถูกจองจะเป็น 20,000 byte ซึ่งบางครั้งอาจจะไม่มีเนื้อที่ว่างที่อยู่ติดกันเพียงพอสำหรับเก็บข้อมูล 20,000 byte ทำให้โปรแกรมไม่สามารถทำงานได้ • บางกรณีจองเนื้อที่ไว้สำหรับเก็บข้อมูล 10,000 ค่า เนื่องจากไม่ทราบจำนวนข้อมูลที่ต้องการเก็บ แต่เมื่อใช้งานจริง เก็บข้อมูลเพียง 2,000 ค่า ทำให้เหลือเนื้อที่ที่ยังไม่ได้ใช้ แต่ไม่สามารถนำไปใช้งานอื่นได้

  9. ปัญหาของตัวแปรแบบ Array (ต่อ) • กรณีจองเนื้อที่ไว้สำหรับเก็บข้อมูล 10,000 ค่า แต่การใช้งานจริงมีข้อมูลที่ต้องเก็บมากกว่า 10,000 ค่า ก็ไม่สามารถเก็บข้อมูลส่วนที่เหลือได้ เนื่องจากจองไว้แค่ไหน ก็ใช้ได้แค่นั้น Address แสดงโครงสร้างการเก็บข้อมูลแบบ Array

  10. ลักษณะของ Linked list • ไม่มีการจองเนื้อที่ในหน่วยความจำไว้ก่อน เมื่อต้องการจึงจะมีการขอเนื้อที่ ต้องการใช้เท่าไหร่ ขอเนื้อที่เท่าที่ต้องการ • เนื้อที่สำหรับเก็บข้อมูลไม่จำเป็นต้องอยู่ติดกัน Address แสดงโครงสร้างการเก็บข้อมูลแบบ Linked list

  11. data pointer data pointer Andaman 45.5 38.75 X 25X Linked List • โครงสร้างข้อมูลแบบลิงค์ลิสต์ประกอบด้วยโหนดต่างๆต่อกันโดยแต่ละโหนดมีส่วนที่สำคัญ 2 ส่วนคือ ส่วนที่เก็บข้อมูล (Data) และ ส่วนที่เก็บตัวชี้ (Pointer) 1 โหนด

  12. Linked List • ส่วนที่เก็บข้อมูล (Data) สามารถเก็บได้มากกว่า 1 ข้อมูล ที่สัมพันธ์กัน • ส่วนที่เก็บตัวชี้ (pointer) สำหรับเก็บตำแหน่ง (Address) ของโหนดก่อนหน้าหรือถัดไป • ประเภทของลิงค์ลิสต์ • Singly Linked List • Doubly Linked List

  13. B D G Linked List • Singly Linked List จะประกอบด้วยโหนดที่มีพอยน์เตอร์ชี้ไปในทิศทางเดียว คือชี้ไปยังโหนดถัดไป • หากไม่มีโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์จะเก็บค่า NULL แทนด้วยสัญลักษณ์ data pointer data pointer data pointer 300 200 Address 100 200 300

  14. Linked List • Doubly Linked List ประกอบด้วยส่วนของ Data และ พอยน์เตอร์ที่ชี้ไป 2 ทิศทาง คือ ชี้ไปยังโหนดถัดไป และชี้ไปยังโหนดก่อนหน้า ดังนั้นเราจึงสามารถทำการอ่านข้อมูลได้ 2 วิธี คือ การอ่านไปข้างหน้า และอ่านไปทางข้างหลัง pointer data pointer pointer data pointer pointer data pointer 200 100 300 200 B D G 100 200 300 Address

  15. Linked List • Operation ของ Linked list • เพิ่มข้อมูล (Insert) ใน list มี 2 คือ • การเพิ่มต่อท้าย list (Append) • เพิ่มโดยแทรกระหว่าง node • ลบ (Delete) ข้อมูลออกจาก list

  16. Singly Linked List • กำหนดให้ตัวแปร • headเก็บ address ของโหนดแรกของ list • lastเก็บ address ของโหนดสุดท้ายของ list • newnodeเก็บ address ของโหนดที่ต้องการเพิ่ม • data เก็บข้อมูล • next เก็บ address ของโหนดถัดไป • การอ้างถึง list ในโหนด เช่น • newnode -> data เป็นการอ้างถึงข้อมูลของโหนดnewnode • newnode -> next เป็นการอ้างถึง address ของโหนดถัดจาก newnode

  17. SinglyLinkedList • โครงสร้างของโหนด struct node { int data; struct node *next; } *newnode; newnode data next

  18. SinglyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 1. เพิ่มโหนดแรก : Insert 25 newnode 1.1 create newnode 1.2 newnode -> data= 25 1.3 newnode -> next = NULL 1.4 head = newnode =last (=?) data next 25 head last 100

  19. SinglyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 2. เพิ่มโหนดที่ 2: Insert 30 last last 25 2.1 create newnode 2.2 newnode -> data = 30 2.3 newnode -> next = NULL 2.4 last- > next = newnode 2.5 last = newnode (=?) newnode data next data next 30 head 100 200

  20. SinglyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 3. เพิ่มโหนดที่ 3: Insert 42 last last 25 3.1 create newnode 3.2 newnode -> data = 42 3.3 newnode -> next = NULL 3.4 last- > next = newnode 3.5 last = newnode (= ?) 30 newnode data next data next data next head 42 100 200 300

  21. SinglyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง 4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 4.1 create newnode 4.2 newnode -> data = 38 newnode 38 data next 400

  22. SinglyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง 4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 (ต่อ) ptr 25 4.3 ให้ ptrเก็บ address ของโหนดที่ 2 4.4 newnode -> next = ptr -> next 4.5 ptr -> next = newnode 30 newnode 38 data next data next data next data next head 42 200 300 400 100

  23. SinglyLinkedList • การลบข้อมูลใน list(Delete) • ตัวอย่าง: Delete 25ออกจาก list head 25 • ตรวจสอบ head -> data = 25 หรือไม่ ? • 2. ถ้าใช่ ให้ head = head -> next (= ?) 42 30 38 head data next data next data next data next 100 200 400 300

  24. SinglyLinkedList • การลบข้อมูลใน list(Delete) • ตัวอย่าง: Delete 38ออกจาก list ptr 25 • ให้ ptr = head • ptr -> next -> data = 38? • ถ้าใช่ ให้ ptr -> next = ptr -> next -> next • ถ้าไม่ใช่ ให้ ptr=ptr -> next แล้ววนไปทำข้อ 2. ใหม่ 42 30 38 head data next data next data next data next 100 200 400 300

  25. DoublyLinkedList • กำหนดให้ตัวแปร • headเก็บ address ของโหนดแรกของ list • lastเก็บ address ของโหนดสุดท้ายของ list • newnodeเก็บ address ของโหนดที่ต้องการเพิ่ม • data เก็บข้อมูล • previous เก็บ address ของโหนดก่อนหน้า • nextเก็บ address ของโหนดถัดไป

  26. DoublyLinkedList • การอ้างถึง list ในโหนด เช่น • newnode -> data เป็นการอ้างถึงข้อมูลของโหนดnewnode • newnode -> previous เป็นการอ้างถึง address ของโหนดก่อนหน้า newnode • newnode -> next เป็นการอ้างถึง address ของโหนดถัดจาก newnode

  27. DoublyLinkedList • โครงสร้างของโหนด previous data next struct node { int data; struct node *next, *previous; } *newnode; newnode

  28. DoublyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 1. เพิ่มโหนดแรก : Insert 25 previous data next 1.1 create newnode 1.2 newnode -> data= 25 1.3 newnode -> previous = NULL 1.4 newnode -> next = NULL 1.5 head = newnode =last (= 100) 100 newnode 25 head last

  29. DoublyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 2. เพิ่มโหนดที่ 2: Insert 30 previous data next previous data next 25 100 200 2.1 create newnode 2.2 newnode -> data = 30 2.3 newnode -> next = NULL 2.4 newnode -> previous = last 2.5 last- > next = newnode 2.6 last = newnode (=200) newnode head last last 30

  30. DoublyLinkedList • การเพิ่มข้อมูลต่อท้าย list (Append) • ตัวอย่าง 3. เพิ่มโหนดที่ 3: Insert 42 previous data next previous data next previous data next 25 100 200 300 3.1 create newnode 3.2 newnode -> data = 42 3.3 newnode -> next = NULL 3.4 newnode -> previous = last 3.5 last- > next = newnode 3.6 last = newnode (=300) newnode 30 head last last 42

  31. DoublyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง 4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 previous data next 400 4.1 create newnode 4.2 newnode -> data= 38 38

  32. DoublyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 (ต่อ) ptr previous data next previous data next previous data next previous data next 4.3 ให้ ptrเก็บ address ของโหนดที่ 2 4.4 newnode -> next = ptr-> next 4.5 newnode -> previous = ptr-> next-> previous 4.6 ptr -> next = newnode 25 100 200 300 400 head newnode 30 38 42

  33. DoublyLinkedList • การลบข้อมูลใน list(Delete) • ตัวอย่าง: Delete 25ออกจาก list previous data next previous data next previous data next previous data next 25 • ตรวจสอบ head -> data = 25 หรือไม่ ? • 2. ถ้าใช่ ให้ head = head -> next (= ?) 100 300 200 400 head 30 42 head 38

  34. SinglyLinkedList • การลบข้อมูลใน list(Delete) • ตัวอย่าง: Delete 38ออกจาก list ptr previous data next previous data next previous data next previous data next 25 • ให้ ptr = head • ptr -> next -> data = 38? • ถ้าใช่ ให้ ptr -> next = ptr -> next -> next • ถ้าไม่ใช่ ให้ ptr=ptr -> pointer แล้ววนไปทำข้อ 2. ใหม่ 100 200 400 300 head 30 42 38

  35. Array ข้อมูลคงที่ ไม่ค่อยเปลี่ยนแปลง LinkedList ข้อมูลไม่คงที่ เปลี่ยนแปลงบ่อย Array vsLinkedList

  36. Motto Today คนเราอย่ามุ่งแต่ความสำเร็จ ต้องรักษาความดีไว้ด้วย อย่าเป็นคนเก่งที่ไม่มีค่า Practice makes Perfect ! created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai

More Related