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

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
Advertisements

Lists Data Structure LAUKHWAN NGAMPRASIT LAUKHWAN NGAMPRASIT.
โดยอาจารย์ศิริพร ศักดิ์บุญญารัตน์ ครูชำนาญการ โรงเรียนมหิดลวิทยานุสรณ์
ข้อมูลชนิดสตริง String บทที่ 8
โครงสร้างของโหนด Successor = Node ที่อยู่ถัดไปจาก Node ที่ใช้งานอยู่
บทที่ 6 โครงสร้างข้อมูลลิ้งค์ลิสต์
[][Data][] [][1][]<->[][5][]<->[][3][]<->[][8][null]
บทที่ 6 โครงสร้างข้อมูลลิ้งค์ลิสต์
บทที่ 5 โครงสร้างข้อมูลคิว
ครั้งที่ 12 การค้นหาข้อมูล (Searching)
BC322 ครั้งที่ 6 Text file BC322 : computer Programming (Week6)
การรับค่าและแสดงผล.
บทที่ 11 การเขียนโปรแกรมโดยใช้ข้อมูลชนิดพอยท์เตอร์
Hashing Function มีหลายฟังก์ชั่น การเลือกใช้ขึ้นอยู่กับความเหมาะสมของข้อมูล ตัวอย่างของฟังก์ชั่นแฮชมีดังนี้ 1. Mod คือการนำค่าคีย์มา mod ด้วยค่า n ใด.
ตัวแปรชนิดโครงสร้าง (Structure)
Functional programming part II
Lecture No. 3 ทบทวนทฤษฎีและแบบฝึกหัด
Stack.
1. จงหาผลลัพธ์จากโปรแกรมต่อไปนี้
Structure.
การแก้ปัญหาด้วยคอมพิวเตอร์
รับและแสดงผลข้อมูล.
โครงสร้างภาษาซี.
Linked-List (รายการโยง)
ฟังก์ชั่น function.
การประกาศตัวแปร “ตัวแปร” คือสิ่งที่เราสร้างขึ้นมาเพื่อใช้เก็บค่าต่างๆและอ้างอิงใช้งานภายในโปรแกรม ตามที่เรากำหนดขึ้น การสร้างตัวแปรขึ้นมาเราเรียกว่า.
Arrays.
บทที่ 12 Structure and union Kairoek choeychuen
คิวQueue Circular Queue.
C Programming Lecture no. 6: Function.
ขั้นตอนวิธี (Algorithm)
ข้อมูลชนิดอาร์เรย์ ประเภทของข้อมูลที่ผ่านมาส่วนใหญ่ในตอนต้นๆจะเป็นข้อมูลเดี่ยว โดยตัวแปรหนึ่งตัวสามารถเก็บข้อมูลได้หนึ่งตัว ถ้าหากต้องการเก็บข้อมูลหลายตัวจะต้องประกาศตัวแปรหลายตัว.
หน่วยที่ 1 พื้นฐานภาษา C
อาร์เรย์และข้อความสตริง
ตัวอย่างโปรแกรมคำนวณหาพื้นที่สี่เหลี่ยม
ลิ้งค์ลิสต์วงกลม วิธีการที่ทำให้สามารถวิ่งจาก โหนดหนึ่งจะไม่สามารถชี้กลับไป ยังโหนดอื่น ๆ ได้ในลิ้งค์ลิสต์ โดยให้ตัวชี้ของโหนดสุดท้ายซึ่ง เดิมเป็นค่า NULL.
การเขียนโปรแกรมภาษาซี
ตัวแปรกับชนิดของข้อมูล
โครงสร้างข้อมูลแบบคิว
ง30212 การเขียนโปรแกรมภาษาคอมพิวเตอร์ โรงเรียนปลวกแดงพิทยาคม
แถวลำดับ (array) ง40202 การเขียนโปรแกรมด้วยภาษาคอมพิวเตอร์
List ADTs By Pantharee S..
Linked List (ลิงค์ลิสต์)
ตัวแปรกับชนิดของข้อมูล
Week 12 Engineering Problem 2
บทที่ 5 Link List Link List.
การประมวลผลสายอักขระ
Week 12 Engineering Problem 2
Linked List List is group of nodes that consists of data and link.
2 /* ข้อความนี้เป็นเพียงคำอธิบาย ไม่มีผลต่อขั้นตอนการ ทำงานของโปรแกรม */ /* A simple program to display a line of text */ #include void main ( ) { printf.
โปรแกรม Microsoft Access
ลิงค์ลิสต์ (Linked List)
วิชา COSC2202 โครงสร้างข้อมูล (Data Structure)
หลักการเขียนโปรแกรม ( )
กองซ้อน ยอดกองซ้อน (stack).
โครงสร้างโปรแกรมภาษาซี
Output of C.
รายการโยง (linked lists) หอยทอด 30 ข้าวผัด 30 ไก่ย่าง 50 เนื้อทอด 30
โครงสร้างข้อมูลแบบลิงก์ลิสต์
โครงสร้าง ภาษาซี.
บทที่ 9 การสร้างและใช้ งานฟังก์ชั่น C Programming C-Programming.
CONDITION Computer Programming Asst. Prof. Dr. Choopan Rattanapoka.
แนะนำการเขียนโปรแกรมภาษา C Introduction to C Programming Language
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Int isEmpty ( node **ptr_head) ; parameter ชื่อของตัวแปรลิสต์ที่จะตรวจสอบว่า ว่างหรือไม่ return value มีได้ 2 สถานะ คือ ว่าง (1) หรือ ไม่ ว่าง (0) body.
บทที่ 10 การจัดการไฟล์ อาจารย์ศศลักษณ์ ทองขาว สงวนลิขสิทธิ์ © 2547 มหาวิทยาลัยราช ภัฏสงขลา C Programming C-Programming.
รายการ (Lis t) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong.
Computer Programming Asst. Prof. Dr. Choopan Rattanapoka
Linked List (2) Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
ใบสำเนางานนำเสนอ:

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

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

