22
24/11/56 Advance Computer Programming: .กิตตินันท์ น้อยมณี 1 ฟังกชันจัดการลงคลสตแบบสองทาง 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

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

  • Upload
    -

  • View
    8

  • Download
    1

Embed Size (px)

Citation preview

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 1

ฟังก์ชันจัดการลิงค์ลิสต์แบบสองทาง

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 2

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 3

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 4

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 5

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 6

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 7

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 สุดท้าย

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 8

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 9

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 10

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 11

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

2233

44

11

InsertNode

อ. กิตตินนัท์ น้1อยมณี 43

New เสร็จก็เอา Data เข้าไปใส่

InsertNode

อ. กิตตินนัท์ น้1อยมณี 44

ตรงนี้คือ Addrของ Node ใหม่

นั่นเอง

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 12

InsertNode

อ. กิตตินนัท์ น้1อยมณี 45

คือ Node ใหม่

InsertNode

อ. กิตตินนัท์ น้1อยมณี 46

• แต่ยังม ีBug ในการ Insert ตอนแรก (เพราะเข้าถงึ Start ไม่ได้)

InsertNode

อ. กิตตินนัท์ น้1อยมณี 47

ดังนั้นต้องแก้ให้สามารถแทรกด้านหน้าได้ด้วย

การเรียกใช้งาน: InsNode( now, 40, &start );

จะได้รู้ที่อยู่ของ start

InsertNode

อ. กิตตินนัท์ น้1อยมณี 48

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 13

InsertNode

อ. กิตตินนัท์ น้1อยมณี 49

กรณีไม่ยืนบน Node แรกสุด

InsertNode

อ. กิตตินนัท์ น้1อยมณี 50

กรณียืนบน Node แรกสุด

InsertNode

อ. กิตตินนัท์ น้1อยมณี 51

คือ Node ใหม่

InsertNode

อ. กิตตินนัท์ น้1อยมณี 52

ตอนนี้

• ตรงกลางแทรกได้• ตอนท้ายแทรกได้• ตอนต้นแทรกได้

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 14

อ. กิตตินนัท์ น้1อยมณี 53

FIN 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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 15

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 16

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

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 17

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 ไว้

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 18

DeleteNode

อ. กิตตินนัท์ น้1อยมณี 69

• ยังลบ Node สุดท้ายไม่ได้

• ลบ Node แรกก็ไม่ได้

DeleteNode

อ. กิตตินนัท์ น้1อยมณี 70

เพื่อหา Node สุดท้าย

เก็บ Data ก่อนหน้าไว้ ป้องกันไม่ให้หาย

DeleteNode

อ. กิตตินนัท์ น้1อยมณี 71

• ตอนนี้ลบ Node สุดท้ายได้แล้ว

• แต่ยังลบ Node แรกไม่ได้

DeleteNode

อ. กิตตินนัท์ น้1อยมณี 72

จะได้รู้จุดเริม่ต้น

กรณีไม่ใช่ Node แรก

กรณีเป็น Node แรก

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 19

DeleteNode

อ. กิตตินนัท์ น้1อยมณี 73

• กรณีนี้ก็ต้องเปลี่ยนการใช้งานใหม่ด้วย เป็น

การเรียกใช้งาน: DelNode( &now, &start );

อ. กิตตินนัท์ น้1อยมณี 74

FIN?

Example

อ. กิตตินนัท์ น้75อยมณี 75

Example

อ. กิตตินนัท์ น้1อยมณี 76

• ควรมี function ในการแสดงค่าภายใน Node ด้วย

• ควรแสดงได้ทัง้ “แบบเดินหน้า” และ “แบบถอยหลัง” เพื่อ

ตรวจดูว่าแต่ละ Node เชื่อมต่อกันถูกต้องมัย้

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 20

Example

อ. กิตตินนัท์ น้1อยมณี 77

Example

อ. กิตตินนัท์ น้1อยมณี 78

AddNode

Example

อ. กิตตินนัท์ น้1อยมณี 79

InsNode

Example

อ. กิตตินนัท์ น้1อยมณี 80

สั่งให้ now อยู่จุดเริ่มต้นแทรกหน้าสุด

ให้ now ขยับ 3 ครั้ง

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 21

Example

อ. กิตตินนัท์ น้1อยมณี 81

Example

อ. กิตตินนัท์ น้1อยมณี 82

• จริงๆ ควรจะม ีfunction ที่สั่งให้กระโดดไปหา Node ที่เรา

ต้องการได้เลย เช่น goNext() และ goBack()

อ. กิตตินนัท์ น้1อยมณี 83

FIN?Example

อ. กิตตินนัท์ น้1อยมณี 84

หมายเหตุ: ตอนนี้ now อยู่ที่ 30 ก็เลยลบ 30 ออก

24/11/56

Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 22

Example

อ. กิตตินนัท์ น้1อยมณี 85

ถ้าอยากลบ Node แรก ก็ต้องให้ now ไปอยู่ที่ start

อ. กิตตินนัท์ น้1อยมณี 86

FIN?

Example

อ. กิตตินนัท์ น้1อยมณี 87

• ในการเขียนโปรแกรมควรจัดเรียงโครงสร้างดังนี้

Include

Struct

Prototype

Main

Functionอ. กิตตินนัท์ น้1อยมณี 88

FIN?