25.โครงสร้างข้อมูล Data structures

ลอกมาจาก....http://marcuscode.com/lang/cpp/structures

Data structures

Data structure หรือโครงสร้างข้อมูลเป็นกลุ่มของตัวแปรที่สามารถรวมอยู่ในตัวแปรตัวเดียว เราเรียกว่า structure ตัวแปรที่อยู่ข้างในประเภทข้อมูลนี้เรียกว่า members หรือสมาชิกของ structure ซึ่งสมาชิกของมันสามารถเป็นประเภทอื่นๆ และมีขนาดต่างๆ ในภาษา C++ เราสามารถสร้างโครงสร้างข้อมูลจากรูปแบบตามนี้:
struct struct_name
{
    member_type1 member_name1;
    member_type2 member_name2;
    member_type3 member_name3;
    .
    .
} object_names;
เมื่อ struct_name เป็นชื่อของโครงสร้างข้อมูลที่เราจะใช้เพื่อประกาศออบเจ็ค เราสามารถสร้างออบเจ็คของโครงสร้างข้อมูลได้ในทันทีในตอนท้ายหลังจากการประกาศโครงสร้างข้อมูล ในวงเล็บ {} เราจะสร้างและกำหนดตัวแปรที่เราจะใช้สำหรับโครงสร้างข้อมูลนี้
struct person
{
    string name;
    int age;
    float money;
};
person student, teacher, doctor;
ในตัวอย่างนี้ เราได้สร้างโครงสร้างข้อมูลที่มีชื่อว่า person เรามีตัวแปร 3 ตัว ซึ่งแต่ละตัวมีประเภทของตัวแปรที่เหมาะสม หลังจากนั้นเราสร้างออบเจ็คของโครงสร้างข้อมูล person สามอัน จากตัวอย่างนี้ เราได้สร้างออบเจ็คของ person ในทันทีหลังจากที่โครงสร้างข้อมูลถูกสร้าง
struct person {
    string name;
    int age;
    float money;
} student, teacher, doctor;

Assign and reading structure members

เราได้สร้างโครงสร้างออบเจ็คของโครงสร้างข้อมูล person ซึ่งแต่ละออบเจ็คจะมีสมาชิกของ person ข้างในมัน เราสามารถเข้าถึงสมาชิกของ structure ได้โดยการใช้เครื่องหมายจุด (.) และตามด้วยชื่อของสมาชิก เช่น student.name ต่อไปเราจะดูตัวอย่างของการใช้โครงสร้างข้อมูล
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct person
{
    string name;
    int age;
    float money;
};

int main ()
{
    person student, teacher;

    student.name = "Mateo";
    student.age= 14;
    student.money = 50.4;

    cout << "Enter teacher name: ";
    cin >> teacher.name;
    cout << "Enter teacher age: ";
    cin >> teacher.age;
    cout << "Enter teacher money: ";
    cin >> teacher.money;

    cout << "Student's info" << endl;
    cout << student.name << " is " << student.age;
    cout << " year old and has $" << student.money << endl;
    cout << "Teacher's info" << endl;
    cout << teacher.name << " is " << teacher.age;
    cout << " year old and has $" << teacher.money << endl;

    return 0;
}
ในตัวอย่างนี้เราใช้โครงสร้างข้อมูล person ที่เราเพิ่งสร้างในตัวอย่างก่อนหน้า และประกาศตัวแปรของโครงสร้างข้อมูล person สองตัวแปรคือ student และ teacher สมาชิกในตัวแปรโครงสร้างข้อมูล (Structure object) สามารถเข้าถึงได้โดยชื่อของโครงสร้างข้อมูลตามด้วยเครื่องหมายจุด (.) และตามด้วยชื่อตัวแปรสมาชิกที่อยู่ในโครงสร้างข้อมูล ดังนั้น เราสามารถทำได้ทุกอย่างเหมือนกับตัวแปร แต่ในการเข้าถึงจะแตกต่าง ซึ่งเป็นการเข้าถึงข้อมูลแบบออบเจ็ค
Enter teacher name: John
Enter teacher age: 30
Enter teacher money: 1043
Student's info
Mateo is 14 year old and has $50.4
Teacher's info
John is 30 year old and has $1043
หลังจากนั้นเราได้ทดลองรันโปรแกรม และนี่เป็นผลลัพธ์การทำงานของโปรแกรม โดยเราได้กำหนดข้อมูลของนักเรียนในโค้ดและข้อมูลของอาจารย์นั้นรับค่าเข้ามาทางคีย์บอร์ด

