ฟังก์ชันจัดการลิงค์ลิสต์แบบสองทาง
Advance Computer Programming
รหัสวิชา 32090207
อ. กิตตินันท์ น้1อยมณี 1
เนื้อหา
1. Double Linked List Structure
2. AddNode
3. InsertNode
4. DeleteNode
5. Example
อ. กิตตินันท์ น้1อยมณี 2
Double Linked List Structure
อ. กิตตินันท์ น้3อยมณี 3
Simple Linked List
อ. กิตตินันท์ น้1อยมณี 4
 one  two  three  four 
start data next data next data next data next

data next
Single Linked List Structure
อ. กิตตินันท์ น้1อยมณี 5
 one  two  three  four 


now
walk
start data next data next data next data next
Double Linked List Structure
อ. กิตตินันท์ น้1อยมณี 6
 
data nextback
start data next
      
back data nextback data nextback
Double Linked List Structure
• Next ชี้ตัวถัดไป
• Start เป็นจุดเริ่มต้น (จําเป็นต้องมี)
• Back ย้อนกลับไป Node ก่อนหน้า
(เริ่มแรกเป็น NULL ไปก่อน)
อ. กิตตินันท์ น้1อยมณี 7
Double Linked List Structure
อ. กิตตินันท์ น้1อยมณี 8
start data next
      
back data nextback data nextback


now
walk
Double Linked List Structure
• Now เอาไว้ชี้ตําแหน่งปัจจุบัน โดยใช้แค่ตําแหน่งเดียวพอ
เพราะ Double LL มี back อยู่แล้ว (จึงใช้ now แค่ 1 ระดับก็
เพียงพอ)
• Now ทําหน้าที่เดิน
อ. กิตตินันท์ น้1อยมณี 9
Double Linked List Structure
• Struct จะหน้าตาประมาณนี้
อ. กิตตินันท์ น้1อยมณี 10
Double Linked List Structure
• งานพื้นฐานก็จะมี 3 อย่างเหมือนเดิมคือ
1. Add
2. Insert
3. Delete
อ. กิตตินันท์ น้1อยมณี 11
AddNode
อ. กิตตินันท์ น้12อยมณี 12
AddNode
• การ AddNode คือการเพิ่มโหนดใหม่ต่อท้าย Linked List
• การเรียกใช้คือ
now = AddNode( &start , 10 );
อ. กิตตินันท์ น้1อยมณี 13
AddNode
• การทํางาน
–ส่ง Addr ของ start เพราะต้องเปลี่ยนแปลงที่อยู่ภายในของ start
–และต้องให้ pointer now ชี้ไปยัง node ใหม่เลย
• ดังนั้นก่อนจะ AddNode ต้องตรวจสอบว่ามีข้อมูลแล้วหรือยัง
–ถ้ายังไม่มีข้อมูล (If) : ก็ Add ข้อมูลต่อ Start ได้เลย
–แต่ถ้ามีแล้ว (Else) : ให้ Add ข้อมูลต่อ Now
อ. กิตตินันท์ น้1อยมณี 14
AddNode
อ. กิตตินันท์ น้1อยมณี 15
start data next
 10   20  
back data nextback


now
walk
• Step 1: สร้าง Temp มาเก็บโหนดสุดท้ายไว้ก่อน

temp
1
AddNode
อ. กิตตินันท์ น้1อยมณี 16
start data next
 10   20  
back data nextback


now
walk
• Step 2: ให้ walk ไล่ไปหาโหนดสุดท้ายให้เจอ

temp
AddNode
อ. กิตตินันท์ น้1อยมณี 17
start data next
 10   20  
back data nextback


now
walk
• Step 2: ให้ walk ไล่ไปหาโหนดสุดท้ายให้เจอ

temp
AddNode
อ. กิตตินันท์ น้1อยมณี 18
start data next
 10   20  
back data nextback


now
walk
• Step 2: ให้ walk ไล่ไปหาโหนดสุดท้ายให้เจอ
2

temp
AddNode
อ. กิตตินันท์ น้1อยมณี 19
start data nextback data nextback


now
walk
• Step 3: สร้าง Node ใหม่ และให้ Node สุดท้ายชี้ Node ใหม่
3

temp
 10   20   30  
data nextback
AddNode
อ. กิตตินันท์ น้1อยมณี 20
start data nextback data nextback


now
walk
• Step 4: ให้ Next ของ Node ใหม่ชี้ไปที่ NULL
4

