LinkList.pptx

Download Report

Transcript LinkList.pptx

โครงสร้ างข้ อมูลแบบลิงก์ลิสต์
อาจารย์ พิศิษฐ์ นาคใจ
มหาวิทยาลัยราชภัฏอุตรดิตถ์
ลิงก์ลิสต์
• Linked List เป็ นโครงสร้ างที่จดั เก็บด้ วยโหนด (node)
ต่อเนื่องกันไป ภายในโหนดจะประกอบด้ วย 2 ส่วนคือ ส่วนที่จดั เก็บ
ข้ อมูล(Data) และส่วนที่ยงั จัดเก็บพอยเตอร์ (Pointer) ไปยัง
โหนดถัดไป ยกเว้ นตัวสุดท้ ายจะเก็บเป็ น Null Pointer
3
A
0
77
1
Z
2
30
6
W
6
12
E
66
nul
l
A
30
77
Z
12
30
W
88
12
E
null
66
• เริ่มต้ นโหนดแรกของ Linklist เริ่มที่ Address 77 ภายในเก็บข้ อมูล
ตัวอักษร A ไว้ ภายใน และยังเก็บ Address 30 ซึง่ เป็ นโหนดถัดไปอีก
ด้ วย
Dummy Node
• โดยทัว่ ไปแล้ วจะมี Dummy Node เพื่อเป็ นตัวชี ้ตาแหน่งเริ่มต้ น
ไว้ เพื่อบอกให้ ทราบว่า Linklist นี ้มีตาแหน่งเริ่มที่ตาแหน่งใด แต่
ภายใน Dummy node จะมีข้อมูล Address เริ่มต้ นของ
Linklist เพียงตัวเดียHea
ว
d
Dummy Node ชนิดที่มีหนึง่
Pointer
null
Dummy Node
• Dummy Node ชนิดที่ 2 เป็ นชนิดที่มี 2 พอยเตอร์ โดยที่เก็บ
Address ทังหั
้ วและหางของ LinkList โดยที่ Head จะชี ้ไป
Address เริ่มต้ นของ Linklist และ Tail จะชี ้ไปยัง
Address สุดท้ ายของ Linklist
• ข้ อดีคือ กรณีที่จะทาการแทรกข้ อมูลท้ ายสุด ไม่จาเป็ นต้ องวิ่งไปใน
List เพื่อหา3Address สุ1ดท้ าย สามารถใช้
8 ข้อมูลจาก nul
A
Z
W
E l
0Node ได้ เลย2
8
Dummy
77
30
12
66
hea
d
tail
พอยน์เตอร์ และหน่วยความจาในภาษาซี
• ตัวแปลพอยน์เตอร์ คือ ตัวแปรที่เก็บที่อยูข่ องข้ อมูลเอาไว้ เช่นถ้ าต้ องการ
สร้ างตัวแปรพอยน์เตอร์ ที่ชี ้ไปยังบล๊ อคของหน่วยความจาที่เก็บค่า
จานวนเต็มเอาไว้ ในภาษาซีเขียนได้ ดงั นี ้
int *p
คาสัง่ พื ้นฐานในภาษาซี
• malloc เป็ นฟั งก์ชนั่ ในการสร้ างเนื ้อที่ใหม่ในหน่วยความจา
malloc จะทาการหาเนื ้อที่ในหน่วยความจา
• sizeof เป็ นฟั งก์ชนั่ ที่ค้นหาจานวนขนาดกลุม่ ข้ อมูลนันๆ
้
(Struct)
• type case ใช้ กาหนดชนิดข้ อมูลนอกเหนือจากที่มีอยูแ่ ล้ ว
• free เป็ นฟั งก์ชนั่ ที่ทาการคืนหน่วยความจาให้ กบั Memory
ตัวอย่างการใช้ งานพอยเตอร์
int *A,*B;
A = (int *)malloc(sizeof(int)); A
B = (int *)malloc(sizeof(int)); B
A
5
*A = 5;
*B = 17;
B
17
A
free(A);
B
A = B;
A
B
17
17
??
??
การประกาศโครงสร้ างของ List
typedef struct node_ptr{
int data;
struct node_ptr *next;
};
การท่องไปใน Linked List
• การท่องไปในลิตส์ คือการเข้ าถึงสมาชิกข้ อมูลจากตัวแรกถึงตัวสุดท้ าย
โดยใช้ Pointer อาจจะเป็ นการสืบค้ นข้ อมูลภายใน List เราไม่
สามารถไปยังสมาชิกอื่นๆ ได้ โดยที่ไม่ผ่านตัวที่ 1 ถึงตัวที่ n ได้
H
3
A
0
77
Z
30
1
2
8
W
8
12
E
66
nul
l
การท่องไปใน Linked List
• เมื่อเราต้ องการเลื่อน Dummy Node ไปหา Address
ถัดไป จะทาให้ ไม่สามารถย้ อนกลับมายัง ต้ น ของ list ได้ ดงั นันต้
้ องมี
dummy Node อีกตัวเพื่อเก็บ Address เริ่มต้ นของ List
ไว้
• เมื่อเริ่มท่องไปใน List เราต้ องให้ tmp มีคา่ Address เดียวกับ
H เสียก่อนเพืtm่อจะเริ่มค้ นหาข้ อมูลจากตัวแรกไปเรื่ อยๆ
p
H
3
A
0
77
Z
30
1
2
8
W
8
12
E
66
nul
l
การท่องไปใน Linked List ต่อ
1. จากรูปเราให้ H เก็บตาแหน่งต้ น List ไว้ และให้ Tmp เป็ นคน
เลื่อนตาแหน่ง (tmp = H)
2. วิธีการเลื่อน คือให้ tmp เก็บค่า Address ของตาแหน่งถัดไป
(tmp = tmp->next)
3. จากนันให้
้ Tmp เลื่อนไปยังตัวแหน่งถัดไปเรื่ อยๆ จนหว่าจะเจอค่า
null เป็ นอันสิ ้นสุtm
pด
H
3
A
0
77
Z
30
1
2
8
W
8
12
E
66
nul
l
ตัวอย่างภาษาซี
tmp = H;
while(tmp != null){
printf(“%d”,tmp->data);
tmp = tmp->next;
}
โอเปอร์ เรชันที่ใช้ ใน Linklist
สาหรับโอเปอร์ เรชัน่ มี 2 ชนิดคือ
1. การเพิ่มข้ อมูล
2. การลบข้ อมูล
การเพิ่มข้ อมูล เป็ นการเพิ่ม Node ใหม่ที่บรรจุข้อมูลเข้ ามาใน List
การเพิ่มข้ อมูลจะแบ่งออกเป็ น
1. การเพิ่มด้ านหน้ า
2. การเพิ่มด้ านหลัง
3. การเพิ่มตรงกลาง
การเพิ่มข้ อมูล
ขันตอนการเพิ
้
่มข้ อมูล
1. ประกาศตัวแปลพอยเตอร์ node_ptr new;
2. ทาการจัดหาหน่วยความจา
new = (node_ptr
*)(malloc(sizeof(node_ptr)))
3. นาข้ อมูลใส่เข้ าไปใน List
new->element = 10;
4. นาโหนดเข้ าสู่ List
การแทรก List ที่ตาแหน่งต่างๆ
1. แทรกด้ านหน้ า
2. แทรกด้ านหลัง
3. แทรกระหว่างตาแหน่ง
การลบข้ อมูลของ List
• การลบข้ อมูล เป็ นการลบข้ อมูลที่อยูใ่ นสายของ List โดยจะทาการ
ค้ นหาข้ อมูลภายใน List เมื่อเจอก็จะทาการลบข้ อมูล แต่เมื่อลบ
ข้ อมูลแล้ วเราจาเป็ นต้ องทาการ ปรับแต่ง List เพื่อให้ List เป็ น
ข้ อมูลที่ถกู ต้ องและยังสามารถใช้ งานได้ ตอ่ ไป
การลบ List ที่ตาแหน่งต่างๆ
1. ลบ List ที่อยูด่ ้ านหน้ าสุด
2. ลบ List ที่อยูด่ ้ านหลังสุด
3. ลบ List ที่อยูต่ รงกลาง
Quiz
จงบอกข้ อดีของการใช้ Linklist มา 2 ข้ อ
จงบอกข้ อเสียของการใช้ Linklist มา 3 ข้ อ