Tree
ทรี หรือจะเรียกกันอีกอย่างว่าโครงสร้างต้นไม้
เป็นอีกโครงสร้างที่มีความสัมพันธ์กัน
จะประกอบไปด้วยโหนด (Node)
แต่ละโหนดจะมีความสัมพันธ์กัน
และยังสามารถแตกโหนดออกมาเป็นโหนดย่อยๆ
ได้อีกหลายโหนดด้วยกันเรียกว่าโหนดลูก
เมื่อเรามีโหนดลูกแล้วก้อยังสามารถ
แตกโหนดออกไปเป็นโหนดพ่อโหนดแม่ได้อีก
ชนิดของทรี จะแบ่งออกได้2ชนิดคือ
1 ทรีทั่วไป
2 ไบนารี่ทรี
ในแต่ละโหนดที่มีโหนดแม่เป็นโหนดเดียวกันนั้น
เรียกว่า โหนดพี่น้อง (Siblings)
โหนดที่ไม่มีโหนดลูก เรียกว่า โหนดใบ
และเส้นที่แสดงความสัมพันธ์กันระหว่างโหนดสองโหนด
เรียกว่า กิ่ง
ระดับของโหนดคือ
ระยะทางในแนวดิ่งของโหนดนั้นๆ
ที่อยู่ห่างจากโหนดราก เมื่อกำหนดให้
โหนดรากของทรีนั้นอยู่ในระดับ1และกิ่ง
แต่ละกิ่งที่มีความยาวเท่ากันหมด คือ
ยาวเท่ากับ1หน่วย ซึ่งระดับของโหนด
จะเท่ากับจำนวนกิ่ที่น้อยที่สุดจากโหนดราก
ไปยังโหนดใดๆ บวกด้วย1
และจำนวนเส้นทางตามแนวดิ่งของโหนดใดๆ
ซึ่งห่างจากโหนดราก เรียกว่า ความสูง
หรือความลึก
ไบนารี่ทรีทุกๆโหนดมีทรีย่อยทั้งทางซ้ายและทางขวา
ยกเว้นโหนดใบ และโหนดใบทุกโหนดจะต้องอยู่ในระดับ
เดียวกัน เรียกว่า ไบนารี่ทรีแบบสมบูรณ์
การแปลงทรีในทั่วไปให้เป็นไบนารี่ทรี
มีด้วยกันอยู่3ขั้นตอนคือ
1 ให้โหนดแม่ชี้ไปยังโหนดลูกคนโต
แล้วลบความสัมพันธ์ ระหว่างโหนดแม่
และโหนดลูกอื่นๆ
2 ให้มีความเชื่อมความสัมพันธ์กันระหว่างโหนดพี่น้อง
3 จับให้ทรีย่อยทางขวาเอียงลงมา 45องศา
การท่องไปในไบนารี่ทรีมีด้วยกัน3แบบคือ
1 การท่องไปแบบพรีออร์เดอร์
เป็นการเดินเข้าไปเยือนในโหนดต่างๆ
ในทรีด้วยวิธี NLR มีขั้นตอนการเดินดังต่อไปนี้
1) เยือนโหนดราก
2) ท่องไปในทรีย่อยทางซ้ายแบบพรีออร์เดอร์
3) ท่องไปในทรีย่อยทางขวาแบบพรีออร์เดอร์
2 การท่องไปแบบอินออร์เดอร์
เป็นการเดินเข้าไปเยือนโหนดต่างๆ
ในทรีด้วยวิธี LNR
มีขั้นตอนการเดินดังต่อไปนี้
1) ท่องไปในทรีย่อยทางซ้ายแบบอินออร์เดอร์
2) เยือนโหนดราก
3) ท่องไปในทรีย่อยทางขวาแบบอืนออร์เดรอ์
3 การท่องไปแบบโพสต์ออร์เดอร์
เป็นการเดินเข้าไปเยือนโหนดต่างๆ
ในทรีด้วยวิธี LRN
มีขั้นตอนการเดินดังต่อไปนี้
1) ท่องไปในทรีย่อยทางซ้ายแบบโพสต์ออร์เดอร์
2) ท่องไปในทรีย่อยทางขวาแบบโพสต์ออร์เดอร์
3) เยือนโหนดราก
14 กันยายน 2552
DTS-08 26/08/52
DTS-07 05/08/52
โครงสร้างข้อมูลของ Queue
เป็นโครงสร้างข้อมูลแบบเชิงเส้นหรือลิเนียร์ลิสต์
ซึ่งการเพิ่มข้อมูลจะทำการที่ปลายข้างหนึ่ง
เรียกว่าส่วนท้าย (rear) และการนำข้อมูลออก
จะกระทำที่ปลายอีกข้างหนึ่งซึ่งเรียกว่า ส่วนหน้า
หรือ (front)
ลักษณะการทำงานของคิวเป็นลักษณะของการเข้าก่อน
ออกก่อนหรือที่เรียกว่า FIFO (First In First Out)
--การนำข้อมูลที่อยู่ตอนต้นของคิวมาแสดง
เรียกว่า Queue Front แต่จะไม่ทำการเอาข้อมูลออกจากคิว
--การนำข้อมูลที่อยู่ตอนท้ายของคิวมาแสดง
จะเรียกว่า Queue Rear แต่ไม่ทำการเพิ่มข้อมูลเข้าไปในคิว
การแทนที่ข้อมูลของ Queue
สามารถทำได้มี 2 วิธี คือ
1. การแทนที่ข้อมูลของคิวแบบลิงค์ลิสต์
2. การแทนที่ข้อมูลของคิวแบบอะเรย์
การดำเนินการเกี่ยวกับคิว ได้แก่
1. Create Queue -- การจัดสรรหน่วยความจำให้แก่ Head Node
และค่า Pointer -- ทั้งสองตัวมีค่าเป็น null และค่าสมาชิกเป็น 0
2. Enqueue -- การเพิ่มข้อมูลเข้าไปในคิว
3. Dequeue -- การนำข้อมูลออกจากคิว
4. Queue Front -- การนำข้อมูลที่อยู่ตอนต้นของคิวมาแสดง
5. Queue Rear -- การนำข้อมูลที่อยู่ส่วนท้ายของคิวมาแสดง
6. Empty -- การตรวจสอบว่าคิวว่างหรือไม่
7. Full Queue -- การตรวจสอบว่าคิวเต็มหรือไม่
8. Queue Count -- การนับจำนวนสมาชิกที่อยู่ในคิว
9. Destroy Queue -- การลบข้อมูลทั้งหมดที่อยู่ในคิว
--การนำข้อมูลเข้าสู่คิว จะไม่นำเข้าในขณะที่คิวเต็มหรือไม่มีที่ว่าง
ถ้าพยายามนำข้อมูลเข้าจะเกิดการผิดพลาดที่เรียกว่า overflow
--การนำข้อมูลออกจากคิว จะไม่สามารถนำอะไรออกจากคิวที่ว่างได้
ถ้าพยายามจะเอาออกจะเกิดการผิดพลาดที่เรียกว่า underflow
--จุดเด่นของคิว
คิวสามารถจัดการการเข้า-ออกของข้อมูล
ใช้เก็บข้อมูลที่ต้องการจัดเรียงเป็นระบบ
โดยพิจารณาข้อมูลตามลำดับ
ในทำนอง ใครถึงก่อนมีสิทธิ์ได้ใช้ก่อน
จึงใช้ในการเรียงลำดับในการแบ่งปันทรัพยากร
ที่มีอยู่อย่างจำกัดในการทำงาน เช่น
การรอคิวการทำงานของเครื่องพิมพ์ในสำนักงาน เป็นต้น
13 กันยายน 2552
DTS-06 29/07/52
คือการนำเอาอาร์เรย์เข้ามาใช้งานในการกำหนดโครงสร้าง
ซึ่งเป็นลักษณะเฉพาะตัวของอาร์เรย์เป็นโครงสร้างที่สามารถกำหนด
จองพื้นที่บนหน่วยความจำได้แน่นอนและสามารถเก็บข้อมูลที่เป็นชนิดเดียวกัน
ซึ่งจะเอาคุณสมบัตินี้มาใช้ในการกำหนดโครงสร้างและจัดเก็บข้อมูลในลักษณะ
สแตก
--โครงสร้างอาร์เรย์นั้นจะมีการจองพื้นที่ที่แน่นอน (stack) จึงจำเป็นต้องมีการ
กำหนดขนาดพื้นที่จัดเก็บข้อมูลสูงสุดให้เหมาะสมเมื่อมีการนำเอาข้อมูลเข้ามา
หลักการดำเนินการสำหรับแปลง infix เป็น postfix
1.พิจารณานิพจน์ infix หากเป็น operand ให้นำออกไปที่ผลลัพธ์
2.พิจารณานิพจน์ infix หากเป็น operator ให้นำมาเปรียบเทียบ
ความสำคัญ หากสแตกว่างไม่มีตัวดำเนินการให้ push ลงสแตก
ถ้ามีตัวดำเนินการอยู่ให้เปรียบเที่ยบความสำคัญ ถ้าตัวดำเนินการ
ที่เข้าไปใหม่มีความสำคัญน้อยกว่าให้ pop ตัวดำเนินการก่อนหน้า
ไปไว้ในผลลัพธ์แต่ถ้ามีความสำคัญมากกว่าก็ให้วางต่อไว้ในสแตก
สำหรับเครื่องหมาย +-*/ เรียกว่า operator
สำหรับตัวอักษร ABCD เรียกว่า operand
28 กรกฎาคม 2552
สรุป 05
1.Push คือ การนำข้อมูลใส่ลงไปในสแตก โดยการเพิ่มข้อมูลลงในสแตก จะต้องทำการตรวจสอบว่าสแตก เต็มหรือไม่ ถ้าไม่เต็มก็สามารถเพิ่มข้อมูลลงไปในสแตกได้ แล้วปรับตัวชี้ตำแหน่งให้ไปชี้ที่ตำแหน่งข้อมูลใหม่ ถ้าสแตกเต็ม (Stack Overflow) ก็จะไม่สามารถเพิ่มข้อมูลเข้าไปในสแตกได้อีก
2. Pop คือ การนำข้อมูลออกจากส่วนบนสุดของสแตก โดยการนำข้อมูลออกจากสแตก ถ้าสแตกมีสมาชิก เพียง 1ตัว แล้วนำสมาชิกออกจากสแตก จะเกิดสภาวะสแตกว่าง (Stack Empty)
3. Stack Top เป็นการคัดลอกข้อมูลที่อยู่บนสุดของสแตก แต่ไม่ได้นำเอาข้อมูลนั้นออกจากสแตกการแทนที่ข้อมูลของสแตกสามารถทำได้ 2 วิธี คือ
1> การแทนที่ข้อมูลของสแตกแบบลิงค์ลิสต์ ประกอบไปด้วย2 ส่วน คือ
2> การแทนที่ข้อมูลของสแตกแบบอะเรย์
DTS-05 22/07/52
การทำงานแบบโครงสร้างข้อมูลแบบสแตกที่สามารถเห็นได้ในชีวิตประจำวันทั่วไปได้แก่ การวางจานซ้อนกันต้องวางจานลงบนกล่องเก็บจานจากล่างสุดที่ละใบ และสามารถใส่ได้จนเต็มกล่อง และเมื่อมีการวางจานจนเต็มกล่องแล้วจะไม่สามารถวางจานซ้อนได้อีกเพราะกล่องมีสภาพเต็ม แต่เมื่อเราจะหยิบจานไปใช้ เราต้องหยิบใบบนสุด ซึ่งเป็นจานที่ถูกวางเก็บเป็นอันดับสุดท้ายออกได้เป็นใบแรก และสามารถหยิบออกที่ละใบจากบนสุดเสมอ ส่วนจานที่ถูกวางเก็บเป็นใบแรก จะนำไปใช้ได้ก็ต่อเมื่อนำจานที่วางทับมันอยู่ออกไปใช้เสียก่อน และจะหยิบออกไปใช้เป็นใบสุดท้าย
21 กรกฎาคม 2552
สรุป 04
DTS-04 15/07/52
#include
main()
{
int no;
float hour,rate,income,net_income,tax;
char name[20];
printf("Computer employee's income \n");
printf("\nCode Number = ");
scanf("%d",&no);
printf("Name = ");
scanf("%s",&name);
printf("Hour = ");
scanf("%f",&hour);
printf("Rate = ");
scanf("%f",&rate);
income = hour * rate ;
tax = income * 0.10;
net_income = income - tax ;
printf("\n\n Income = %f ",income);
printf("\n tax = %f ",tax);
printf("\n Net_Income = %f ",net_income);
}
Iostream.h
#include
main()
{
int no;
float hour,rate,income,net_income,tax;
char name[20];
cout<<"Computer employee 's income"; cout<<"\nCode Number = "; cin>>no;
cout<<"Name = "; cin>>name;
cout<<"Hour = "; cin>>hour;
cout<<"Rate = "; cin>>rate;
income = hour * rate ;
tax = income * 0.10;
net_income = income - tax ;
cout<<"\n\n Income = "<< income;
cout<<"\n tax = "<< tax;
cout<<"\n Net_Income = "<< net_income;
}
14 กรกฎาคม 2552
สรุป 03
จากการเรียนวิชาโครงสร้างข้อมูลครั้งที่ 3 นั้นได้รับความรู้เกี่ยวกับเรื่อง การเขียนโปรแกรมโดยภาษาซีโดยการใช้รูปแบบ
Pointer โดย Pointer จะเก็บ Address ของตัวแปร แทนที่จะเก็บข้อมูลต่างๆ เหมือนตัวแปรชนิดอื่นๆ จากคุณสมบุติของ ตัวแปรชนิด Pointer จึงมองดูเหมือนกับ ตัวชี้ หรือพอยน์เตอร์ ซึ่งชี้ไปที่ Address ของตัวแปร
นอกจากนี้ยังสามารถนำตวามรู้ที่ได้จาก Pointer ไปใช้ในการประยุกต์เขียนโปรแกรมภาษาซี
DTS-03 01/07/52
ตอบ
#include"stdio.h"
int main(void)
{
char name[10]={'P','A','T','C','H','A','N','O','N','\0'};
char name1[3][3]={"PAT","CHA","NON"};
printf("Array 1\n");
printf("%c%c%c%c%c%c%c%c%c\n",name[0],name[1],name[2],name[3],name[4],name[5],name[6],name[7],name[8]);
printf("\nArray 2\n");
printf("%c%c%c%c%c%c%c%c%c\n",name1[0][0],name1[0][1],name1[0][2],name1[1][0],name1[1][1],name1[1][2],name1[2][0],name1[2][1],name1[2][2]);
}
2. ให้นักศึกษาหาค่าของ A[2],A[6]จากค่า A={2,8,16,24,9,7,3,8}
ตอบ
A[2] = 16
A[6] = 3
3. จากค่าของ int a[2][3]={{6,5,4},{3,2,1}}; ให้นักศึกษาหาค่าของ a[1][0] และ a[0][2]
ตอบ
a[1][0] = 3
a[0][2] = 4
4. ให้นักศึกษากำหนด structure ที่มีค่าของข้อมูลอย่างน้อย 6 Records
ตอบ
#include"stdio.h"
struct sporting
{
int date;
int month;
int year;
char name[20];
char sex[10];
int age;
char job[20];
char sport[20];
}sport;
void input_data()
{
printf("DATA\n");
printf("date is (dd/mm/yy): ");
scanf("%d/%d/%d",&sport.date,&sport.month,&sport.year);
printf("name: ");
scanf("%s",&sport.name);
printf("sex: ");
scanf("%s",&sport.sex);
printf("age: ");
scanf("%d",&sport.age);
printf("job: ");
scanf("%s",&sport.job);
printf("What you like sport: ");
scanf("%s",&sport.sport);
}
void show_data()
{
printf("\n\nDisplay your data is\n");
printf("date: ");
printf("%d:%d:%d\n",sport.date,sport.month,sport.year);
printf("name: ");
printf("%s\n",sport.name);
printf("sex: ");
printf("%s\n",sport.sex);
printf("age: ");
printf("%d\n",sport.age);
printf("job: ");
printf("%s\n",sport.job);
printf("What you like sport: ");
printf("%s\n",sport.sport);
}
main()
{
input_data();
show_data();
}
5. ให้นักศึกษาบอกความแตกต่างของการกำหนดตัวชนิด Array กับตัวแปร Pointer ในสภาพของการกำหนดที่อยู่ของข้อมูล
ตอบ
ความแตกต่างระหว่างตัวแปร Array และ Pointer คือตัวแปรตารางอาเรย์จะเก็บเฉพาะค่าต่างๆ ที่เป็นชนิดกันเดียวกับตัวแปรอาเรย์แต่ ตัวแปรพอยเตอร์จะเก็บเฉพาะค่าตำแหน่ง Address ตัวแปรเท่านั้น
30 มิถุนายน 2552
29 มิถุนายน 2552
DTS-02 24/06/52
struct telephone
{
int date;
int month;
int year;
char name[20];
char sex[6];
int age;
char series[20];
int price;
}tel;
void input_data()
{
printf("Customer in mobile shop\n");
printf("date is (dd/mm/yy): ");
scanf("%d/%d/%d",&tel.date,&tel.month,&tel.year);
printf("name: ");
scanf("%s",&tel.name);
printf("sex: ");
scanf("%s",&tel.sex);
printf("age: ");
scanf("%d",&tel.age);
printf("series: ");
scanf("%s",&tel.series);
printf("price: ");
scanf("%d",&tel.price);
}
void show_data()
{
printf("\n\nDisplay your data is\n");
printf("date: ");
printf("%d:%d:%d\n",tel.date,tel.month,tel.year);
printf("name: ");
printf("%s\n",tel.name);
printf("sex: ");
printf("%s\n",tel.sex);
printf("age: ");
printf("%d\n",tel.age);
printf("series: ");
printf("%s\n",tel.series);
printf("price: ");
printf("%d\n",tel.price);
}
main()
{
input_data();
show_data();
}
สรุป 02
1. ได้ทราบว่าอะเรย์มี 1 มิติ หลายมิติและความสัมพันธ์ระหว่าง เรคคอร์ด กับอะเรย์ และอะเรย์ ชนิดโครงสร้าง
2. ทราบถึงการส่งการทำงานของ Array โดยฟังก์ชั่นและ โปรแกรม
3. ทราบการประกาศอาร์กิวเมนต์ในฟังก์ชันเป็นอะเรย์ ถ้าเป็นอะเรย์มิติเดียว สามารถทำได้ทั้งหมด 3 วิธี
3.1 มีการประกาศขนาดของอะเรย์ที่ทำหน้าที่ในการรับค่า
3.2 ไม่ต้องมีการประกาศขนาดของอะเรย์ที่ทำหน้าที่ในการรับค่า
3.3 ตัวแปรที่ทำหน้าที่รับค่าถูกกำหนดเป็นพอยน์เตอร์
4. ทราบวิธีการดำเนินการที่เกี่ยวข้องกับเรคคอร์ดของข้อมูล
5. สามารถนำความรู้ที่ได้เรียน ไปเขียนโปรแกรมเพื่อนำไปใช้ในชีวิตประจำวันได้