temp
 10   20   30  
data nextback
AddNode
อ. กิตตินันท์ น้1อยมณี 21
start data nextback data nextback


now
walk
• Step 5: ให้ Back ของ Node ใหม่ ชี้ไปยัง Node ก่อนหน้า 5

temp
 10   20   30  
data nextback
AddNode
อ. กิตตินันท์ น้1อยมณี 22
start data nextback data nextback


now
walk
• Step 6: ให้ Now ชี้ไปยัง Node ใหม่
6

temp
 10   20   30  
data nextback
AddNode
อ. กิตตินันท์ น้1อยมณี 23
start data nextback data nextback


now
walk
• สรุป
6

temp
 10   20   30  
data nextback
1
2
3 4
5
AddNode
อ. กิตตินันท์ น้1อยมณี 24
AddNode
อ. กิตตินันท์ น้1อยมณี 25
ถ้าไม่มี 3 บรรทัดนี้ก็
เป็นแค่ Single
Linked List
AddNode
อ. กิตตินันท์ น้1อยมณี 26
การเอา temp มาชี้
ต้องเอามาไว้ก่อน
walk
AddNode
อ. กิตตินันท์ น้1อยมณี 27
!= NULL : เดินต่อ
เจอ NULL : หยุดเดิน
AddNode
อ. กิตตินันท์ น้1อยมณี 28
เพราะเป็น Pointer 2
ระดับ เลยต้องการ
Addr ของ Next
บรรทัดนี้คือการเดินที
ละก้าวจนกว่าจะเจอ
Node สุดท้าย
AddNode
อ. กิตตินันท์ น้1อยมณี 29
New Node ขึ้นมาใหม่
AddNode
อ. กิตตินันท์ น้1อยมณี 30
• ในแต่ละ Loop ของ while จะสังเกตได้ว่า walk จะชี้ได้แค่ที่
เดียวเท่านั้น
• temp จะเดินตาม walk ทุกๆ ก้าวเลย ดังนั้นเราจะได้เอา back
มาชี้เหมือนที่ temp ชี้อยู่
InsertNode
อ. กิตตินันท์ น้31อยมณี 31
InsertNode
อ. กิตตินันท์ น้1อยมณี 32
start data nextback data nextback

walk
• Step 1: สร้าง Node ใหม่ และ Node ก่อนหน้าชี้ Node ใหม่
 10   20  
InsertNode
อ. กิตตินันท์ น้1อยมณี 33
 10   20  
start data nextback data next
• Step 1: สร้าง Node ใหม่ และ Node ก่อนหน้าชี้ Node ใหม่
back

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 34
 10   99   20  
start data nextback data next
• Step 1: สร้าง Node ใหม่ และ Node ก่อนหน้าชี้ Node ใหม่
back

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 35
 10   99   20  
start data nextback data next
• Step 1: สร้าง Node ใหม่ และ Node ก่อนหน้าชี้ Node ใหม่
back
1

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 36
 10   99   20  
start data nextback data next
• Step 2: Back ของ Node ใหม่ ชี้ไปยัง Node ก่อนหน้า
back2

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 37
 10   99   20  
start data nextback data next
• Step 3: Next ของ Node ใหม่ ชี้ไปยัง Node ที่เหลือ
back
3

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 38
 10   99   20  
start data nextback data next
• Step 4: Back ของ Node ที่เหลือชี้ไปยัง Node ใหม่
back
4

walk
InsertNode
อ. กิตตินันท์ น้1อยมณี 39
 10   99   20  
start data nextback data next
• สรุป
back
4
3
2
1

