วันอังคารที่ 28 กรกฎาคม พ.ศ. 2552

DTS05-04-27-2552

Linked List และ Stack
การลบโหนด (Delete node)
กำหนดค่า pList คือ พอยน์เตอร์เริ่มต้น
pPre คือ พอยน์เตอร์โหนด
pLoc คือ โหนดพอยน์เตอร์
dataout คือ ข้อมูลที่จัดเก็บในโหนด
หลักการทำงาน คือ ทำการลบข้อมูลพร้อมโหนดออกจากลิงค์ลิสต์และคืนค่าหน่วยความจำ
ก่อนการกำหนดค่า กำหนด pList คือ พอยน์เตอร์ที่ชี้ไปยังโหนดต้นลิสต์
pPre คือ พอยน์เตอร์ที่ใช้ไปยังลิงค์ของโหนดก่อนหน้าโหนดที่ต้องการ
pLoc คือ พอยน์เตอร์ที่ชี้ไปยังโหนดที่ต้องการลบ
dataout คือ ตำแหน่งโหนดที่จัดเก็บข้อมูลที่ต้องการลบ
หลังการทำงาน ข้อมูลจะถูกลบไปและทำการคืนพื้นที่ ที่จองให้กับหน่วยความจำ

การค้นหาลิสต์ (Search list)
กำหนดค่า pList พอยน์เตอร์เริ่มต้น
pPre พอยน์เตอร์โหนด
pLoc พอยน์เตอร์โหนด
target ชนิดของคีย์
หลักการทำงาน ทำการรันหาลิสต์และเทียบค่ากับตำแหน่งชนิดของคีย์
เพื่อตรวจสอบการตรงกันของตำแหน่ง
ก่อนการทำงาน กำหนด pList เป็นพอยน์เตอร์ชี้ค่าที่ตำแหน่งเริ่มต้น
กำหนด pPre เป็นพอยน์เตอร์ตัวแปรเก็บตำแหน่งโหนดก่อนหน้า
กำหนด pLoc เป็นพอยน์เตอร์ตัวแปรเก็บตำแหน่งตัวเลือก
กำหนด target เป็นคีย์ที่กำหนดการค้นหา
หลังการทำงาน กำหนด pLoc ชี้ไปยังโหนดและทำการเปรียบค่าคีย์ตามเงื่อนไขจนกว่าจะครบทุกโหนด
หรือค้นเจอลิสต์ที่ต้องการ
การคืนค่า คืนค่าจริงหากค้นเจอลิสต์
คืนค่าเท็จหากค้นไม่พบลิสต์

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

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

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

สแตก (Stack)
สแตกสามารถจัดเก็บได้ทั้งแบบเรคคอร์ด อาร์เรย์ หรือการจัดเก็บในลักษณะของลิงค์ลิสต์
โดยรูปแบบของการทำงานนั้นจะเป็นเสมือนการจัดเก็บหรือบันทึกสมาชิกในลักษณะของ
การพักไว้เมื่อต้องการดึงเอาข้อมูลหรือสมาชิกไปใช้ ก็สามารถนำออกไปใช้ได้แต่ต้อง
นำออกมาในลักษณะของสมาชิกที่ถูกนำเข้ามาหลังสุดออกก่อน
ที่เรียกว่า Last In First Out (LIFO)

การทำงานของสแตก
Push หรือการนำเข้าข้อมูล
การนำเข้าข้อมูลเป็นการดำเนินการในลักษณะของการเพิ่มข้อมูลในสแตกกรณีที่ไม่มีข้อมูล
ใดอยู่ก็จะนำเข้าไปในตำแหน่งแรก ซึ่งเรียกข้อมูลแรกว่าตำแหน่ง top แต่หากนำข้อมูลเข้าไปใหม่
ตำแหน่ง top ก็จะเปลี่ยนไปเป็นของข้อมูลที่เข้าไปใหม่ และต้องระวังผิดพลาดที่เกิดจาก
stack over flow คือไม่มีพื้นที่ว่างสำหรับนำข้อมูลเข้า
Pop หรือการดึงออกข้อมูล
การดึงออกข้อมูล คือ การนำข้อมูลออกจากสแตก โดยการดึงข้อมูลจากตำแหน่ง top
แต่ก็ต้องตรวจสอบหากไม่มีข้อมูลในสแตกแล้วไปทำการ pop ข้อมูลจะเกิดการผิดพลาด
ที่เรียกว่า Stack Under Flow คือไม่มีข้อมูลภายในสแตกหรือสแตกว่าง

Top หรือตำแหน่งบนสุด
ตำแหน่งบนสุดของสแตกนั้นใช้ top เป็นตัวกำหนด ซึ่งจะทำให้รู้หากต้องการ pop
หรือ push ข้อมูลจะต้องทำที่ตำแหน่งนี้ top เป็นเพียงสิ่งที่บอกตำแหน่งของข้อมูลสูงสุดใหม่
หากมีการ push และ pop ตำแหน่งของ top ก็จะเปลียนไปเสมอ