การใช้ Struct กับอาเรย์และฟังก์ชัน

Struct นั้นเป็นโครงสร้างข้อมูลและมันถือว่าเป็นข้อมูลประเภทหนึ่งในภาษา C++ เพราะมันเป็นข้อมูลแบบ Valued type ตัวอย่างต่อไปจะเป็นการใช้งาน Struct กับอาเรย์
#include <iostream>
#include <cstdlib> // srand()
#include <ctime> // time()
#include <cmath> // pow(), sqrt()

using namespace std;

struct point
{
    int x;
    int y;
    int z;
};

// find distance between two points in 3D
double distance3D(point a, point b)
{
    return sqrt(pow(b.x - a.x, 2) +
                pow(b.y - a.y, 2) +
                pow(b.z - a.z, 2));
}

// random number between min and max
int getRandomNumber(int min, int max)
{
    return rand() % (max - min) + min;
}

int main()
{
    const int SIZE = 10;

    //initialize random seed
    srand(time(NULL));

    // declare array of struct
    point p1[SIZE];
    point p2[SIZE];

    for (int i = 0; i < SIZE; i++)
    {
        p1[i].x = getRandomNumber(0, 10); // random  0 to 10
        p1[i].y = getRandomNumber(0, 10);
        p1[i].z = getRandomNumber(0, 10);

        p2[i].x = getRandomNumber(0, 10);
        p2[i].y = getRandomNumber(0, 10);
        p2[i].z = getRandomNumber(0, 10);
    }

    for (int i = 0; i < SIZE; i++)
    {
        cout << "[";
        cout << p1[i].x << ", " << p1[i].y << ", " << p1[i].z;
        cout << "] to [";
        cout << p2[i].x << ", " << p2[i].y << ", " << p2[i].z;
        cout << "] = " << distance3D(p1[i], p2[i]) << endl;
    }

    return 0;
}
ในตัวอย่าง เราได้ประกาศ struct point สำหรับเก็บพิกัดในสามมิติ และเราได้สร้างอาเรย์ของ struct มาสองตัวคือ p1 และ p2 อาเรย์เหล่านี้ถูกกำหนดขนาดให้เป็น 10 โดยโปรแกรมของจะทำการสุ่มค่าพิกัดในสามมิติจากที่มีค่าในจุดต่างๆ ระหว่าง 0 - 10 ลงในอาเรย์ทั้งสองอย่างละ 10 พิกัด หลังจากสุ่มค่าเสร็จสิ้นแล้ว เราทำการหาระยะห่างของทั้งสองจุดที่เป็นคู่อันดับกันไปในอาเรย์
double distance3D(point a, point b)
{
    return sqrt(pow(b.x - a.x, 2) +
                pow(b.y - a.y, 2) +
                pow(b.z - a.z, 2));
}
ฟังก์ชัน distance3D() เป็นฟังก์ชันในการหาระยะห่างของจุดสองจุดในสามมิติของเรา ในฟังก์ชันนั้นมีพารามิเตอร์เป็น struct โดยเราได้ให้ตัวอย่างในการใช้งาน struct กับฟังก์ชัน โดยเราได้ส่งจุดสองจุดสำหรับหาระยะห่างเข้ามาจากสูตร
[5, 7, 0] to [9, 8, 1] = 4.24264
[4, 4, 1] to [2, 5, 8] = 7.34847
[3, 8, 5] to [8, 1, 0] = 9.94987
[2, 4, 1] to [8, 0, 9] = 10.7703
[3, 3, 4] to [8, 8, 7] = 7.68115
[9, 3, 8] to [9, 4, 0] = 8.06226
[8, 7, 6] to [3, 9, 6] = 5.38516
[1, 3, 2] to [9, 5, 6] = 9.16515
[7, 7, 3] to [3, 2, 9] = 8.77496
[8, 4, 9] to [1, 6, 5] = 8.30662
นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการหาระยะห่างในสามมิติของระหว่างจุดสองจุดทั้ง 10 คู่ ที่โปรแกรมสุ่มได้
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการสร้างและใช้งานโครงสร้างข้อมูลในภาษา C++ ซึ่งโครงสร้างข้อมูลนั้นเป็นประเภทข้อมูลของมันเอง ที่ประกอบสมาชิกหรือข้อมูลอื่นอยู่ภายใน และนอกจากนี้ คุณยังได้เห็นตัวอย่างในการใช้งานโครงสร้างข้อมูลกับอาเรย์กับการส่งเข้าไปยังฟังก์ชัน
**********************************************************************************************************************************************
โครงสร้างข้อมูล..
จากบทความที่ผ่านมาจะเห็นได้ว่าเราใช้อาร์เรย์ในการเก็บข้อมูลตัวแปรมากกว่าหนึ่งตัวไว้ภายใต้ชื่อของอาร์เรย์เพียงตัวเดียวซึ่งข้อมูลภายในอาร์เรย์ต้องเป็นข้อมูลประเภทเดียวกันเท่านั้น ในภายหลังจึงมีการต่อยอดแนวคิดนี้ออกไปเพื่อใช้ในการสร้างประเภทข้อมูลใหม่ ที่สามารถเก็บค่าได้หลาย ๆ ค่าและสามารถเก็บข้อมูลประเภทที่แตกต่างกันได้ ซึ่งผู้ใช้งานต้องกำหนดประเภทและชื่อของตัวแปรนั้นตั้งแต่เริ่มต้น

      เนื่องจากใน C++ ได้มีการเพิ่มคุณสมบัติของโครงสร้างข้อมูลจาก C ไปมากพอสมควร โดยคุณสมบัติต่าง ๆ ที่มีใน C นั้น C++ ยังคงสามารถนำไปใช้งานได้เช่นเดิม ดังนั้นในที่นี้จึงขอกล่าวถึงลักษณะการใช้งานโครงสร้างข้อมูล C ก่อน และจะอธิบายเพิ่มเติมในส่วนของ C++ ในส่วนท้ายของบทความนี้
      สำหรับภาษา C มีการทำงานที่เกี่ยวข้องกับโครงสร้างข้อมูลอยู่สองลักษณะได้แก่ struct และ union

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

      โครงสร้างข้อมูลแบบ struct ใช้ในการจัดเก็บกลุ่มของข้อมูลตัวแปรที่แตกต่างกันภายใต้ชื่อเดียวกันและเรียกตัวแปรที่อยู่ภายในโครงสร้างข้อมูลนี้ว่าสมาชิกหรือ member ของโครงสร้างข้อมูลโดยมีลักษณะการประกาศดังนี้