walk
InsertNode
• จุดสังเกต
–ส่ง Now ไปให้ Walk
–ดังนั้นถ้า Walk อยู่ใน Node แรกสุด จะไม่สามารถแทรก
Node ใหม่ได้เพราะเข้าถึง Start ไม่ได้
–วิธีการแก้คือ อาจจะส่ง &start ไปให้ InsNode() ด้วยอีก 1
Parameter
–Now ยังคงอยู่ที่เดิม เพราะส่ง now มา (ไม่ได้ส่ง &now)
เพราะข้อนี้ไม่ต้องเปลี่ยน now
อ. กิตตินันท์ น้1อยมณี 40
InsertNode
อ. กิตตินันท์ น้1อยมณี 41
ขั้นตอนต่างๆ จึงควรมีดังนี้
1. ต้องตัดการชี้ Next ของ Node ก่อนหน้า (Next ของ Node ก่อนหน้า)
2. Walk ชี้ Data อยู่ Node จึงไม่หลุดลอย ไม่ต้องสร้าง temp ด้วย
(Next ของ Node ที่จะแทรก)
3. (Back ของ Node ใหม่) ต้องไปชี้ Data เดิม
4. (Back ของ Node ถัดไป) ต้องมาชี้ Data ของ Node ใหม่
การเรียกใช้งาน: InsNode( now, 40 );
InsertNode
อ. กิตตินันท์ น้1อยมณี 42
22
33
44
11
InsertNode
อ. กิตตินันท์ น้1อยมณี 43
New เสร็จก็เอา
Data เข้าไปใส่
InsertNode
อ. กิตตินันท์ น้1อยมณี 44
ตรงนี้คือ Addr
ของ Node ใหม่
นั่นเอง
InsertNode
อ. กิตตินันท์ น้1อยมณี 45
คือ Node ใหม่
InsertNode
อ. กิตตินันท์ น้1อยมณี 46
• แต่ยังมี Bug ในการ Insert ตอนแรก (เพราะเข้าถึง Start ไม่ได้)
InsertNode
อ. กิตตินันท์ น้1อยมณี 47
ดังนั้นต้องแก้ให้สามารถแทรกด้านหน้าได้ด้วย
การเรียกใช้งาน: InsNode( now, 40, &start );
จะได้รู้ที่อยู่ของ start
InsertNode
อ. กิตตินันท์ น้1อยมณี 48
InsertNode
อ. กิตตินันท์ น้1อยมณี 49
กรณีไม่ยืนบน Node
แรกสุด
InsertNode
อ. กิตตินันท์ น้1อยมณี 50
กรณียืนบน Node
แรกสุด
InsertNode
อ. กิตตินันท์ น้1อยมณี 51
คือ Node ใหม่
InsertNode
อ. กิตตินันท์ น้1อยมณี 52
ตอนนี้
•ตรงกลางแทรกได้
•ตอนท้ายแทรกได้
•ตอนต้นแทรกได้
อ. กิตตินันท์ น้1อยมณี 53
DeleteNode
อ. กิตตินันท์ น้54อยมณี 54
DeleteNode
อ. กิตตินันท์ น้1อยมณี 55
• Step 1: ให้ Next ของ Node ก่อนหน้าชี้ไปยัง Node ถัดไป
 10   20   30  
start data nextback data nextback

now

walk
data nextback
DeleteNode
อ. กิตตินันท์ น้1อยมณี 56
• Step 1: ให้ Next ของ Node ก่อนหน้าชี้ไปยัง Node ถัดไป
 10   20   30  
start data nextback data nextback

now

walk
data nextback
1
DeleteNode
อ. กิตตินันท์ น้1อยมณี 57
• Step 2: Back ของ Node ถัดไป ชี้ไปยัง Node ก่อนหน้า
 10   20   30  
start data nextback data nextback

now

walk
data nextback
2
DeleteNode
อ. กิตตินันท์ น้1อยมณี 58
• Step 3: สร้าง temp มาเก็บ Node ถัดไป
 10   20   30  
start data nextback data nextback

now

walk
data nextback
3

temp
DeleteNode
อ. กิตตินันท์ น้1อยมณี 59
• Step 4: ให้ Now มาชี้ที่ Node ถัดไป
 10   20   30  
start data nextback data nextback

now

walk
data nextback

temp
DeleteNode
อ. กิตตินันท์ น้1อยมณี 60
• Step 4: ให้ Now มาชี้ที่ Node ถัดไป
 10   20   30  
start data nextback data nextback

now

walk
data nextback
4

temp
DeleteNode
อ. กิตตินันท์ น้1อยมณี 61
• สรุป
 10   20   30  
start data nextback data nextback

now

walk
data nextback
4

temp
3
2
1
DeleteNode
อ. กิตตินันท์ น้1อยมณี 62
 10   30  
start data nextback data next
• สุดท้ายจะเหลือแบบนี้
back

now

