วันอาทิตย์ที่ 26 กรกฎาคม พ.ศ. 2552

DTS05-22-07-2552

สรุปสิ่งที่ได้จากการเรียน เรื่อง Linked List (ต่อ)

5. Traverse ทำหน้าที่ท่องหรือเยือนไปในลิสต์เพื่อเข้าถึงและประมวลผลนำเข้า ผลลัพธ์ที่ได้จะขึ้นอยู่กับการประมวลผล อย่างเช่น การรวมฟิลด์ในลิสต์ การเปลี่ยนแปลงค่าในโนด การคำนวณค่าเฉลี่ยของฟิลด์ เป็นต้น
6. Retrieve Node ทำหน้าที่หาตำแหน่งของข้อมูลที่อยู่ในลิสต์ ผลลัพธ์ที่ได้ก็คือ ตำแหน่งข้อมูลที่อยู่ในลิสต์ และเมื่อรู้ตำแหน่งก็ดึงค่าที่ได้มาแสดงในโปรแกรม
7. EmptyList ทำหน้าที่ทดสอบดูว่า ลิสต์ว่างหรือไม่ ผลลัพธ์ที่ได้คือ เป็นจริงและเป็นเท็จ กล่าวคือ จะเป็นจริงก็ต่อเมื่อลิสต์ว่าง และจะเป็นเท็จก็ต่อเมื่อลิสต์ไม่ว่าง
8. FullList ทำหน้าที่ในการทดสอบว่าลิสต์เต็มหรือไม่ ผลลัพธ์ที่ได้คือ เป็นจริงและเป็นเท็จ กล่าวคือ จะเป็นจริงก็ต่อเมื่อหน่วยความจำเต็ม และจะเป็เท็จก็ต่อเมื่อลิสต์นั้นสามารถมีโนดอื่น
9. List Count ทำหน้าที่นับจำนวนของข้อมูลที่อยู่ในลิสต์ ผลลัพธ์ที่ได้คือ จำนวนข้อมูลที่อยู่ในลิสต์นั้นๆ ซึ่งจะใช้ค่า count ที่อยู่ใน Head Node ออกมาแสดง
10. Destroy List ทำหน้าที่ในการลำลายลิสต์ หรือหยุดใช้ลิสต์นี้แล้ว

การสร้าง Linked List


*หมายเหตุ : ในการสร้าง Linked List สามารถเปลี่ยนรูปแบบได้ แต่ควรมีองค์ประกอบข้างต้น ให้ครบ

Linked List แบบซับซ้อน มี 2 แบบ คือ
1. Circular Linked List

จากภาพ จะมีการทำงานไปในทิศทางเดียวกันเท่านั้น คือ เป็นแบบวงกลม ซึ่งสังเกตได้จากลูกศรชี้การทำงานของ Linked List ซึ่งเป็นลิงค์ลิสที่สมาชิกหัวสุดท้าย ชี้ไปที่สมาชิกตัวแรกของลิงค์ลิสต์

2. Double Linked List

จากภาพการทำงาน ข้อมูลจะมีตัวชี้ไปที่ข้อมูลก่อนหน้า หรือ backward pointer และตัวชี้ข้อมูลถัดไป หรือ forward pointer ซึ่งเป็นลิงค์ลิสต์ที่มีทิศทางการทำงานแบบ 2 ทิศทาง

Stack