ลักษณะของการประกาศโครงสร้างข้อมูล
รูปที่ 1. ลักษณะของการประกาศโครงสร้างข้อมูล
ขอให้จำไว้ว่าส่วนท้ายสุดในการนิยามโครงสร้างข้อมูลต้องตามด้วยเครื่องหมาย “;” เสมอเพื่อให้คอมไพเลอร์รับทราบว่าเป็นการสิ้นสุดการประกาศโครงสร้างข้อมูลแล้ว
      ตัวอย่างต่อไปนี้เป็นการสร้างโครงสร้างข้อมูลของพนักงานภายในบริษัท ซึ่งประกอบไปด้วย ชื่อของพนักงานและเงินเดือนสามารถนิยามโครงสร้างข้อมูลของพนักงานแต่ละคนในบริษัทได้ดังนี้
1
2
3
4
struct SEmployee{
  char name[32];
  int salary;
}employee;
      จากโครงสร้าง SEmployee จะประกอบไปด้วยตัวแปรสมาชิกจำนวนสองตัวได้แก่ name และ salary และตัวแปรของโครงสร้งข้อมูลนี้ คือ employee
      หากในการประกาศโครงสร้างข้อมูลยังไม่ต้องการประกาศตัวแปรของโครงสร้างทันที เราสามารถละเว้นส่วนประกาศตัวแปรของโครงสร้างข้อมูลได้เช่นกัน ซึ่งสามารถประกาศใหม่ได้ดังนี้
1
2
3
4
struct SEmployee{
  char name[32];
  int salary;
};
      หากพูดให้เข้าใจง่ายขึ้นเราอาจมองได้ว่าการประกาศโครงสร้างข้อมูลด้วย struct คือการนิยามลักษณะของกลุ่มข้อมูลขึ้นมาเพื่อใช้งานเอง จากประเภทของตัวแปรที่มีอยู่แล้วใน C และ C++ นั่นเอง
      เนื่องจากโครงสร้างข้อมูลเป็นชนิดข้อมูลใหม่ที่ประกอบจากตัวแปรสมาชิกหลาย ๆ ตัวเข้ามารวมกัน ดังนั้นหากต้องการประกาศตัวแปรของโครงสร้างจะแตกต่างจากการประกาศตัวแปรทั่วไปเล็กน้อย โดยให้ทำการประกาศคำสำคัญ (keyword) struct ไว้หน้าชื่อโครงสร้างข้อมูลแล้วตามด้วยชื่อตัวแปรของโครงสร้างข้อมูลนั้น ดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