walk
DeleteNode
• จุดสังเกต
–ส่ง Now ไปให้ Walk
–ดังนั้นถ้า Walk อยู่ใน Node แรกสุด จะไม่สามารถลบ
Node ใหม่ได้เพราะเข้าถึง Start ไม่ได้
–วิธีการแก้คือ อาจจะส่ง &start ไปให้ DeleteNode() ด้วย
อีก 1 Parameter
อ. กิตตินันท์ น้1อยมณี 63
DeleteNode
• จุดสังเกต
–walk เป็น Pointer 2 ระดับ ที่ชี้ now อีกทีหนึ่ง เพราะถ้าลบ
เสร็จ now จะไม่มีที่ชี้
อ. กิตตินันท์ น้1อยมณี 64
DeleteNode
อ. กิตตินันท์ น้1อยมณี 65
• ถ้าให้เลือกระหว่าง
–ส่ง now ไปเฉยๆ
–ส่ง &now ไป
• ควรส่ง &now ไป เพราะเดี๋ยวเราจะต้องเปลี่ยนแปลงที่ชี้ด้วย
การเรียกใช้งาน: DelNode( &now );
DeleteNode
อ. กิตตินันท์ น้1อยมณี 66
DeleteNode
อ. กิตตินันท์ น้1อยมณี 67
4
1
2
3
DeleteNode
อ. กิตตินันท์ น้1อยมณี 68
ชี้ Next ของ 10
ชี้ Next ของ 30
เก็บ Addr ของ 30
ลบหน่วยความจําเลย
walk ยังลอยๆ อยู่, ปรับไป
ชี้ temp ที่เก็บ 30 ไว้
DeleteNode
อ. กิตตินันท์ น้1อยมณี 69
• ยังลบ Node สุดท้ายไม่ได้
• ลบ Node แรกก็ไม่ได้
DeleteNode
อ. กิตตินันท์ น้1อยมณี 70
เพื่อหา Node สุดท้าย
เก็บ Data ก่อนหน้าไว้
ป้องกันไม่ให้หาย
DeleteNode
อ. กิตตินันท์ น้1อยมณี 71
• ตอนนี้ลบ Node สุดท้ายได้แล้ว
• แต่ยังลบ Node แรกไม่ได้
DeleteNode
อ. กิตตินันท์ น้1อยมณี 72
จะได้รู้จุดเริ่มต้น
กรณีไม่ใช่ Node แรก
กรณีเป็น Node แรก
DeleteNode
อ. กิตตินันท์ น้1อยมณี 73
• กรณีนี้ก็ต้องเปลี่ยนการใช้งานใหม่ด้วย เป็น
การเรียกใช้งาน: DelNode( &now, &start );
อ. กิตตินันท์ น้1อยมณี 74
Example
อ. กิตตินันท์ น้75อยมณี 75
Example
อ. กิตตินันท์ น้1อยมณี 76
• ควรมี function ในการแสดงค่าภายใน Node ด้วย
• ควรแสดงได้ทั้ง “แบบเดินหน้า” และ “แบบถอยหลัง” เพื่อ
ตรวจดูว่าแต่ละ Node เชื่อมต่อกันถูกต้องมั้ย
Example
อ. กิตตินันท์ น้1อยมณี 77
Example
อ. กิตตินันท์ น้1อยมณี 78
AddNode
Example
อ. กิตตินันท์ น้1อยมณี 79
InsNode
Example
อ. กิตตินันท์ น้1อยมณี 80
สั่งให้ now อยู่จุดเริ่มต้น
แทรกหน้าสุด
ให้ now ขยับ 3 ครั้ง
Example
อ. กิตตินันท์ น้1อยมณี 81
Example
อ. กิตตินันท์ น้1อยมณี 82
• จริงๆ ควรจะมี function ที่สั่งให้กระโดดไปหา Node ที่เรา
ต้องการได้เลย เช่น goNext() และ goBack()
อ. กิตตินันท์ น้1อยมณี 83
Example
อ. กิตตินันท์ น้1อยมณี 84
หมายเหตุ: ตอนนี้ now อยู่ที่ 30 ก็เลยลบ 30 ออก
Example
อ. กิตตินันท์ น้1อยมณี 85
ถ้าอยากลบ Node แรก ก็ต้องให้ now ไปอยู่ที่ start
อ. กิตตินันท์ น้1อยมณี 86
Example
อ. กิตตินันท์ น้1อยมณี 87
• ในการเขียนโปรแกรมควรจัดเรียงโครงสร้างดังนี้
Include
Struct
Prototype
Main
Function
อ. กิตตินันท์ น้1อยมณี 88

(Big One) C Language - 06 ฟังก์ชันจัดกาลิงค์ลิสต์แบบสองทาง