สแตก เป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์ (linear list) ที่สามารถนำข้อมูลเข้าหรือออกได้ทางเดียว คือส่วนบนของสแตก หรือเรียกว่า ท๊อปของสแตก (Top of Stack) ซึ่งคุณสมบัติดังกล่าวเรียกว่า ไลโฟลิสต์ (LIFO list : Last-In-First-Out list) หรือ พุชดาวน์ลิสต์ (Pushdown List) คือ สมาชิกที่เข้าลิสต์ที่หลังสุดจะได้ออกจากลิสต์ก่อน หรือ เข้าหลังออกก่อน
การทำงานของสแตก มี 3 กระบวนการ ได้แก่
1. Push เป็นการนำข้อมูลใส่ลงไปในสแตก หรือการเพิ่มข้อมูลเข้าสแตก ก่อนที่จะมีการนำข้อมูลเข้าไปในสแตกจะต้องมีการตรวจสอบสแตกก่อน กล่าวคือ จะต้องมีการกำหนดตัวแปรชี้ตรงตำแหน่งยอดของสแตก ก่อนที่จะเพิ่มข้อมูลลงในสแตก และเพิ่มตำแหน่งให้ตัวแปรนั้นอีก 1 ตำแหน่ง เพราะหากมีการนำข้อมูลเข้าสู่สแตกที่เต็มก็จะทำให้เกิด "สแตกล้น" (overflow)
2. Pop เป็นการนำข้อมูลออกจากส่วนบนสุดของสแตก กรณีการนำข้อมูลออกจากสแตก จะต้องลดค่าตัวแปรชี้ตำแหน่งยอดของสแตกลงอีก 1 ตำแหน่งเช่นกัน ซึ่งหาก นำข้อมูลอกจากสแตกว่างเปล่าอาจจะเกิด "สแตกขาด" (underflow)
3. Stack Top เป็นการคัดลอกข้อมูลที่อยู่ส่วนบนสุดของสแตก แต่ไม่ได้นำข้อมูลนั้นออกจากสแตก เพราะเป็นการคัดลอกข้อมูลมาดูก่อน ยังไม่ได้เรียกใช้งานเลย
ตัวอย่างการทำงานแบบโครงสร้างข้อมูลแบบสแตกที่สามารถเห็นได้ในชีวิตประจำวันทั่วไป ได้แก่
- การวางจานซ้อนกันต้องวางจานลงบนกล่องเก็บจานจากล่างสุดที่ละใบจนเต็มกล่อง เมื่อเราจะหยิบจานไปใช้ เราก็ต้องหยิบใบบนสุด ซึ่งเป็นจานที่ถูกวางเก็บเป็นอันดับสุดท้ายออกได้เป็นใบแรก และสามารถหยิบออกที่ละใบจากบนสุดเสมอ
- ถาดอาหารในห้างสรรพสินค้า เมื่อลูกค้ามาใช้บริการอาหารในศูนย์อาหาร ลูกค้าจะหยิบถาดที่อยู่บนสุดของถาด ที่ยกมาเป็นชั้นสูง ๆ
- กระดาษทิชชู่แบบกล่อง ซึ่งเมื่อเราหยิบใช้กระดาษทิชชู่ เราจะต้องหยิบทิชชู่ที่อยู่บนสุดก่อนเสมอ
- การจำหน่ายตัวรถเมล์ ซึ่งพนักงานจะต้องฉีกจากใบนอกสุดของม้วนกระดาษ
- การหยิบกระดาษ A4 ที่บรรจุไว้ในกล่อง ซึ่งเราจะต้องหยิบจากใบที่อยู่ด้านบนสุดก่อนเสมอ

วันพฤหัสบดีที่ 16 กรกฎาคม พ.ศ. 2552

DTS04-15-07-2552

สรุปสิ่งที่ได้จากการเรียน เรื่อง SET AND STRING (ต่อ)

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

ARAY ของสตริงที่ยาวไม่เท่ากัน ทำได้เฉพาะเมื่อมีการกำหนดค่าเริ่มต้นเท่านั้น ตัวอย่างเช่น
จากภาพจะเห็นได้ว่า ค่าเริ่มต้นจะเขียนไว้ในเครื่องหมายวงเล็บปีกกา และข้อมูลจะอยู่ในเครื่องหมายคำพูด ซึ่งได้แก่ Bangkok, Saraburi, Chonburi และ Ubonratchathani ซึ่งตัวแปร province เป็นตัวแปรพอยน์เตอร์ 4 ตัว โดยให้แต่ละตัวชี้ไปยังค่าคงตัวสตริงทั้ง 4 ตัว

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

จากภาพเป็นการกำหนดตัวแปร vehicle เป็นแบบ 4 แถว 8 คอลัมน์ ซึ่งในแต่ละช่องเก็บข้อมูลแบบอักขระ
ความแตกต่างของอะเรย์ของสตรงที่ยาวเท่ากันและไม่เท่ากัน คือ อะเรย์ของสตริงที่ยาวไม่เท่ากันจะมีลักษณะ ดังภาพด้านล่าง
ส่วนอะเรย์ของสตริงที่ยาวเท่ากันจะมีลักษณะ ดังภาพด้านล่าง
การดำเนินการเกี่ยวกับสตริง จะใช้คำสั่ง #include ในการเรียกใช้ เช่น
- ฟังก์ชัน strlen(str) ใช้หาความยาว
- ฟังก์ชัน strcpy(str1, str2) ใช้คัดลอกข้อมูล จากตัวที่ 2 ไปให้ตัวที่ 1
- ฟังก์ชัน strcat(str1, str2) ใช้เชื่อมต่อข้อความ เช่น ตัวแปร 1 เก็บ ชื่อ ตัวแปร 2 เก็บ นามสกุล แล้วนำตัวแปรทั้ง2 มาต่อกัน
- ฟังก์ชัน stecmp(str1, str2) ใช้ปรียบเทียบข้อความ 2 ข้อความว่ามีค่าเท่ากันหรือไม่ ยึดตามหลักพจนานุกรม

LINKED LIST

ลิงค์ลิสต์ เป็นวิธีการเก็บข้อมูลอย่างต่อเนื่องของ element ต่างๆ โดยมีพอยน์เตอร์เป็นตัวเชื่อมต่อ ในแต่ละ element จะเรียกว่า node ซึ่งแต่ละโนดประกอบด้วย data (เก็บข้อมูลของอิลิเม้นท์) และ link field (เก็บตำแหน่งของโนดต่อไปในลิสต์) ดังภาพ
* data อาจเป็นรายการเดียว หรือเป็นเรคคอร์ดก็ได้


โครงสร้างข้อมูลแบบลิงค์ลิสต์

