Issuu on Google+

บทที่ 3 โครงสร้างข้อมูลแบบรายการโยง (Link List)


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

 

เป็ นการจัดเก็บข้อมูลที่เรี ยงต่อกันไปเหมือนอาร์เรย์ แต่ไม่ได้กาำ หนดขนาดไว้แน่นอน สามารถที่จะรับข้อมูลเพิ่ม ได้เรื่ อย ๆ มีความยืดหยุน่ สูง อาจจะยุง่ ยากและซับซ้อนกว่าอาร์เรย์ แต่เป็ นที่นิยมใช้กนั มาก ข้อมูลที่มีการจัดเก็บในลิงค์ลิสต์ไม่จาำ เป็ นต้องเก็บอยูใ่ นตำาแหน่งที่ ติดกัน สามารถจะเก็บตำาแหน่งใดก็ได้เพราะมีตวั เชื่อมโยง หรื อ ลิงค์ฟิลด์ สำาหรับเก็บ Address ต่อไป


ลักษณะโครงสร้างข้อมูลแบบรายการโยง  

จะประกอบด้วยหน่วยเก็บข้อมูลหรื อโหนด (Node) โดยหนึ่งโหนดมีส่วนประกอบสำาคัญ 2 ส่ วนคือ  

ส่ วนที่เก็บข้อมูล (Data) ส่ วนที่เก็บ Address ของโหนดถัดไป (Next) Data Next

1 โหนด


ลักษณะโครงสร้างข้อมูลแบบรายการโยง

A

B

C

^


ประเภทรายการโยง    

รายการโยงแบบเดี่ยว (Singly Linked Lists) รายการโยงแบบคู่ (Doubly Linked Lists) รายการโยงแบบวงกลม (Circular Linked Lists) รายการโยงแบบหลายทิศทาง (Multilinked Lists)


รายการโยงแบบเดี่ยว 

โหนดหนึ่ง ๆ จะประกอบไปด้วย 2 ส่ วน คือ ส่ วนที่เก็บข้อมูลและ ส่ วนที่เป็ นลิงค์ฟิลด์ การทำางานกับรายการโยงแบบเดี่ยวมี 5 ขั้นตอน ดังนี้     

การสร้าง การเพิ่ม การลบโหนด การแทรกโหนด การแสดงข้อมูลในรายการโยง


การสร้างรายการโยง   

เป็ นการจองเนื้ อที่ในหน่วยความจำาสำาหรับจัดเก็บข้อมูลใหม่ และจะต้องมีการสร้างตัวชี้ ไปยังโหนดแรก ในที่น้ ี ชื่อ Head ถ้าไม่กาำ หนดตัวชี้น้ ี การอ่านข้อมูลจะไม่ทราบว่าจะเริ่ มอ่าน ณ ตำาแหน่งใด สัญลักษณ์ต่าง ๆ มีดงั นี้    

Node(P) New(P) Data(P) Next(P)

หมายถึง โหนดที่ถูกชี้ดว้ ย P หมายถึง การสร้างโหนดใหม่ หมายถึง ข้อมูลที่เก็บอยูใ่ นโหนดที่ถกู ชี้ดว้ ย P หมายถึง ตำาแหน่งที่อยูข่ องโหนดถัดจากโหนด P


การสร้างรายการโยง Data

Head      

60

Next

90

Data(Head)  60 Next(Head)  โหนดที่ 2 Data(Next(Head))  90 Next(Next(Head))  โหนดที่ 3 Data(Next(Next(Head)))  120 Next(Next(Next(Head)))  Null

120

^


การสร้างรายการโยง Head

  

60

Tail 90

เพิ่มตัวชี้อีก 1 ตัวคือ Tail ทำาให้ทราบว่าตำาแหน่งสุ ดท้ายอยูท่ ี่ใด สามารถเพิ่มข้อมูลเข้าไปต่อท้ายได้ง่าย

120

^


การเพิ่มโหนด  

ก่อนที่จะมีการเพิ่มข้อมูลเข้าไปในโหนดจะต้องสร้างโหนดก่อน ซึ่งการเพิ่มโหนดมี 2 วิธีคือ  

การเพิ่มโหนดไว้ต่อจากโหนดสุ ดท้าย การเพิ่มโหนดไว้ก่อนโหนดแรก

กำาหนดตัวชี้ 2 ตัวคือ Head, Tail


การเพิ่มโหนดไว้ต่อจากโหนดสุ ดท้าย  

ถ้ามีขอ้ มูลมาเป็ นตัวแรกในรายการโยง คือ 10 จะมีข้นั ตอนวิธีดงั นี้

