โครงสร้างข้อมูลแบบรายการ (List)

Download Report

Transcript โครงสร้างข้อมูลแบบรายการ (List)

9. โครงสร้ างข้ อมูลแบบรายการ
Dense
List

Linked List

Applications
1
การสร้ างซอฟต์ แวร์
ประกอบด้วย
การเลือกโครงสร้างข้อมูล (Data Structure) ที่
เหมาะสม
การออกแบบขั้นตอนวิธี (Algorithm) อย่างมี
ประสิ ทธิภาพ
Program = Data Structure + Algorithm
created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
2/92
Data Structure
 Linear
Array
Link
List
Stack
Queue
 Non-Linear
Tree
 Graph

created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
3/92
List
เ ป็ น โ ค ร ง ส ร้ า ง ข้ อ มู ล ที่ จั ด เ ก็ บ ข้ อ มู ล
ต่อเนื่ องกันโดยที่สามารถทาการเพิ่มหรื อลบ
ข้อ มู ล ในลิ ส ต์ ต รงต าแหน่ ง ใดก็ ไ ด้ ต ามที่
ต้องการ
created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
4/92
List
วิธีการสร้างลิสต์แบบง่ายมี 2 วิธี
1.
Array
count
4
2.
2
1
3
4
25 31 42 58
Link List
25
31
42
58
5/92
การสร้ างลิสต์ ด้วย Array
 การเพิม
่ ข้อมูลในลิสต์
void insert (datatype newdata)
{
position = search(newdata);
ptr = cur;
while (ptr >= position)
{
list[ptr+1] = list[ptr];
ptr--;
}
list[position] = newdata;
cur ++;
}
Ex. newdata = ‘d’
a
position
cur
cur
b
e d
g e
t g
t
6/92
การสร้ างลิสต์ ด้วย Array
 การลบข้อมูลในลิสต์
void delete(datatype olddata)
{
position = search(olddata);
ptr = position;
while (ptr < cur)
{
list[ptr] = list[ptr+1];
ptr++;
}
cur --;
}
Ex. olddata = ‘e’
a
position
cur
cur
b
e g
g t
t
7/92
ปั ญหาของตัวแปรแบบ Array
1.
2.
ตัวแปรแบบ Array มีการจองเนือ้ ที่ท่ อี ยู่ตดิ กันตามจานวนที่
ต้ องการไว้ ก่อน เช่ น ถ้ าต้ องการจัดเก็บข้ อมูลจานวน 10,000 ค่ า
แต่ ละค่ าใช้ เนือ้ ที่ 2 byte เนือ้ ที่ทงั ้ หมดที่ถูกจองจะเป็ น 20,000
byte ซึ่งบางครัง้ อาจจะไม่ มีเนือ้ ที่ว่างที่อยู่ตดิ กันเพียงพอสาหรับ
เก็บข้ อมูล 20,000 byte ทาให้ โปรแกรมไม่ สามารถทางานได้
บางกรณีจองเนือ้ ที่ไว้ สาหรับเก็บข้ อมูล 10,000 ค่ า เนื่องจากไม่
ทราบจานวนข้ อมูลที่ต้องการเก็บ แต่ เมื่อใช้ งานจริง เก็บข้ อมูล
เพียง 2,000 ค่ า ทาให้ เหลือเนือ้ ที่ท่ ยี ังไม่ ได้ ใช้ แต่ ไม่ สามารถ
นาไปใช้ งานอื่นได้
8
ปั ญหาของตัวแปรแบบ Array (ต่ อ)
3.
กรณีจองเนือ้ ที่ไว้ สาหรับเก็บข้ อมูล 10,000 ค่ า แต่ การใช้ งาน
จริงมีข้อมูลที่ต้องเก็บมากกว่ า 10,000 ค่ า ก็ไม่ สามารถเก็บ
ข้ อมูลส่ วนที่เหลือได้ เนื่องจากจองไว้ แค่ ไหน ก็ใช้ ได้ แค่ นัน้
Address
100
102
104
106
:
data1
data2
data3
data4
:
แสดงโครงสร้ างการเก็บข้ อมูลแบบ Array
9
ลักษณะของ Linked list
ไม่ มีการจองเนือ้ ที่ในหน่ วยความจาไว้ ก่อน เมื่อต้ องการจึงจะมี
การขอเนือ้ ที่ ต้ องการใช้ เท่ าไหร่ ขอเนือ้ ที่เท่ าที่ต้องการ
 เนือ
้ ที่สาหรับเก็บข้ อมูลไม่ จาเป็ นต้ องอยู่ตดิ กัน

Address
100
data5
102
104
data1
106
:
:
แสดงโครงสร้ างการเก็บข้ อมูลแบบ Linked list
10
Linked List