1. Head Structure ประกอบด้วย Count, Pos และ head แสดงได้ดังภาพ
2. Data Node Structure ประกอบด้วย Data และ Pointer ที่ชี้ไปยังข้อมูลตัวถัดไป แสดงได้ดังภาพ

กระบวนงานและฟังก์ชันที่ใช้ดำเนินงานพื้นฐาน
1. Create List มีหน้าที่สร้างลิสต์ว่าง ผลลัพธ์ที่ได้คือ ลิสต์ว่าง และ count จะมีค่าป็น 0
2. Insert Node มีหน้าที่เพิ่มข้อมูลลงไปในลิสต์ในตำแหน่งที่ต้องการ มีข้อมูลนำเข้า ได้แก่ ลิสต์ ข้อมูล และตำแหน่ง ส่วนผลลัพธ์ที่ได้คือ ลิสต์ที่มีการเปลี่ยนแปลง และ count จะมีค่าเป็น 1 หรือ 2.....n ตามจำนวนของการ insert
3. Delete Node มีหน้าที่ลบสมาชิกในลิสต์บริเวณตำแหน่งที่ต้องการ มีข้อมูลนำเข้า ได้แก่ ข้อมูลและตำแหน่ง ส่วนผลลัพธ์ที่ได้คือ ลิสต์ที่มีการเปลี่ยนแปลง และ count จะลดจำนวนจากเดิมลงเรื่อย ตามจำนวนลิสต์ที่ลบไป
4. Search list มีหน้าที่ค้นหาข้อมูลในลิสต์ที่ต้องการข้อมูลนำเข้าลิสต์ ผลลัพธ์ที่ได้ จะเป็นค่าจริงถ้าพบข้อมูล และจะเป็นค่าเท็จถ้าไม่พบข้อมูล

วันพุธที่ 1 กรกฎาคม พ.ศ. 2552

DTS03-01-07-2552

สรุปสิ่งที่ได้จากการเรียน เรื่อง Pointer และ Set

POINTER

เป็นตัวแปรที่ทำหน้าที่เก็บตำแหน่ง address ของตัวแปรที่อยู่ในหน่วยความจำ มีรูปแบบ คือ


ตัวอย่างเช่น int *ptr; คือ การประกาศว่าตัวแปร ptr เป็นตัวแปรพอยน์เตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะใช้เก็บ integer
มีเครื่องหมายที่ใช้งานกับพอยน์เตอร์ 2 แบบคือ
1. เครื่องหมาย & เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาค่า address ที่เก็บไว้ในหน่วยความจำออกมาใช้ ตัวอย่างเช่น
จากตัวอย่าง กำหนดให้
int *b, a = 35;
b = &a;
หมายความว่า ตัวแปร b ซึ่งประกาศเป็นตัวแปรพอยน์เตอร์จะเก็บค่า 100 ซึ่งเป็น address ของ a
ข้อสังเกตที่ควรจำ คือ ตัวแปรที่มี เครื่องหมาย & ไม่สามารถนำมาคำนวณได้

2. เครื่องหมาย * มีการใช้งาน 2 ลักษณะ คือ ใช้ประกาศในพารามิเตอร์ว่าเป็นตัวแปรแบบพอยน์เตอร์ เช่น

และใช้เป็น dereferencing operator ซึ่งจะใช้เมื่อต้องการนำค่า address ที่ตัวแปรนั้นชี้อยู่ออกมาแสดง

SET AND STRING

โครงสร้างข้อมูลแบบเซต เป็นโครงสร้างที่ข้อมูลต่ละตัวไม่มีความสัมพันธ์กัน มีตัวดำเนินการซึ่งประกอบด้วย set intersecion, set union, set difference เป็นต้น

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

1. กำหนดเป็นสตริงที่มีค่าคงตัว ซึ่งกำหนดได้ทั้งนอก (หน่วยความจำที่เก็บสตริง) และในฟังก์ชัน (หน่วยความจำที่เก็บตัวมันเอง) ในการกำหนดค่าเราจะใช้เตรื่องหมาย (" ") เช่น "table" คือ ชุดของอักขระขนาด 6 ซึ่งรวม \0 ด้วย

2. กำหนดโดยใช้ตัวแปรอะเรย์หรือพอยน์เตอร์ ซึ่งสามารถกำหนดค่าคงตัวสตริงให้พอยน์เตอร์หรืออะเรย์ได้ในฐานะเริ่มต้น เช่น

main(){
char bac[] = "Good morning";
char *cptr = "How are u?";
printf("%s %s",bac,cptr);
}

เมื่อรันโปรแกรมแล้วจะได้ Good morning. How are u?
ซึ่งจะเห็นได้ว่า bac เป็นตัวแปรอะเรย์ ค่าที่ให้เป็นค่าข้อมูลในอะเรย์ ส่วน cptr เป็นพอยน์เตอร์ ค่าที่ให้เป็นค่า address เริ่มต้นของสตริง และยังสามารถเพิ่มลดค่าตัวแปรพอยน์เตอร์ได้ แต่สำหรับอะเรย์ทำไม่ได้