ตัวอย่างสแตกที่เราเห็นในชีวิตประจำวันทั่วไป
1.การกินไอติมเป็นก้อน เพราะเวลาตักไอติมเราจะกินก้อนสุดท้ายก่อนเพราะก้อนแรกมันจะอยู่ใต้แก้วไอติม เป็นต้น
2.การทำนาฬิกาทราย เพราะเราต้องใส่ทรายเข้าไปก่อนแล้วแล้วเราคว่ำนาฬิกาทราย ทรายอันสุดท้ายจะออกมาก่อน
3.การทำขนมชั้น เวลาเรากินขนมชั้นเรากินชั้นบนก่อนแล้วค่อยกินชั้นสุดท้าย


การบ้าน


# include
main()
{
int num;
printf("Enter your num:");
scanf("%d",&num);
if(num >0)
printf("type+\n");
else
if (num==0)
printf("type0\n");
else
printf("type-");
}
แบบ

# inciude
main( )
{
int num;
cout<<“enter you num:”;
cin>>num;
if(num >0)
cout<<“type+\n”;
else if (num= =0)
cout<< “type0\n”;
else cout <<“type-\n”;
}

0utput
output
Enter your num:_
===========================
Enter 8_
type+

ความเหมือนหรือต่างกัน
มีความเหมือนกันในการใช้ เพราะว่า iostream.h นั้นถือได้ว่าเป็นฟังก์ชั่นของC++ เหมือนกันจึงเป็นฟัก์ชั่นที่สามารถใช้ได้ทั้ง C และ C++

วันอังคารที่ 21 กรกฎาคม พ.ศ. 2552

DTS04-15/07/2552

สรุปบทเรียน Set and String , Linked List

อาเรย์ของสตริงนั้นสามารถแบ่งได้เป็น 2 ประเภทคือแบบยาวเท่ากันและยาวไม่เท่ากันกรณียาวไม่เท่ากันนั้นทำได้ดังนี้
char *name[4]={“Thatchapol”, “John”, “Somchai”, “Ratchawee”};
แต่จะทำได้ก็ต่อเมื่อมีการกำหนดค่าเริ่มต้นเท่านั้น
กรณียาวเท่ากันนั้นเราจะทำการกำหนดอาเรย์ของสตริงเป็น 2 มิติ

Linked List
ลิงค์ลิสต์เป็นรูปแบบหนึ่งของโครงสร้างเหมือนกับพอยน์เตอร์คือมีการจัดการข้อมูลแบบไม่ตายตัว (Dynamic Structure) โครงสร้างของลิงค์ลิสต์จะประกอบด้วยโหนดหลาย ๆ โหนดภายใน 1 โหนดจะแบ่งออกเป็น 2 ส่วนคือส่วน data กับ link โดยการเชื่อมโยงไปยังโหนดต่อ ๆ นั้นจะใช้รูปแบบของพอยน์เตอร์เป็นตัวชี้ไปยังโหนดต่อ ๆ ไป
ประเภทของลิงค์ลิสต์นั้นมีหลายประเภทเช่น
1. ลิงค์ลิสต์แบบทิศทางเดียว
2. ลิงค์ลิสต์แบบวงกลม
3. ลิงค์ลิสต์แบบ 2 ทิศทาง
4. ลิงค์ลิสต์แบบหลายทิศทาง

โดยปกติครงสร้งของลิงค์ลิสต์มี 2 ส่วนใหญ่ ๆ คือ
1.โครงสร้างโหนดต้นลิสต์ หรือ Head node
2. โครงสร้างโหนดข้อมูล หรือ Data node
การเพิ่มข้อมูลลงไปในลิงค์ลิสต์นั้น จากที่ Head Structure ในส่วนของ count จะมีค่าเป็น 0 นั้นหมายถึงในลิสต์นั้นยังไม่มีข้อมูลใดเลย ส่วน head จะมีเครื่องหมายกากบาท นั้นหมายถึงในลิสต์นั้นไม่มีการเชื่อมโยงไปยังข้อมูลแรก แต่ถ้าต้องการเพิ่มข้อมูลลงไปในลิสต์ Data Node ในส่วนของข้อมูล (Data)จะมีค่าเก็บอยู่ แล้ว count ก็จะเปลี่ยนค่าจาก 0 เป็น 1 คือ การบ่งบอกถึงจำนวนข้อมูลที่มีอยู่ในลิสต์นั้น แล้ว head ก็จะชี้ไปยังข้อมูล (Data) ตัวแรกของลิสต์ ส่วนพอยเตอร์ที่ชี้ไปโหนดถัดไปจะเป็นเครื่องหมายกากบาทแทนการลบข้อมูลในลิงค์ลิสต์ ถ้าต้องการลบข้อมูลตัวใดในลิสต์สามารถลบได้เลย แต่ต้องเปลี่ยน head เพื่อชี้ไปยังข้อมูลตัวแรกของลิสต์กรณีที่ลบข้อมูลตัวแรกออก แล้ว link คือ เมื่อลบข้อมูลตัวใดออกควรชี้ link ถัดไปให้ถูกต้องด้วย