ลักษณะโครงสร้างข้อมูลแบบรายการโยง จะประกอบด้วยหน่วยเก็บข้อมูลหรือโหนด (Node) โดยหนึ่งโหนดมีส่วนประกอบสำคัญ 2 ส่วนคือ ส่วนที่เก็บข้อมูล (Info) ส่วนที่เก็บ Address ของโหนดถัดไป (Link) Info Link 1 โหนด

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

ประเภทรายการโยง รายการโยงแบบเดี่ยว (Singly Linked Lists) รายการโยงแบบคู่ (Doubly Linked Lists)

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

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

LINK(LINK(Head))  โหนดที่ 3 INFO(LINK(LINK(Head)))  120 การสร้างรายการโยง INFO LINK Head 60 90 120 ^ INFO(Head)  60 LINK(Head)  โหนดที่ 2 INFO(LINK(Head))  90 LINK(LINK(Head))  โหนดที่ 3 INFO(LINK(LINK(Head)))  120 LINK(LINK(LINK(Head)))  Null

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

คำสั่งสร้างรายการโยงด้วยภาษาซี typedef struct node { int info; struct node *link; } node; node *Head, *Tail; int info; node INFO Link

การเพิ่มโหนด ก่อนที่จะมีการเพิ่มข้อมูลเข้าไปในโหนดจะต้องสร้างโหนดก่อน ซึ่งการเพิ่มโหนดมี 2 วิธีคือ การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย การเพิ่มโหนดไว้ก่อนโหนดแรก กำหนดตัวชี้ 2 ตัวคือ Head, Tail

การเพิ่มโหนดไว้ต่อจากโหนดสุดท้าย ถ้ามีข้อมูลมาเป็นตัวแรกในรายการโยง คือ 10 จะมีขั้นตอนวิธีดังนี้ 1. Head = Tail = Null P 2. New(P) Head 3. INFO(p) = 10 10 ^ 4. Link(p) = Null Tail 5. Head = p 6. Tail = p

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

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

เปรียบเทียบคำสั่งในภาษาซี New(P) INFO(P) = info Link(P) = Null Link(Tail) = P Tail = P P = new node P->info= info P->link = null Tail->Link= P Tail = P

โปรแกรมเพิ่มโหนดในภาษาซี #include <stdio.h> #include <conio.h> typedef struct node { int data; struct node *next; } node; main() { node *head,*tail,*p; int info; head = NULL; printf(“Enter number = “);scanf(“%d”,&info); p = new node; p->data = info; p->next = NULL; if (head==NULL) { head=p; tail=p; } else { tail->next = p; tail = p; } }

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

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

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

การลบโหนดโดยเลื่อนตัวชี้ Head 10 20 30 40 ^ Tail Head Head Head 10 20 40 ^ Tail Head

