รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
[][Data][] [][1][]<->[][5][]<->[][3][]<->[][8][null]
Advertisements

วิชา COSC2202 โครงสร้างข้อมูล (Data Structure)
โครงสร้างข้อมูลแบบรายการโยง (Link List)
ประกาศกรมสวัสดิการและคุ้มครองแรงงาน เรื่อง หลักเกณฑ์และวิธีการเลือกตั้งคณะกรรมการสวัสดิการในสถานประกอบกิจการ ประกาศราชกิจจานุเบกษา วันที่ 22 พฤษภาคม.
Int isEmpty ( node **ptr_head) ; parameter ชื่อของตัวแปรลิสต์ที่จะตรวจสอบว่า ว่างหรือไม่ return value มีได้ 2 สถานะ คือ ว่าง (1) หรือ ไม่ ว่าง (0) body.
รายการ (Lis t) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong.
PHPPHP การเขียนโปรแกรมคอมพิวเตอร์ 1 สาขาวิชาระบบสารสนเทศ คณะเทคโนโลยีการจัดการ.
บทที่ 6 บทที่ 6 คำสั่งแก้ไขปัญหาแบบ เลือก (CONDITION)
บทที่ 5 การควบคุมทิศทางการทำงานของโปรแกรม
หลักการโปรแกรม 1 Lecture 14: โปรแกรมย่อย ( การส่งพารามิเตอร์ แบบ pass by reference)
Click Here Click Here. หน้าแรก รายละเอียด LINK Microsoft Word Microsoft Word โปรแกรมการพิมพ์ เอกสาร จดหมายที่มีผู้ใช้งานมากที่สุดใน โลก ! ผมคิดว่ายังงั้น.
หน่วยการเรียนรู้ที่ 2 หลักการแก้ปัญหาด้วยคอมพิวเตอร์
กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
หน่วยที่ 5 การเวียนเกิด
DATA STRUCTURE AND ALGORITHM Linked List.
และสร้างเว็บไซต์ประเภทCMS
หน่วยที่ 6 แถวลำดับ (Array)
Linked List (2) Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
Queue Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
โปรแกรมคำนวณคะแนน สหกรณ์ ตามเกณฑ์ดีเด่นแห่งชาติ กรมส่งเสริม สหกรณ์ กองพัฒนาสหกรณ์ด้านการเงิน และร้านค้า วิธีการใ ช้
การพัฒนาบทเรียนคอมพิวเตอร์ช่วยสอน เรื่อง หลักการทำงานของคอมพิวเตอร์ วิชาคอมพิวเตอร์พื้นฐาน สำหรับนักเรียนชั้นมัธยมศึกษาปีที่ 1 โรงเรียนเฉลิมราชประชาอุทิศ.
LOGO ภาษาซี 1.1 อ. กฤติเดช จินดาภัทร์. LOGO ตัวอย่างโค้ดภาษาซี
คำสั่งควบคุมการทำงาน
“วิธีการใช้งาน PG Program New Version สำหรับ PGD”
เกม คณิตคิดเร็ว.
บทที่ 5 การใช้คำสั่ง Select Case , For Next และ Do While
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
รายการ(List) [2] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
รายการ(List) [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
การทำ Normalization 14/11/61.
บทที่ 5 อินพุตและเอาต์พุต
โปรแกรมย่อย อาจารย์สมเกียรติ ช่อเหมือน
หน่วยการเรียนที่ 6 เรื่อง การจัดการฐานข้อมูลด้วย PHP Function
การประยุกต์ Logic Gates ภาค 2
บทที่ 1 สถาปัตยกรรมของระบบฐานข้อมูล (Database Architecture)
int isEmpty ( node **ptr_head) ;
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
BC320 Introduction to Computer Programming
โครงสร้างภาษา C Arduino
การหาตำแหน่งภาพที่เกิดจากการสะท้อนของแสงบนกระจกเงาโค้งทรงกลม
QUEUE คิวจะมีโครงสร้างแบบเชิงเส้นเหมือน stack แต่แตกต่างตรงที่ queue มีตัวชี้ 2 ตัวคือ หัว(Head) และหาง(Tail) โดยการใส่ข้อมูลเข้าและนำข้อมูลออก จะมีลักษณะ.
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
Control Statement เงื่อนไขคำสั่งในโปรแกรม ภาษา C
เรื่อง ความพึงพอใจต่อการให้บริการห้องสมุด
รายวิชา ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม
คำสั่ง Create , Insert, Delete, Update
หลักการแต่ง คำประพันธ์ประเภท โคลง. หลักการแต่ง คำประพันธ์ประเภท โคลง.
ขั้นตอนการออกแบบ ผังงาน (Flow Chart)
การเขียนโปรแกรมแบบวนซ้ำ: คำสั่ง while คำสั่ง do….while
วิธีการกำหนดค่า Microsoft SharePoint ของคุณ เว็บไซต์ออนไลน์
วาระที่ ผลการประชุมเชิงปฏิบัติการ เรื่อง การเตรียมความพร้อมบุคลากร สำนักแผนงานและโครงการพิเศษเพื่อสนับสนุนการปฏิบัติงาน ของหน่วยงานในพื้นที่
บริษัท พัฒนาวิชาการ (2535) จำกัด
Week 5 C Programming.
วัฏจักรหิน วัฏจักรหิน : วัดวาอาราม หินงามบ้านเรา
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
หน่วยที่ 6 อะเรย์ของอักขระ
บทที่ 9 การเรียงลำดับข้อมูล (Sorting)
บทที่ 7 การประมวลผลอาร์เรย์
บทที่ 8 การแก้ไขข้อผิดพลาดโปรแกรม(Debugging)
Tree.
2 โครงสร้างข้อมูลแบบสแตก (STACK).
3 โครงสร้างข้อมูลแบบคิว (QUEUE).
Chapter 3 : Array.
กลุ่มส่งเสริมอาชีพการเกษตร
Array: One Dimension Programming I 9.
ฟังก์ชันของโปรแกรม Computer Game Programming
4 โครงสร้างข้อมูลแบบลิงค์ลิสต์ (LINKED LIST).
การเขียนโปรแกรมด้วยภาษาไพทอน การเขียนโปรแกรมแบบทางเลือก
การวิเคราะห์สถานะคงตัวของ วงจรที่ใช้คลื่นรูปไซน์
Class Diagram.
ใบสำเนางานนำเสนอ:

รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร สาขาวิชาเทคโนโลยีคอมพิวเตอร์เคลื่อนที่ คณะเทคโนโลยีสารสนเทศและการสื่อสาร Website : ict.up.ac.th/yeunyong

หัวข้อวันนี้ Insert & Delete หลักในการเขียนฟังก์ชัน insertFirst() deleteFirst() insertLast() deleteLast()

หลักในการเขียนฟังก์ชัน Insert & Delete แยกออกเป็นกรณีต่างๆ ให้ได้ เงื่อนไขของแต่ละกรณี วาดรูปแสดงการทำงานของแต่ละกรณี คำสั่งภาษาโปรแกรม รวมแต่ละกรณีเข้าด้วยกัน การเช็คเงื่อนไขอาจเปลี่ยนแปลงเล็กน้อย บางกรณีอาจรวมกัน(บางส่วน)ได้ เพื่อให้โปรแกรมกระชับ หรือ ทำงานได้ไว้ขึ้น

void insertFirst (node **ptr_head, int input); parameter ชื่อของตัวแปรลิสต์ที่จะใส่ข้อมูล ข้อมูลที่จะใส่ return value ไม่มี body of function มีกี่กรณี ? แต่ละกรณีจะแทรกอย่างไร ? ++++++++++++++1+++++++++++++ void insertFirst ( node **head , int input ) { node *NewNode ; NewNode = new node ; Newnode->data = input ; if ( *head == NULL ) { // กรณียังไม่มีข้อมูล NewNode->next = NUILL ; *head = NewNode ; } else { NewNode->next = *head ; void insertFirst ( node **head , int input ) { ... เผื่อไว้สำหรับคำสั่งอื่นๆ if ( *head == NULL ) ... กรณียังไม่มีข้อมูล else ... กรณีมีข้อมูลอยู่แล้ว ... เผื่อไว้สำหรับคำสั่งอื่นๆ ดูที่กรณีที่ 1. ยังไม่มีข้อมูล วาดรูปให้ดู สรุปเป็นคำสั่งคือ NewNode->next = NUILL ; *head = NewNode ; ดูที่กรณีที่ 2. มีข้อมูลอยู่แล้ว NewNode->next = *head ; เขียนในทั้ง 2 กรณีในโครงของฟังก์ชันให้นิสิตดู ดัง กล่องข้อความหมายเลข 1 แต่สรุปให้ดูว่ามันสามารถรวมกันได้ เพราะถ้าไม่มีข้อมูล *head == NULL ดัง กล่องข้อความหมายเลข 2 ++++++++++++++2+++++++++++++ void insertFirst ( node **head , int input ) { node *NewNode ; NewNode = new node ; Newnode->data = input ; NewNode->next = *head ; *head = NewNode ; }

insertFirst : Singly-linked list void insertFirst ( node **ptr_head , int input ) { node *n ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = NULL ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 2 ตัว n->next = *ptr_head ; // next ของโหนดใหม่ *ptr_head = n ; // head *** คำสั่งใน if และ else สามารถยุบรวมกันได้

insertFirst : Singly-circularly-linked list void insertFirst ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = n ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 3 ตัว t = *ptr_head ; // ใช้ t ท่องไปยังโหนดสุดท้าย while ( t->next != *ptr_head ) t = t->next ; t->next = n ; // next ของโหนดสุดท้าย n->next = *ptr_head ; // next ของโหนดใหม่ *ptr_head = n ; // head

insertFirst : Doubly-linked list void insertFirst ( node **ptr_head , int input ) { node *n ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = NULL ; n->back = NULL ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 4 ตัว n->next = *ptr_head ; // next ของโหนดใหม่ n->back = NULL ; // back ของโหนดใหม่ *ptr_head->back = n ; // back ของโหนดแรก *ptr_head = n ; // head

insertFirst : Doubly-circularly-linked list void insertFirst ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = n ; n->back = n ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 5 ตัว n->next = *ptr_head ; // next ของโหนดใหม่ n->back = *ptr_head->back ; // back ของโหนดใหม่ *ptr_head->back->next = n ; // next ของโหนดสุดท้าย *ptr_head->back = n ; // back ของโหนดแรก *ptr_head = n ; // head

void deleteFirst ( node **ptr_head ) ; parameter ชื่อของตัวแปรลิสต์ที่จะดึงข้อมูลออก return value ไม่มี body of function มีกี่กรณี ? แต่ละกรณีจะลบอย่างไร ? มีความคล้ายคลึงกันกับ insertFirst() ? void deleteFirst ( node **head) { *head = *head->next; } แต่ให้นิสิตตระหนักถึงการคืนหน่วยความจำ (โหนดที่พึ่งลบไป) ด้วยคำสั่ง delete เป็นคำสั่งในภาษา C++ ที่นำมาประยุกต์ใช้ และ ถ้าจะ delete ก็ต้องมีตัวแปรพอยน์เตอร์มาชี้ที่โหนดที่ลบไปด้วย ดังนั้น ต้องสร้างตัวแปรมาชี้ -> ลบ -> delete ได้เป็นฟังก์ชัน คือ void deleteFirst ( node **head) { node *DelNode ; DelNode = *head ; *head = *head->next ; delete DelNode ; } ไม่ต้องใช้คำสั่ง new สำหรับตัวแปร DelNode เพราะ ไม่ได้จองตำแหน่งหน่วยความจำใหม่ แต่ให้มันไปชี้ที่โหนดที่มีข้อมูลอยู่แล้ว

deleteFirst : Singly-linked list void deleteFirst ( node **ptr_head ) { node *d ; d = *ptr_head ; if ( *ptr_head->next == NULL ) { // กรณีเหลือข้อมูลตัวเดียว *ptr_head = NULL ; } else { // ต้องเปลี่ยน pointer 1 ตัว *ptr_head = *ptr_head->next ; // head delete d ; *** คำสั่งใน if และ else สามารถยุบรวมกันได้

deleteFirst : Singly-circularly-linked list void deleteFirst ( node **ptr_head ) { node *d , *t ; d = *ptr_head ; if ( *ptr_head->next == *ptr_head ) { // กรณีเหลือข้อมูลตัวเดียว *ptr_head = NULL ; } else { // ต้องเปลี่ยน pointer 2 ตัว t = *ptr_head ; // ใช้ t ท่องไปยังโหนดสุดท้าย while ( t->next != *ptr_head ) t = t->next ; t->next = *ptr_head->next ; // next ของโหนดสุดท้าย *ptr_head = *ptr_head->next ; // head delete d ;

deleteFirst : Doubly-linked list void deleteFirst ( node **ptr_head ) { node *d ; d = *ptr_head ; if ( *ptr_head->next == NULL ) { // กรณีเหลือข้อมูลตัวเดียว *ptr_head = NULL ; } else { // ต้องเปลี่ยน pointer 2 ตัว *ptr_head->next->back = NULL ; // back ของโหนดที่ 2 *ptr_head = *ptr_head->next ; // head delete d ;

deleteFirst : Doubly-circularly-linked list void deleteFirst ( node **ptr_head ) { node *d ; d = *ptr_head ; if ( *ptr_head->next == NULL ) { // กรณีเหลือข้อมูลตัวเดียว *ptr_head = NULL ; } else { // ต้องเปลี่ยน pointer 3 ตัว // next ของโหนดสุดท้าย *ptr_head->back->next = *ptr_head->next ; // back ของโหนดที่ 2 *ptr_head->next->back = *ptr_head->back ; // head *ptr_head = *ptr_head->next ; delete d ;

void insertLast (node **ptr_head, int input); parameter ชื่อของตัวแปรลิสต์ที่จะใส่ข้อมูล ข้อมูลที่จะใส่ return value ไม่มี body of function มีกี่กรณี ? แต่ละกรณีจะแทรกอย่างไร ? void insertLast ( node **head , int input ) { node *NewNode , *traversal ; NewNode = new node ; Newnode->data = input ; if ( *head == NULL ) { // กรณียังไม่มีข้อมูล NewNode->next = NUILL ; *head = NewNode ; } else { traversal = *head ; while (traversal->next != NULL) traversal = traversal->next ; NewNode->next = NULL ; traversal->next = NewNode ; void insertLast ( node **head , int input ) { ... เผื่อไว้สำหรับคำสั่งอื่นๆ if ( *head == NULL ) ... กรณียังไม่มีข้อมูล else ... กรณีมีข้อมูลอยู่แล้ว ... เผื่อไว้สำหรับคำสั่งอื่นๆ ดูที่กรณีที่ 1. ยังไม่มีข้อมูล วาดรูปให้ดู สรุปเป็นคำสั่งคือ NewNode->next = NUILL ; *head = NewNode ; ดูที่กรณีที่ 2. มีข้อมูลอยู่แล้ว ตรงนี้คือจุดแตกต่าง -> ต่างตรงต้อง “ท่อง” ไปยังโหนดสุดท้ายเพื่อจะ inseet วาดรูปแสดงวิธีทำให้ดู สรุปเป็น 2 ขั้นตอน -> 1. ท่องไปยังโหนดสุดท้าย , 2. เอาโหนดใหม่ต่อ ทบทวนนิสิตถึงขั้นตอนที่ 1. ได้คำสั่ง -> เอาใส่ในโครงฟังก์ชันเลย วาดรูปขั้นตอนที่ 2 ได้คำสั่ง -> เอาใส่ในโครงฟังก์ชันต่อเลย

insertLast : Singly-linked list void insertLast ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = NULL ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 2 ตัว t = *ptr_head ; // ใช้ t ท่องไปยังโหนดสุดท้าย while ( t->next != NULL ) t = t->next ; n->next = NULL ; // next ของโหนดใหม่ t->next = n ; // next ของโหนดสุดท้าย

insertLast : Singly-circularly-linked list void insertLast ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = n ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 2 ตัว t = *ptr_head ; // ใช้ t ท่องไปยังโหนดสุดท้าย while ( t->next != *ptr_head ) t = t->next ; n->next = *ptr_head ; // next ของโหนดใหม่ t->next = n ; // next ของโหนดสุดท้าย

insertLast : Doubly-linked list void insertLast ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = NULL ; n->back = NULL ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 3 ตัว t = *ptr_head ; // ใช้ t ท่องไปยังโหนดสุดท้าย while ( t->next != NULL ) t = t->next ; n->next = NULL ; // next ของโหนดใหม่ n->back = t ; // back ของโหนดใหม่ t->next = n ; // next ของโหนดสุดท้าย

insertLast : Doubly-circularly-linked list void insertLast ( node **ptr_head , int input ) { node *n , *t ; n = new node ; n->data = input ; if ( *ptr_head == NULL ) { // กรณียังไม่มีข้อมูล n->next = n ; n->back = n ; *ptr_head = n ; } else { // ต้องเปลี่ยน pointer 4 ตัว และไม่ต้องท่อง !!! n->next = *ptr_head ; // next ของโหนดใหม่ n->back = *ptr_head->back ; // back ของโหนดใหม่ *ptr_head->back->next = n ; // next ของโหนดสุดท้าย *ptr_head->back = n ; // back ของโหนดแรก

void deleteLast ( node **ptr_head ) ; parameter ชื่อของตัวแปรลิสต์ที่จะดึงข้อมูลออก return value ไม่มี body of function มีกี่กรณี ? แต่ละกรณีจะลบอย่างไร ? ดูที่กรณีที่ 2. มีมากกว่า 1 โหนด ต้อง “ท่อง” ไปยังโหนดสุดท้ายเพื่อจะ delete (เหมือน insertLast) วาดรูปแสดงวิธีทำให้ดู สรุปเป็น 2 ขั้นตอน -> 1. ท่องไปยังโหนดสุดท้าย , 2. ลบโหนดนั้นออก แต่ ปัญหาที่เกิดขึ้นคือ ถ้าใช้ pointer ท่องตัวเดียว ลบไม่ได้ เพราะไม่มีตัวชี้กลับ ต้อง ใช้ pointer 2 ตัว ท่องตามกัน วาดรูปให้ดู สรุปเป็นคำสั่ง node *p,*t; // t ใช้ delnode แทนได้เพราะยังไงก็ต้องลบทิ้งอยู่แล้ว t = *h; while (t->next != NULL) { p = t; t = t->next; } void deleteLast ( node **head) { ... เผื่อไว้สำหรับคำสั่งอื่นๆ if ( *head->next == NULL ) ... กรณีมีโหนดเดียว else ... กรณีมีหลายโหนด ... เผื่อไว้สำหรับคำสั่งอื่นๆ void deleteLast ( node **head) { node *delnode, *p ; if ( *head->next == NULL ) { delnode = *head ; *head = NULL ; } else{ while (delnode->next != NULL){ p = delnode ; delnode = delnode->next ; p->next = NULL delete delnode ; ดูที่กรณีที่ 1. มี 1 โหนด เมื่อลบก็ต้องไม่เหลือโหนดใดๆ วาดรูปให้ดู สรุปเป็นคำสั่งคือ *head = NULL ; แต่ทิ้งไว้ด้วยว่าอย่าลืมการเอาตัวแปรมาคืนหน่วยความจำก่อนลบ ได้เป็น void deleteLast ( node **head) { node *delnode ; if ( *head->next == NULL ) { delnode = *head ; *head = NULL ; } else ... กรณีมีหลายโหนด delete delnode ;

deleteLast : Singly-linked list void deleteLast ( node **ptr_head) { node *d, *p ; if ( *ptr_head->next == NULL ) { // กรณีเหลือข้อมูลตัวเดียว d = *ptr_head ; * ptr_head = NULL ; } else { while (d->next != NULL){ p = d ; // p ท่องตาม delnode(t) d = d->next ; p->next = NULL ; // ตัดโหนดสุดท้ายทิ้ง delete d ;

deleteLast : Singly-circularly-linked list void deleteLast ( node **ptr_head) { node *d, *p ; if ( *ptr_head->next == *ptr_head ) {// เหลือข้อมูลตัวเดียว d = *ptr_head ; *ptr_head = NULL ; } else { // ต้องเปลี่ยน pointer แค่ 1 ตัว !!! while (d->next != *ptr_head ){ p = d ; d = de->next ; p->next = *ptr_head ; delete d ;

deleteLast : Doubly-linked list void deleteLast ( node **ptr_head) { node *d ; // มี back ชี้กลับโหนดก่อนหน้าแล้ว ตัด p ทิ้งได้ if ( *ptr_head->next == NULL ) { // กรณีเหลือข้อมูลตัวเดียว d = *ptr_head ; *ptr_head = NULL ; } else { // ก็ยังเปลี่ยน pointer แค่ 1 ตัว !!! while (d->next != NULL){ d = d->next ; d->back->next = NULL ; // next ของโหนดก่อนหน้า delete d ;

deleteLast : Doubly-circularly-linked list void deleteLast ( node **ptr_head) { node *d ; if ( *ptr_head->next == *ptr_head ) { // เหลือข้อมูลตัวเดียว d = *ptr_head ; *ptr_head = NULL ; } else { // เปลี่ยน pointer 2 ตัว !!! และไม่ต้องท่อง !!! d = *ptr_head->back ; d->back->next = *ptr_head ; // next ของโหนดก่อนหน้า *ptr_head->back = d->back ; delete d ;