struct SEmployee{
  char name[32];
  int salary;
};
void main()
{
  struct SEmployee employee;
}
      จากโค้ดตัวอย่างภายในฟังก์ชัน main() ได้มีการประกาศตัวแปรของโครงสร้างในชื่อของ employee ซึ่งแตกต่างจากการประกาศตัวแปรปรกติทั่วไปเนื่องจาก employee เป็นตัวแปรของโครงสร้างข้อมูล SEmployee นั่นเอง

การใช้ typedef เพื่อนิยามโครงสร้งข้อมูล

      จากตัวอย่างที่ผ่านมาจะเห็นได้ว่าในการประกาศตัวแปรของโครงสร้างข้อมูลต้องมีคำสำคัญ struct อยู่ด้านหน้าชื่อโครงสร้างข้อมูลแล้วจึงตามด้วยชื่อของตัวแปรโครงสร้างข้อมูลเสมอซึ่งยุ่งยากพอสมควร ดังนั้นเพื่อให้การประกาศตัวแปรของโครงสร้างข้อมูลง่ายขึ้นจึงนิยมใช้ typedef มาช่วยลดขั้นตอนในการประกาศตัวแปร
      คำสำคัญ typedef เป็นสิ่งที่ใช้นิยามประเภทตัวแปรชนิดใหม่ขึ้นมาให้คอมไพเลอร์รับรู้ว่ามีประเภทข้อมูลใหม่เกิดขึ้นทำให้ง่ายในการนำไปใช้งานสำหรับการประกาศตัวแปร เราสามารถใช้ typedef เพื่อนิยามลักษณะข้อมูลที่เป็นแบบโครงสร้างข้อมูล หรือเป็นประเภทข้อมูลพื้นฐานก็ได้
      การนิยามประเภทข้อมูลขึ้นมาใหม่ทำให้มีลักษณะการใช้งานประเภทข้อมูลนั้นเหมือนกับชนิดข้อมูลพื้นฐานทั่วไปที่มีอยู่ใน C และ C++ เช่นเดียวกับข้อมูลประเภท int, float, char ฯ เพียงแต่สำหรับโครงสร้างข้อมูลนั้นจะสามารถเก็บค่าได้มากกว่าหนึ่งค่าโดยมีลักษณะการใช้งานดังนี้
การใช้ typedef นิยามประเภทข้อมูลใหม่จากโครงสร้างข้อมูล
รูปที่ 2. การใช้ typedef นิยามประเภทข้อมูลใหม่จากโครงสร้างข้อมูล
      จากภาพโครงสร้างด้านบนจะเห็นได้ว่าคล้ายกับการประกาศโครงสร้างข้อมูลพร้อมประกาศตัวแปรดังที่ได้แสดงไว้ในรูปที่ 1 เพียงแต่เพิ่มคำสำคัญ typedef และเปลี่ยนจากประกาศตัวแปรของโครงสร้างข้อมูล เป็นการประกาศชนิดข้อมูลใหม่แทน ซึ่งคนที่เริ่มศึกษา C และ C++ ส่วนใหญ่จะสับสนในการใช้งานตรงจุดนี้ ดังนั้นขอให้จำไว้ว่าหากมีคำสำคัญ typedef ประกาศไว้หน้าโครงสร้างข้อมูลหมายถึงการนิยามประเภทข้อมูลใหม่ขึ้นมา ไม่ใช่การประกาศตัวแปรของโครงสร้างข้อมูลแต่อย่างใด
      เมื่อเราใช้คำสำคัญ typedef เพื่อนิยามประเภทข้อมูลใหม่แล้วในการประกาศตัวแปรของโครงสร้างข้อมูลจะสามารถประกาศได้เช่นเดียวกับการประกาศตัวแปรทั่ว ๆ ไป กล่าวคือ ให้เริ่มจากประเภทของข้อมูล และตามด้วยชื่อตัวแปร ดังตัวอย่างต่อไปนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