1. Head = Tail = Null 2. New(P) 3. Data(p) = 10 4. Next(p) = Null 5. Head = p 6. Tail = p

P

Head Tail

10

^


การเพิ่มโหนดไว้ต่อจากโหนดสุ ดท้าย เพิ่มข้อมูล 40 เข้าไปในรายการโยง 1. New(P) 4. Next(Tail) = p 2. Data(P) = 40 5. Tail = p 3. Next(p) = Null P 

Head Tail

10

^

40

^

Tail


การเพิ่มโหนดไว้ต่อจากโหนดสุ ดท้าย เพิ่มข้อมูล 90 เข้าไปในรายการโยง 1. New(P) 4. Next(Tail) = p 2. Data(P) = 90 5. Tail = p Tail 3. Next(p) = Null P Tail 

Head 10

40

^

90

^


การเพิ่มโหนดไว้ก่อนโหนดแรก เพิ่มข้อมูล 40 เข้าไปในรายการโยง 1. New(P) 2. Data(P) = 40 3. Next(P) = Head 4. Head = p 

P

Head

40

Head 10

Tail ^


การเพิ่มโหนดไว้ก่อนโหนดแรก เพิ่มข้อมูล 90 เข้าไปในรายการโยง 1. New(P) 2. Data(P) = 90 3. Next(P) = Head 4. Head = p 

P

Head

90

Head 40

Tail 10

^


การลบโหนด  

Head

จะต้องค้นหาตั้งแต่โหนดแรกคือ Head ชี้อยู่ ถ้าค่าที่ตอ้ งการลบตรงกับโหนดใด ก็จะลบออกได้ 10

20

โหนดทีต่ ้ องการลบ

30

Tail 40

^


การลบโหนดโดยเลื่อนตัวชี้ Head Head Head

10

20

Head 30

40

Head Tail 10

20

40

Tail

^

^


การลบโหนด 

เป็ นการดึงโหนดออกจากรายการโยง ทำาได้ 3 วิธี   

ลบโหนดแรก ลบโหนดตรงกลาง ลบโหนดสุ ดท้าย


ลบโหนดแรก Tail

P Head

10

20

30

40

^

Head = Next(Head) หรือ Head = Next(P) Tail Head

20

30

40

^


ลบโหนดภายใน P

Head

10

20

30

40

^

30

40

^

40

^

P Head

10

20

P Head

10

20

30


ลบโหนดภายใน Head

10

P 20

30

Next(Next(Head)) = Next(P)

40

^


ลบโหนดภายใน P

Head

10 BeforeP

Head

10

20

10

40

^

30

40

^

40

^

P 20 BeforeP

Head

30

20

P 30


การแก้ปัญหาโดยเพิ่มตัวชี้ BeforeP BeforeP Head

10

20

P 30

Next(BeforeP) = Next(P)

40

^


การลบโหนดสุ ดท้าย Head

10

20 Tail = BeforeP Next(Tail) = Null

Head

10

20

BeforeP

P Tail

30

40

^

BeforeP Tail 30

^


การแทรกโหนด    

เป็ นการแทรกโหนดใหม่เข้าไปในรายการโยง ก่อนจะแทรกจะต้องค้นหาตำาแหน่งที่จะแทรก มีการกำาหนดตัวชี้ P สำาหรับค้นหาตำาแหน่งที่จะแทรก โดย P จะเริ่ มต้นชี้ที่ตาำ แหน่ง Head ก่อนเสมอ


การแทรกโหนดใหม่ P

Head

10

20

40

P Head

10

20

40 1

Newnode

30

2


การแทรกโหนดใหม่ Head

10

P 20

40 1

Newnode 1. Next(P) = Newnode 2. Next(Newnode) = Next(P)

30

2


การแสดงข้อมูล   

เป็ นการดึงเอาข้อมูลที่มีอยูม่ าแสดง กำาหนดให้ตวั ชี้ P เริ่ มชี้ที่โหนด Head แล้วเลื่อนตัวชี้ P ไปเรื่ อย ๆ จนถึงโหนดสุ ดท้าย หรื อ Tail


P Head

10

P

Tail P

20

40 40

^


รายการโยงแบบคู่(Doubly Linked List) 

รายการโยงแบบคู่ 1 โหนดยังคงประกอบด้วย 2 ส่ วนก็คือ  

ส่ วนของข้อมูล (Data) ส่ วนลิงค์ฟิลด์ (Next)

สำาหรับลิงค์ฟิลด์จะมี 2 ตัวคือ  