โครงสร้ างข้ อมูลแบบลิงค์ ลิสต์ ประกอบด้ วยโหนดต่ างๆต่ อกัน
โดยแต่ ละโหนดมีส่วนที่สาคัญ 2 ส่ วนคือ ส่ วนที่เก็บข้ อมูล
(Data) และ ส่ วนที่เก็บตัวชี ้ (Pointer)
data
data pointer
25
Andaman
X
45.5
pointer
38.75
X
1 โหนด
11
Linked List
ส่ วนที่เก็บข้ อมูล (Data) สามารถเก็บได้ มากกว่ า 1 ข้ อมูล ที่
สัมพันธ์ กัน
 ส่ วนที่เก็บตัวชี ้ (pointer) สาหรั บเก็บตาแหน่ ง (Address) ของ
โหนดก่ อนหน้ าหรือถัดไป
 ประเภทของลิงค์ ลิสต์
 Singly Linked List
 Doubly Linked List

12
Linked List

Singly Linked List จะประกอบด้วยโหนดที่มีพอยน์เตอร์ช้ ี
ไปในทิศทางเดียว คือชี้ไปยังโหนดถัดไป
data pointer
200
B
Address

100
data pointer
300
D
200
data pointer
G
300
หากไม่มีโหนดที่อยูถ่ ดั ไป ส่ วนที่เป็ นพอยน์เตอร์จะเก็บค่า NULL
แทนด้วยสัญลักษณ์
13
Linked List

Doubly Linked List ประกอบด้วยส่ วนของ Data และ
พอยน์เตอร์ที่ช้ ีไป 2 ทิศทาง คือ ชี้ไปยังโหนดถัดไป และชี้ไปยังโหนด
ก่อนหน้า ดังนั้นเราจึงสามารถทาการอ่านข้อมูลได้ 2 วิธี คือ การอ่านไป
ข้างหน้า และอ่านไปทางข้างหลัง
pointer data pointer
B
100
200
pointer data pointer
100
200
D
300
pointer data pointer
200
G
300
Address
14
Linked List
 Operation
ของ Linked list
 เพิ่มข้ อมูล
(Insert) ใน list มี 2 คือ
การเพิ่มต่ อท้ าย list (Append)
เพิ่มโดยแทรกระหว่ าง node
 ลบ
(Delete) ข้ อมูลออกจาก list
15
Singly Linked List
 กาหนดให้ ตัวแปร
head เก็บ address ของโหนดแรกของ list
 last เก็บ address ของโหนดสุดท้ ายของ list
 newnode เก็บ address ของโหนดที่ต้องการเพิ่ม
 data เก็บข้ อมูล
 next เก็บ address ของโหนดถัดไป

 การอ้ างถึง
list ในโหนด เช่ น
newnode -> data เป็ นการอ้ างถึงข้ อมูลของโหนด newnode
 newnode -> next เป็ นการอ้ างถึง address ของโหนดถัดจาก newnode

16
Singly Linked List
 โครงสร้ างของโหนด
newnode
data
next
struct node {
int data;
struct node *next;
} *newnode;
17
Singly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
1. เพิ่มโหนดแรก : Insert 25
newnode
1.1 create newnode
1.2 newnode -> data = 25
1.3 newnode -> next = NULL
last
head
data next
25
100
1.4 head = newnode =last (=?)
18
Singly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
2. เพิ่มโหนดที่ 2 : Insert 30
last
head
2.3 newnode -> next = NULL
2.4 last- > next = newnode
next
100
2.1 create newnode
2.2 newnode -> data = 30
data
25
newnode
last
data
30
next
200
2.5 last = newnode (=?)
19
Singly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
head
3.1 create newnode
last
data
30
next
200
3.3 newnode -> next = NULL
newnode
3.4 last- > next = newnode
3.5 last = newnode (= ?)
next
100
3. เพิ่มโหนดที่ 3 : Insert 42
3.2 newnode -> data = 42
data
25
last
data
42
next
300
21
Singly Linked List
 การเพิ่มข้ อมูลโดยแทรกระหว่ างโหนด

(Insert)
ตัวอย่าง
4. Insert 38 ระหว่ างโหนดที่ 2 กับโหนดที่ 3
4.1 create newnode
4.2 newnode -> data = 38
newnode
data
38
next
400
23
Singly Linked List
 การเพิ่มข้ อมูลโดยแทรกระหว่ างโหนด

(Insert)
ตัวอย่าง
4. Insert 38 ระหว่ างโหนดที่ 2 กับโหนดที่ 3 (ต่ อ)
4.3 ให้
ptr เก็บ address ของโหนดที่ 2
4.4 newnode -> next = ptr -> next
4.5 ptr -> next = newnode
head
100
next
data
38
next
400
ptr
data
25
newnode
data
30
200
next
data
42
next
300
24
Singly Linked List
 การลบข้ อมูลใน

list (Delete)
ตัวอย่าง: Delete 25 ออกจาก list
1. ตรวจสอบ head -> data = 25 หรือไม่ ?
2.
ถาใช
้
่
head
ให้ head = head -> next (= ?)
head
data
25
100
next
data
30
200
next
data
38
400
next
data
42
next
300
25
Singly Linked List
 การลบข้ อมูลใน