typedef struct SEmployee{
  char name[32];
  int salary;
}SEMPLOYEE;
void main()
{
  struct SEmployee employee;
  SEMPLOYEE manager;
}
      จากตัวอย่างด้านบนจะเห็นได้ว่าถึงแม้เราได้ทำการนิยามประเภทของโครงสร้างข้อมูลเป็น SEMPLOYEE แล้วก็ตาม เรายังคงสามารถประกาศตัวแปร employee ตามลักษณะเดิมได้เช่นกัน ในขณะที่ตัวแปร manager ที่ประกาศเพิ่มเข้ามาเป็นการใช้งานในลักษณะใหม่ซึ่งมีผลมาจากการนำเอาคำสำคัญ typedef มาใช้นั่นเอง ซึ่งจะเห็นได้ว่าวิธีนี้มีความสะดวกมากกว่าเมื่อเทียบกับการประกาศตัวแปรของโครงสร้างข้อมูลวิธีแรก

การเข้าถึงสมาชิกในโครงสร้างข้อมูลผ่านทางตัวแปรของโครงสร้างข้อมูล

      ในการเข้าถึงข้อมูลภายในโครงสร้างที่กำหนดขึ้นจะใช้สัญลักษณ์ “.” ตามหลังชื่อของตัวแปรของโครงสร้างนั้นตัวอย่าง เช่น employee.salary = 25000; เป็นต้น ดังตัวอย่างต่อไปนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
typedef struct SEmployee{
  char name[32];
  int salary;
}SEMPLOYEE;
void main()
{
  SEMPLOYEE employee;
  cout << "Enter name ";
  cin >> employee.name;
  cout << "Employee name is " << employee.name << endl;
}
ผลลัพธ์จากโค้ดตัวอย่าง
รูปที่ 3. ผลลัพธ์จากโค้ดตัวอย่าง

ตัวชี้กับโครงสร้างข้อมูล

      ตัวชี้สามารถจัดการกับข้อมูลสมาชิกที่อยู่ภายในโครงสร้างข้อมูลได้เช่นเดียวกับตัวแปรของโครงสร้างข้อมูล ซึ่งเราอาจให้ตัวชี้ชี้ไปยังตำแหน่งหน่วยความจำของโครงสร้างข้อมูลโดยตรงด้วยคำสั่ง new() หรืออาศัยการอ้างอิงจากหน่วยความจำของตัวแปรของโครงสร้างข้อมูลก็ได้ ดังลักษณะการทำงานต่อไปนี้
1
2
3
struct SEmployee *pemployee = new struct SEmployee();
...
delete pemployee;
      วิธีนี้เป็นการประกาศโครงสร้างข้อมูลโดยไม่ทำการนิยามชนิดข้อมูลใหม่ด้วย typedef ทำให้การจองหน่วยความจำของตัวชี้ค่อนข้างยืดยาวในการเขียนโค้ด
1
2
3
SEMPLOYEE *pemployee = new SEMPLOYEE();
...
delete pemployee;
      วิธีนี้จะสั้นกว่าวิธีแรกเนื่องจากเราได้ทำการนิยามโครงสร้างข้อมูลเป็นชนิดข้อมูลใหม่ด้วย typedef แล้วทำให้การเขียนโปรแกรมสั้นลง
1
2
SEMPLOYEE employee;
SEMPLOYEE *pemployee = &employee;
      วิธีนี้ให้ตัวชี้ pemployee เก็บตำแหน่งหน่วยความจำของตัวแปรโครงสร้างข้อมูล employee ไว้เพื่อนำไปใช้งานต่อซึ่งวิธีนี้โปรแกรมเมอร์ไม่จำเป็นต้องคืนหน่วยความจำด้วยคำสั่ง delete() ดังสองตัวอย่างที่ผ่านมาเนื่องจากเราไม่ได้ทำการจองหน่วยความจำใหม่ให้กับตัวชี้ pemployee ด้วยคำสั่ง new() แต่อย่างใด หากพยามคือหน่วยความจำด้วยคำสั่ง delete() จะพบข้อผิดพลาดในขณะที่โปรแกรมทำงานอยู่ซึ่งเรียกว่า Runtime error