ทฤษฏีการดำเนินการ
1. การสร้างลิสต์เนื่องจากลิงค์ลิสต์มีโครงสร้างที่ไม่ตายตัวดังนั้นจะต้องมีการจองพื้นที่บนหน่วยความจำให้กับพอยน์เตอร์ด้วยซึ่งก็คือการสร้างลิสต์ขึ้นมา
หลักการทำงาน : จองพื้นที่หน่วยความจำให้กับลิงค์ลิสต์ก่อนดำเนินการ : ไม่มีการกำหนดค่าหลังการดำเนินการ : พอยน์เตอร์เริ่มต้นมีการจองพื้นที่บนหน่วยความจำการคืนค่า : เนื่องจากหน่วยความจำไม่มีที่ว่าง
2. การแทรกโหนด
กำหนดค่าเริ่มต้น : pList = Head nodeกำหนดค่าเริ่มต้น : pPre = Node pointerกำหนดค่าเริ่มต้น : dataIn = ค่าข้อมูลในโหนด
หลักการทำงาน : ทำการแทกรโหนดที่มีค่าข้อมูลลงในลิงค์ลิสต์ก่อนการทำงาน : กำหนดพอยน์เตอร์ของลิสต์ชี้ไปยังโหนดต้นลิสต์หลังการทำงาน : แทรกโหนดที่จัดเก็บข้อมูลเข้าไปยังลิสต์การคืนค่า : จริง คือแทรกโหนดเรียบร้อยการคืนค่า : เท็จ ถ้าหน่วยความจำเต็ม overflow

วันอังคารที่ 14 กรกฎาคม พ.ศ. 2552

DTS03-01/07/2552

สรุปเนื้อหาบทเรียน "Data Structure"

เรื่อง Pointer ,Set and String

pointer

ตัวแปร Pointer เป็นตัวแปรชนิดหนึ่งที่ทำหน้าที่เก็บตำแหน่งที่อยู่Address ของตัวแปร แทนที่จะเก็บข้อมูลต่างๆ เหมือนตัวแปรชนิดอื่นๆ จากคุณสมบุติของ ตัวแปรชนิด Pointer จึงมองดูเหมือนกับ ตัวชี้ หรือพอยน์เตอร์ ซึ่งชี้ไปที่ Address ของตัวแปรการกำหนดตัวแปร Pointer
การกำหนดตัวแปร Pointer จะคล้ายกับการกำหนดตัวแปรชนิดต่างๆ เพียงแต่ต้องมีเครื่องหมาย * หน้าชื่อตัวแปร
ดังนี้
int *pt;
ในที่นี้กำหนดให้ pt เป็นตัวแปร Pointer ซึ่งเก็บ Address ของตัวแปรชนิดตัวเลขจำนวนเต็ม
ในเรื่อง Pointer มีเครื่องหมาย 2 ชนิด คือ * และ & เครื่องหมาย * จะให้ค่า ของข้อมูล ซึ่งเก็บอยู่ใน Address โดย Address นี้เก็บ อยู่ในตัวแปร Pointer ซึ่งอยู่หลังเครื่องหมาย * สำหรับเครื่องหมาย & จะให้ค่า Address ของตัวแปรซึ่งอยูหลังเครื่องหมาย &

ข้อสังเกตุเกี่ยวกับตัวแปร Pointer (ประเภท int)- การใช้งานตัวแปร pointer มีได้ 2 แบบดังนี้
*pt_age จะหมายถึงการนำค่าของ pt_age ออกมาแสดง
pt_age จะหมายถึงการนำตำแหน่งหน่วยความจำของ pt_age มาแสดง

โครงสร้างข้อมูลแบบ String

string หมายถึงอักขระที่มีความยาวมากกว่า 1 ตัวแรงต่อกันเป็นข้อความ โดยข้อมูลชนิดขด้อความต้องเขียนอยู่ภายในเครื่องหมาย " " (Double quote)
หรือพูดง่าย ๆ ก็คือ String เป็น Array ของ อักขระนั่นเอง ตัวอย่างเช่น
char name[20];
หมายถึง string ที่เก็บข้อความได้ 19 ตัวอักษร ตามปกติแล้วจุดสิ้นสุดของ string จะเป็น \0
มีฟังก์ชั่นที่เกี่ยวข้องกับ String ดังนี้
getchar(); // ใช้สำหรับรับข้อมูลชนิดอักขระเข้ามาจากคีย์บอร์ด โดยรับครั้งละ 1 อักขระเท่านั้น
gets(); // จะใช้รับข้อมูลชนิดข้อความเข้ามาทางคีย์บอร์ด
putchar(); // คือการแสดงผลอักขระออกทางหน้าจอ
puts(); // ใช้ในการแสดงข้อความออกจากหน้าจอ

โครงสร้างข้อมูลแบบเซต (set)

เป็นโครงสร้างที่ข้อมูลแต่ละตัวไม่มีความสัมพันธ์กันเลย