list (Delete)
ตัวอย่าง: Delete 38 ออกจาก list
1. ให้ ptr = head
2. ptr -> next -> data = 38?
3.
ถ้าใช่ ให้
4.
ถ้าไม่ใช่ ให้
head
ptr -> next = ptr -> next -> next
ptr = ptr -> next แลววนไปท
าขอ
้
้ 2. ใหม่
ptr
data
25
100
next
data
30
200
next
data
38
400
next
data
42
next
300
26
Doubly Linked List
 กาหนดให้ ตัวแปร
 head เก็บ address ของโหนดแรกของ list
 last เก็บ address ของโหนดสุดท้ ายของ list
 newnode เก็บ address ของโหนดที่ต้องการเพิ่ม
 data เก็บข้ อมูล
 previous เก็บ address ของโหนดก่ อนหน้ า
 next เก็บ address ของโหนดถัดไป
27
Doubly Linked List
 การอ้ างถึง
list ในโหนด เช่ น
 newnode -> data เป็ นการอ้ างถึงข้ อมูลของโหนด newnode
 newnode -> previous เป็ นการอ้ างถึง address ของโหนดก่ อน
หน้ า newnode
 newnode -> next เป็ นการอ้ างถึง address ของโหนดถัดจาก
newnode
28
Doubly Linked List
 โครงสร้ างของโหนด
previous data next
newnode
struct node {
int data;
struct node *next, *previous;
} *newnode;
29
Doubly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
1. เพิ่มโหนดแรก : Insert 25
1.1 create newnode
1.2 newnode -> data = 25
1.3 newnode -> previous = NULL
newnode
last
previous data next
25
head
100
1.4 newnode -> next = NULL
1.5 head = newnode =last (= 100)
30
Doubly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
2. เพิ่มโหนดที่ 2 : Insert 30
2.1 create newnode
last
head
2.2 newnode -> data = 30
2.5 last- > next = newnode
2.6 last = newnode (=200)
25
100
2.3 newnode -> next = NULL
2.4 newnode -> previous = last
previous data next
newnode
last
previous data next
30
200
31
Doubly Linked List
 การเพิ่มข้ อมูลต่ อท้ าย

list (Append)
ตัวอย่าง
3. เพิ่มโหนดที่ 3 : Insert 42
head
previous data next
3.2 newnode -> data = 42
last
3.4 newnode -> previous = last
3.5 last- > next = newnode
3.6 last = newnode (=300)
25
100
3.1 create newnode
3.3 newnode -> next = NULL
previous data next
30
200
previous data next
newnode
last
42
300
32
Doubly Linked List
 การเพิ่มข้ อมูลโดยแทรกระหว่ างโหนด

(Insert)
ตัวอย่าง
4. Insert 38 ระหว่ างโหนดที่ 2 กับโหนดที่ 3
4.1 create newnode
4.2 newnode -> data = 38
previous data next
38
400
33
Doubly Linked List
 การเพิ่มข้ อมูลโดยแทรกระหว่ างโหนด

(Insert)
ตัวอย่าง 4. Insert 38 ระหว่ างโหนดที่ 2 กับโหนดที่ 3 (ต่ อ)
4.3 ให้
ptr เก็บ address ของโหนดที่ 2
4.4 newnode -> next = ptr-> next
newnode
4.5 newnode -> previous = ptr-> next -> previous
previous data next
4.6 ptr -> next = newnode
38
head
previous data next
previous data next
25
100
400
ptr
previous data next
42
30
200
300
34
Doubly Linked List
 การลบข้ อมูลใน

list (Delete)
ตัวอย่าง: Delete 25 ออกจาก list
1. ตรวจสอบ head -> data = 25 หรือไม่ ?
2.
ถ้าใช่
head
head
ให้ head = head -> next (= ?)
previous data next
30
42
200
previous data next
300
previous data next
25
100
previous data next
38
400
35
Singly Linked List
 การลบข้ อมูลใน

list (Delete)
ตัวอย่าง: Delete 38 ออกจาก list
1. ให้ ptr = head
2. ptr -> next -> data = 38?
3.
ถ้าใช่ ให้
4.
ถ้าไม่ใช่ ให้
ptr
head
ptr -> next = ptr -> next -> next
ptr = ptr -> pointer แลววนไปท
าขอ
้
้ 2. ใหม่
previous data next
30
42
200
previous data next
300
previous data next
25
100
previous data next
38
400
36
Array vs Linked List

Array
 Linked List
ข้ อมูลคงที่
ข้ อมูลไม่ คงที่
ไม่ ค่อยเปลีย่ นแปลง
เปลีย่ นแปลงบ่ อย
37
Motto Today
คนเราอย่ามุง่ แต่ความสาเร็จ ต้อง
รักษาความดีไว้ด้วย
อย่าเป็ นคนเก่งที่ไม่มีค่า
Practice makes Perfect !
created by Dararat Saelee , Computer Sciences Department, Faculty of Science, PSU-HatYai
38/92