การเกิด Runtime error
รูปที่ 4. การเกิด Runtime error
      สาเหตุที่เกิดข้อผิดพลาดนี้เนื่องจากตัวชี้ pemployee ได้อ้างถึงตำแหน่งหน่วยความจำของตัวแปรโครงสร้างข้อมูล employee ซึ่งเป็นตำแหน่งหน่วยความจำที่อยู่ในสแตก (Stack) และจะคืนหน่วยความจำโดยอัตโนมัติเองเมื่อสิ้นสุดขอบเขตการทำงานของตัวแปร ดังนั้นการใช้คำสั่ง delete() กับตัวชี้ pemployee จึงเป็นการพยามคืนหน่วยที่อยู่ในสแตกนั่นเอง

การเข้าถึงสมาชิกภายในโครงสร้างข้อมูลด้วยตัวชี้

      การเข้าถึงสมาชิกด้วยตัวชี้จะมีลักษณะคล้ายกับการเข้าถึงด้วยตัวแปรของโครงสร้างข้อมูล เพียงแต่เปลี่ยนสัญลักษณ์จาก “.” เป็น “->” เท่านั้นดังตัวอย่างต่อไปนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
typedef struct SEmployee{
  char name[32];
  int salary;
}SEMPLOYEE;
void main()
{
  SEMPLOYEE *pemployee = new SEMPLOYEE();
  cout << "Enter name ";
  cin >> pemployee->name;
  cout << "Employee name is " << pemployee->name << endl;
  delete pemployee;
}
      รายละเอียดของโครงสร้างข้อมูลแบบ struct ที่กล่าวมานี้เป็นคุณสมบัติของโครงสร้างข้อมูลที่มีใช้ใน C ซึ่งสามารถนำไปใช้งานใน C++ ได้เช่นกัน
************************************************************************************************************************************************

สอน ​​C++: การใช้ struct (data structure)




#include <iostream>
#include <cmath>

using namespace std;
struct Coor {
    double x, y;
};

double distance(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}

double distance2(Coor p1, Coor p2) {
    return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}

int main() {
    cout << distance(1, 5, 7, 10) << endl;
    cout << distance2({1, 5}, {7, 10}) << endl;
//    Coor p1;
//    p1.x = 5;
//    p1.y = 7;
//    cout << p1.x << endl;
//    cout << p1.y << endl;
//
//    cout << "--------" << endl;
//    Coor p2{5, 7};
//    cout << p2.x << endl;
//    cout << p2.y << endl;
//
//    struct Person {
//        string fname, lname;
//        double height, weight;
//        int age;
//    };
//
//    Person ps1{"Peter", "Parker", 170, 68, 22};

    return 0;
}
**************************************************************************************************************************************************



Structures in C++

Structure is a compound data type that contains different variables of different types. For example, you want to store Student details like student name, student roll num, student age. You have two ways to do it, one way is to create different variables for each data, but the downfall of this approach is that if you want to store the details of multiple students, in that case it is not feasible to create separate set of variables for each student.
The second and best way of doing it by creating a structure like this:
struct Student
{
    char stuName[30];
    int stuRollNo;
    int stuAge;
};
Now these three members combined will act like a separate variable and you can create structure variable like this:
structure_name variable_name
So if you want to hold the information of two students using this structure then you can do it like this:
Student s1, s2;
Then I can access the members of Student structure like this:
//Assigning name to first student
s1.stuName = "Ajeet";
//Assigning age to the second student
s2.stuAddr = 22;
Similarly I can set and get the values of other data members of the structure for every student. Lets see a complete example to put this up all together:

Structure Example in C++

#include <iostream>
using namespace std;
struct Student{
   char stuName[30];
   int stuRollNo;
   int stuAge;
};
int main(){
   Student s;
   cout<<"Enter Student Name: ";
   cin.getline(s.stuName, 30);
   cout<<"ENter Student Roll No: ";
   cin>>s.stuRollNo;
   cout<<"Enter Student Age: ";
   cin>>s.stuAge;
   cout<<"Student Record:"<<endl;
   cout<<"Name: "<<s.stuName<<endl;
   cout<<"Roll No: "<<s.stuRollNo<<endl;
   cout<<"Age: "<<s.stuAge;
   return 0;
}
Output:
Enter Student Name: Negan
ENter Student Roll No: 4101003
Enter Student Age: 22
Student Record:
Name: Negan
Roll No: 4101003
Age: 22
****************************************************************************************************************************************************************

Easy Programming - Beginner C++ Tutorial - Data Structures - Structs (21)



*******************************************************************************************************************************************

C++ Tutorial - 22 - Structures



*************************************************************************************************************************************************

Intro to C++: Structs


********************************************************************************************************************************************

C++ Programming Tutorial 83 - Creating a Struct