ลิงค์ฟิลด์แรกจะเก็บตำาแหน่งที่อยูโ่ หนดก่อนหน้า หรื อด้านซ้าย(Prev) ลิงค์ฟิลด์ที่สองเก็บตำาแหน่งที่อยูโ่ หนดถัดไป หรื อด้านขวา (Next)


รายการโยงแบบคู่ Data คือ ข้อมูลที่เก็บในโหนด Next คือ เก็บตำาแหน่งที่อยูโ่ หนดถัดไป prev Prev คือ เก็บตำาแหน่งที่อยูโ่ หนดก่อนหน้า

1 node data next


P ^

10

Data(P) Next(P) Prev(P) Data(Next(P)) Data(Prev(P)) Prev(Next(P)) Next(Prev(P))

20

คือ คือ คือ คือ คือ คือ คือ

ค่า 20 โหนดถัดจากโหนด P หรื อโหนดที่ 3 โหนดก่อนโหนด P หรื อโหนดที่ 1 ค่า 30 ค่า 10 โหนดที่ 2 โหนดที่ 2

30

^


รายการโยงแบบคู่ 

การทำางานกับรายการโยงแบบคู่มี 5 ขั้นตอน ดังนี้     

การสร้าง การเพิม่ การลบโหนด การแทรกโหนด การแสดงข้อมูลในรายการโยง


การสร้างรายการโยงแบบคู่    

เหมือนกับรายการโยงแบบเดี่ยว แต่มีตวั ชี้ 2 ตัวคือ Next และ Prev กำาหนดตัวชี้โหนดแรกชื่อ Head ตัวชี้โหนดสุ ดท้ายชื่อ Tail


การเพิ่มโหนดในรายการโยง 

สามารถเพิ่มได้ 2 วิธี คือ  

การเพิม่ โหนดใหม่ต่อจากโหนดสุ ดท้าย การเพิ่มโหนดใหม่ก่อนหน้าโหนดแรก


การเพิ่มโหนดต่อจากโหนดสุ ดท้าย Head ^

A

P

Tail ^

1. Head=Tail=NULL 2. New(P) 3. Data(P) = A 4. Prev(P) = NULL 5. Next(P) = NULL 6. Head = P 7. Tail = P


การเพิ่มโหนดต่อจากโหนดสุ ดท้าย 1. New(P) 2. Data(P) = B 3. Next(P) = NULL 4. Prev(P) = Tail 5. Next(Tail) = P 6. Tail = P

Head ^

A

Tail

Tail

^

B

P

^


การเพิ่มโหนดต่อจากโหนดสุ ดท้าย

Head ^

A

. New(P) . Data(P) = C . Next(P) = NULL

Tail B

^

4. Prev(P) = Tail 5. Next(Tail) = P 6. Tail = P

Tail C

^

P


การเพิ่มโหนดก่อนโหนดแรก  

แบบฝึ กหัด เขียนขั้นตอนการเพิ่มโหนดใหม่ต่อจากโหนดแรก เช่น เพิ่มโหนด B เข้าไป มีข้ นั ตอนอย่างไร P B

Head ^

A

Tail ^


EX: การเพิ่มโหนดก่อนโหนดแรก P ^

B

1. New(P) 2. Data(P) = B 3. Prev(Head) = P

Head ^

A

Tail ^

4. Next(P) = Head 5. Head = P 6. Prev(P) = NULL


การลบโหนดในรายการโยง Head ^

A

P

P

P

B

C

Prev(P) Tail

D Next(P)

^


การลบโหนดในรายการโยง Head ^

P

A

B

2

C

Prev(P) 1. Next(Prev(P)) = Next(P)

1

2. Prev(Next(P)) = Prev(P)

A

D

^

Next(P) Tail

Head ^

Tail

B

D

^


การแทรกโหนดใหม่   

แทรกเป็ นโหนดแรก แทรกตรงกลาง (ก่อนโหนด P หรื อหลังโหนด P) แทรกเป็ นโหนดสุ ดท้าย


การแทรกก่อนโหนด P Head ^

P

A

B 2

1

3 E

Newnode

D

4 Tail

^


การแทรกก่อนโหนด P P ^

A

B 2

1

3 E

Newnode

4

1. 2. 3. 4.

Prev(newnode) =Prev(p) Next(prev(P)) = newnode Next(newnode) = p Prev(p) = newnode


การแทรกหลังโหนด P Head ^

A

P B

D 4

3

2 E

Newnode

1

^


1. Prev(next(p)) = newnode 2. Next(newnode) = next(P) 3. Prev(newnode) = P 4. Next(P) = newnode

P B

D 4

3

2 E

Newnode

1


การแสดงข้อมูลในรายการโยง 

