360 likes | 516 Views
9 . โครงสร้างข้อมูลแบบรายการ. Dense List Linked List Applications. การสร้างซอฟต์แวร์. ประกอบด้วย การเลือกโครงสร้างข้อมูล ( Data Structure ) ที่เหมาะสม การออกแบบขั้นตอนวิธี (Algorithm) อย่างมีประสิทธิภาพ Program = Data Structure + Algorithm. Linear Array Link List Stack Queue.
E N D
9. โครงสร้างข้อมูลแบบรายการ Dense List Linked List Applications
การสร้างซอฟต์แวร์ • ประกอบด้วย • การเลือกโครงสร้างข้อมูล (Data Structure) ที่เหมาะสม • การออกแบบขั้นตอนวิธี (Algorithm)อย่างมีประสิทธิภาพ • Program = Data Structure + Algorithm created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
Linear Array Link List Stack Queue Non-Linear Tree Graph Data Structure created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
List • เป็นโครงสร้างข้อมูลที่จัดเก็บข้อมูลต่อเนื่องกันโดยที่สามารถทำการเพิ่มหรือลบข้อมูลในลิสต์ตรงตำแหน่งใดก็ได้ตามที่ต้องการ created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
List • วิธีการสร้างลิสต์แบบง่ายมี 2 วิธี • Array • Link List 2 count 1 3 4
การสร้างลิสต์ด้วย 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
การสร้างลิสต์ด้วย 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
ปัญหาของตัวแปรแบบ Array • ตัวแปรแบบ Array มีการจองเนื้อที่ที่อยู่ติดกันตามจำนวนที่ต้องการไว้ก่อน เช่น ถ้าต้องการจัดเก็บข้อมูลจำนวน 10,000 ค่า แต่ละค่าใช้เนื้อที่ 2 byte เนื้อที่ทั้งหมดที่ถูกจองจะเป็น 20,000 byte ซึ่งบางครั้งอาจจะไม่มีเนื้อที่ว่างที่อยู่ติดกันเพียงพอสำหรับเก็บข้อมูล 20,000 byte ทำให้โปรแกรมไม่สามารถทำงานได้ • บางกรณีจองเนื้อที่ไว้สำหรับเก็บข้อมูล 10,000 ค่า เนื่องจากไม่ทราบจำนวนข้อมูลที่ต้องการเก็บ แต่เมื่อใช้งานจริง เก็บข้อมูลเพียง 2,000 ค่า ทำให้เหลือเนื้อที่ที่ยังไม่ได้ใช้ แต่ไม่สามารถนำไปใช้งานอื่นได้
ปัญหาของตัวแปรแบบ Array (ต่อ) • กรณีจองเนื้อที่ไว้สำหรับเก็บข้อมูล 10,000 ค่า แต่การใช้งานจริงมีข้อมูลที่ต้องเก็บมากกว่า 10,000 ค่า ก็ไม่สามารถเก็บข้อมูลส่วนที่เหลือได้ เนื่องจากจองไว้แค่ไหน ก็ใช้ได้แค่นั้น Address แสดงโครงสร้างการเก็บข้อมูลแบบ Array
ลักษณะของ Linked list • ไม่มีการจองเนื้อที่ในหน่วยความจำไว้ก่อน เมื่อต้องการจึงจะมีการขอเนื้อที่ ต้องการใช้เท่าไหร่ ขอเนื้อที่เท่าที่ต้องการ • เนื้อที่สำหรับเก็บข้อมูลไม่จำเป็นต้องอยู่ติดกัน Address แสดงโครงสร้างการเก็บข้อมูลแบบ Linked list
data pointer data pointer Andaman 45.5 38.75 X 25X Linked List • โครงสร้างข้อมูลแบบลิงค์ลิสต์ประกอบด้วยโหนดต่างๆต่อกันโดยแต่ละโหนดมีส่วนที่สำคัญ 2 ส่วนคือ ส่วนที่เก็บข้อมูล (Data) และ ส่วนที่เก็บตัวชี้ (Pointer) 1 โหนด
Linked List • ส่วนที่เก็บข้อมูล (Data) สามารถเก็บได้มากกว่า 1 ข้อมูล ที่สัมพันธ์กัน • ส่วนที่เก็บตัวชี้ (pointer) สำหรับเก็บตำแหน่ง (Address) ของโหนดก่อนหน้าหรือถัดไป • ประเภทของลิงค์ลิสต์ • Singly Linked List • Doubly Linked List
B D G Linked List • Singly Linked List จะประกอบด้วยโหนดที่มีพอยน์เตอร์ชี้ไปในทิศทางเดียว คือชี้ไปยังโหนดถัดไป • หากไม่มีโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์จะเก็บค่า NULL แทนด้วยสัญลักษณ์ data pointer data pointer data pointer 300 200 Address 100 200 300
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
Linked List • Operation ของ Linked list • เพิ่มข้อมูล (Insert) ใน list มี 2 คือ • การเพิ่มต่อท้าย list (Append) • เพิ่มโดยแทรกระหว่าง node • ลบ (Delete) ข้อมูลออกจาก list
Singly Linked List • กำหนดให้ตัวแปร • headเก็บ address ของโหนดแรกของ list • lastเก็บ address ของโหนดสุดท้ายของ list • newnodeเก็บ address ของโหนดที่ต้องการเพิ่ม • data เก็บข้อมูล • next เก็บ address ของโหนดถัดไป • การอ้างถึง list ในโหนด เช่น • newnode -> data เป็นการอ้างถึงข้อมูลของโหนดnewnode • newnode -> next เป็นการอ้างถึง address ของโหนดถัดจาก newnode
SinglyLinkedList • โครงสร้างของโหนด struct node { int data; struct node *next; } *newnode; newnode data next
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
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
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
SinglyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง 4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 4.1 create newnode 4.2 newnode -> data = 38 newnode 38 data next 400
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
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
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
DoublyLinkedList • กำหนดให้ตัวแปร • headเก็บ address ของโหนดแรกของ list • lastเก็บ address ของโหนดสุดท้ายของ list • newnodeเก็บ address ของโหนดที่ต้องการเพิ่ม • data เก็บข้อมูล • previous เก็บ address ของโหนดก่อนหน้า • nextเก็บ address ของโหนดถัดไป
DoublyLinkedList • การอ้างถึง list ในโหนด เช่น • newnode -> data เป็นการอ้างถึงข้อมูลของโหนดnewnode • newnode -> previous เป็นการอ้างถึง address ของโหนดก่อนหน้า newnode • newnode -> next เป็นการอ้างถึง address ของโหนดถัดจาก newnode
DoublyLinkedList • โครงสร้างของโหนด previous data next struct node { int data; struct node *next, *previous; } *newnode; newnode
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
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
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
DoublyLinkedList • การเพิ่มข้อมูลโดยแทรกระหว่างโหนด(Insert) • ตัวอย่าง 4. Insert 38 ระหว่างโหนดที่ 2 กับโหนดที่ 3 previous data next 400 4.1 create newnode 4.2 newnode -> data= 38 38
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
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
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
Array ข้อมูลคงที่ ไม่ค่อยเปลี่ยนแปลง LinkedList ข้อมูลไม่คงที่ เปลี่ยนแปลงบ่อย Array vsLinkedList
Motto Today คนเราอย่ามุ่งแต่ความสำเร็จ ต้องรักษาความดีไว้ด้วย อย่าเป็นคนเก่งที่ไม่มีค่า Practice makes Perfect ! created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai