โครงสร้างข้อมูล (C/C++)



วันนี้เป็นเรื่องโครงสร้างช้อมูล ถ้าเราเคยใช้ระบบ record ของฐานข้อมูล DBASE, Foxpro หรือ ฐานข้อมูลอื่นๆ จะเห็นโครงสร้างข้อมูล จะมีรายละเอียดย่อยที่เราเรียกว่า ฟิลด์ และการใช้งานในลักษณะนั้น สามารถทำได้แบบนี้

#include <stdio.h>#include <conio.h>
typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง
{ //<--- ขอบเขตของโครงสร้าง
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
char name[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ name
}; //<--- สิ้นสุดขอบเขตของโครงสร้าง
int main( )
{
struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1
strcpy( rec1.data, "Sawasdee" ); //<----- copy ข้อความให้ฟิลด์ data ของ rec1
printf( "%s\n", rec1.data ); //<----- พิมพ์ข้อมูล
return 0;
}

Sawasdee

. . . . . . . .จากตัวอย่างข้างบน วิธีการกำหนดโครงสร้างให้ทำแบบนี้
typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง
{
//...... ข้างในนี้คือรายการย่อยเรียกว่า ฟิลด์
};
การกำหนดตัวแปรโครงสร้างให้ทำแบบนี้
struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1
การใช้งานฟิลด์ในโครงสร้างให้ทำแบบนี้
rec1.data //<------- ให้ใส่จุดไช่ปลาแล้วตามด้วยชื่อฟิลด์
ดูแล้วไม่ยากเลยใช่ไหม กลับไปดูใหม่ได้นะครับ ต่อไปเป็นโครงสร้างแบบซ้อน

#include <stdio.h>#include <conio.h>
typedef struct TSubRecord
{
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
};
typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง
{ //<--- ขอบเขตของโครงสร้าง
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน
}; //<--- สิ้นสุดขอบเขตของโครงสร้าง
int main( )
{
struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1
strcpy( rec1.data, "Sawasdee" ); //<----- copy ข้อความให้ฟิลด์ data ของ rec1
strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1
printf( "%s\n", rec1.data ); //<----- พิมพ์ข้อมูล
printf( "%s\n", rec1.sub1.data ); //<----- พิมพ์ข้อมูล
return 0;
}

SawasdeeSawasdee2

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

#include <stdio.h>#include <conio.h>
typedef struct TSubRecord
{
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
};
typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง
{ //<--- ขอบเขตของโครงสร้าง
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
int value1; //<------ กำหนดแบบ Integer
long value2; //<--- กำหนดแบบ long
struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน
}; //<--- สิ้นสุดขอบเขตของโครงสร้าง
int main( )
{
struct TRecord rec1;
strcpy( rec1.data, "Sawasdee" );
rec1.value1 = 100;
rec1.value2 = 200;
strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1
printf( "%s\n", rec1.data );
printf( "%i\n", rec1.value1 );
printf( "%i\n", rec1.value2 );
printf( "%s\n", rec1.sub1.data );
return 0;
}

Sawasdee100
200
Sawasdee2

สรุป ได้อะไรบ้าง


typedef struct TSubRecord{
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
};
typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง
{ //<--- ขอบเขตของโครงสร้าง
char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data
int value1; //<------ กำหนดแบบ Integer
long value2; //<--- กำหนดแบบ long
struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน
}; //<--- สิ้นสุดขอบเขตของโครงสร้าง
strcpy( rec1.data, "Sawasdee" );
rec1.value1 = 100;
rec1.value2 = 200;
strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1

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