เป็ นการดึงข้อมูลในรายการโยงออกมาแสดงเหมือนกับรายการโยง แบบเดี่ยว โดยดึงข้อมูลตั้งแต่โหนดแรก (Head) มาเรื่ อย ๆ จนถึงโหนด สุ ดท้าย (Tail)


Head ^

Tail

A P

B P

แสดงข้ อมูลในลิงค์ลสิ ต์

D P

^


รายการโยงแบบวงกลม (Circular Linked List) 

ปกติแล้วไม่วา่ จะเป็ นรายการโยงแบบเดี่ยวหรื อแบบคู่ link ของ โหนดสุ ดท้ายจะเป็ น Null แต่ถา้ เป็ นรายการโยงแบบวงกลม  

กรณี ที่เป็ นรายการโยงแบบเดี่ยว link โหนดสุ ดท้ายจะชี้มาที่โหนดแรก กรณี ที่เป็ นรายการโยงแบบคู่ link ของโหนดแรกจะชี้ไปยังโหนด สุ ดท้าย และ link ของโหนดสุ ดท้ายจะชี้มาที่โหนดแรก


ตัวอย่างรายการโยงเดี่ยวแบบวงกลม Head 10

Tail 20

40

^


ตัวอย่างรายการโยงคู่แบบวงกลม Head ^

A

B

D Tail

^


รายการโยงแบบหลายทิศ���าง 

เป็ นการลิงค์ฟิลด์ไปยังโหนดต่าง ๆ มากกว่า 2 ตัว Prev

NamePtr Train_Nam

โหนดเก็บชื่อโครงการอบรม

Next

Name

Next_element

โหนดเก็บชื่อสมาชิก


รายการโยงแบบหลายทิศทาง Prev

NamePtr Train_Nam

^

Web

Next

Prev

NamePtr Train_Nam

PHP

ชณพงษ์

จิราภรณ์

ชณภัทร

จิรันธร

ทิพวรรณ ^

พันทิวา ^

Next

^


โหนดต้นรายการ (Dummy Header)    

ที่ผา่ นมาจะกำาหนดให้ Head ชี้ไปยังข้อมูลโหนดแรก แต่ถา้ ไม่มีขอ้ มูลในลิสต์ Head จะชี้ไปที่ Null ซึ่งถ้านับจำานวนข้อมูลในลิสต์จะเสี ยเวลาในการนับจำานวน ดังนั้นจึงมีการสร้างโหนดพิเศษไว้ก่อนหน้าโหนดแรกที่มีขอ้ มูล เรี ยกว่า โหนดต้นรายการ ซึ่ งโหนดนี้ จะเก็บจำานวนโหนดที่อยูใ่ น รายการ


Head

3

Head

60

90

120 Tail

^


การประยุกต์ใช้โครงสร้างข้อมูลแบบรายการโยง  

ฟังก์ชนั โพลิโนเมียล เมตริ กซ์ที่มีเลขศูนย์จาำ นวนมาก


ฟังก์ชนั โพลิโนเมียล     

คือฟังก์ชนั ในรู ป p(x)=anxn + an-1xn-1+…a0 a คือ สัมประสิ ทธิ์หน้าตัวแปร X คือ ตัวแปร n คือ จำานวนเต็มที่มากกว่าหรื อเท่ากับศูนย์ เช่น 4x10 + 2x8+5


ฟังก์ชนั โพลิโนเมียล 

การจัดเก็บสมการโพลิโนเมียลแบบนี้ ต้องใช้รายการโยง นัน่ คือกำาหนด ลักษณะของโหนดดังนี้ XExp Ceof Next

XExp คือ ส่ วนที่เก็บกำาลังของตัวแปรที่ใช้ Ceof คือ สัมประสิ ทธิ์ ของแต่ละเทอม Next คือ ตัวชี้ไปยังตำาแหน่งโหนดถัดไป

 


เช่น 4x10 + 2x8+5 10

4

Head

8

2

0

5

^


กรณี ฟังก์ชนั มีหลายตัวแปร 5X2 + 2XY + Y2 + YZ Xexp Yexp Zexp Coef Next 


กรณี ฟังก์ชนั มีหลายตัวแปร 

5X2 + 2XY + Y2 + YZ

Xexp Yexp

2 0 0 5

Head

Zexp

1 1 0 2

Coef Next

0 2 0 1

0 1 1 1 ^


แบบฝึ กหัด  

จากฟังก์ชนั ต่อไปนี้ ให้แทนด้วยรายการโยงแบบเดี่ยว 5X10 + 7X8 + 8X2 + 6X11 + 7


บทที่3