การลบโหนด เป็นการดึงโหนดออกจากรายการโยง ทำได้ 3 วิธี ลบโหนดแรก ลบโหนดตรงกลาง ลบโหนดสุดท้าย

ลบโหนดแรก 10 Head 20 30 40 ^ Tail P Head = Link(Head) หรือ Head = Link(P) Head 20 30 40 ^ Tail

ลบโหนดภายใน Head 10 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P

ลบโหนดภายใน 10 Head 20 30 40 ^ Tail P Link(Link(Head)) = Link(P)

ลบโหนดภายใน Head 10 20 30 40 ^ Tail P 10 Head 20 30 40 ^ Tail P BeforeP 10 Head 20 30 40 ^ Tail P BeforeP

การแก้ปัญหาโดยเพิ่มตัวชี้ BeforeP 10 Head 20 30 40 ^ Tail P BeforeP Link(BeforeP) = Link(P)

การลบโหนดสุดท้าย 10 Head 20 30 40 ^ Tail BeforeP P Tail = BeforeP Link(Tail) = Null 10 Head 20 30 Tail BeforeP ^

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

การแทรกโหนดใหม่ P Head 10 20 40 Head 10 20 40 P 1 2 Newnode 30

การแทรกโหนดใหม่ Head Newnode 30 10 20 40 P 1 2 Link(P) = Newnode 2. Link(Newnode) = Link(P)

การแทรกโหนดใหม่ Newnode 30 Head 10 20 40 Tail P 1 2 2. Link(Newnode) = Link(P) Link(P) = Newnode

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

Head 10 20 ^ 40 Tail P P P 10 20 40

สร้างฟังก์ชันเมนู Showmenu() { printf(“ M E N U \n”); printf(“ 1. Add Link List\n”); printf(“ 2. Delete Link List\n”); printf(“ 3. Insert After \n”); printf(“ 4. Display Data\n”); printf(“ 5. Exit \n”); printf(“ Please Select [1-5] “); }

คำสั่งสร้างรายการโยงด้วยภาษาซี typedef struct node { int code; char name[15]; float gpa; struct node *next; } node; node *Head, *Tail; int info; data next name gpa code next

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

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

^ 10 20 30 P Data(P) คือ ค่า 20 Next(P) คือ โหนดถัดจากโหนด P หรือโหนดที่ 3 Prev(P) คือ โหนดก่อนโหนด P หรือโหนดที่ 1 Data(Next(P)) คือ ค่า 30 Data(Prev(P)) คือ ค่า 10 Prev(Next(P)) คือ โหนดที่ 2 Next(Prev(P)) คือ โหนดที่ 2

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

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

คำสั่งสร้างรายการโยงด้วยภาษาซี typedef struct node { int data; struct node *next,*prev; } node; node *Head, *Tail; int info; node prev data next

การเพิ่มโหนดในรายการโยง สามารถเพิ่มได้ 2 วิธี คือ การเพิ่มโหนดใหม่ต่อจากโหนดสุดท้าย การเพิ่มโหนดใหม่ก่อนหน้าโหนดแรก

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

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

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

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

การลบโหนดในรายการโยง Head P P P Tail ^ A B C D Prev(P) Next(P)

การลบโหนดในรายการโยง 2 P Tail ^ A B C D Head 1 Prev(P) Next(Prev(P)) = Next(P) Prev(Next(P)) = Prev(P) Next(P)

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

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

การแทรกก่อนโหนด P ^ A B D Tail P 4 1 3 2 E Newnode

การแทรกก่อนโหนด P ^ A B D Tail P 1 E Newnode

^ A B P 4 1 3 2 3. Prev(newnode) =Prev(p) 4. Next(prev(newnode)) = newnode E Newnode 2. Next(newnode) = p 1. Prev(p) = newnode

การแทรกหลังโหนด P ^ A B D Head P 4 1 3 2 E Newnode

B D P 4 1 3 2 1. Prev(next(p)) = newnode E Newnode 2. Next(newnode) = next(P) 3. Prev(newnode) = P 4. Next(P) = newnode

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

แสดงข้อมูลในลิงค์ลิสต์ ^ A B D Head Tail A B D P P P แสดงข้อมูลในลิงค์ลิสต์

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

ตัวอย่างรายการโยงแบบวงกลม 60 90 120 Head Tail ^

ตัวอย่างรายการโยงแบบวงกลม A B D Tail Head