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