Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Struct (Cấu trúc) trong C: Khai báo, khởi tạo, truy cập

Struct là gì?

Struct (cấu trúc) là kiểu dữ liệu do người dùng định nghĩa, gom nhiều biến khác kiểu (int, float, char...) dưới một tên chung. Giúp tổ chức dữ liệu liên quan thành một đơn vị logic.

Khai báo Struct

// Cách 1: Khai báo kèm tên tag
struct Sach {
    int soTrang;
    char tacGia[30];
    float gia;
};

// Cách 2: Khai báo và định nghĩa biến ngay
struct {
    int soTrang;
    char tacGia[30];
    float gia;
} sach1, sach2;

// Cách 3: Dùng typedef (phổ biến nhất)
typedef struct {
    int soTrang;
    char tacGia[30];
    float gia;
} Sach;

Sach s1, s2;  // Dùng như kiểu dữ liệu bình thường

Khởi tạo Struct

Cách 1: Khởi tạo khi khai báo (danh sách giá trị)

struct Sach {
    int soTrang;
    char tacGia[30];
    float gia;
} s = {100, "Balu", 325.75};

Cách 2: Khởi tạo từng thành viên (toán tử .)

struct Sach s;
s.soTrang = 100;
strcpy(s.tacGia, "Balu");
s.gia = 325.75;

Cách 3: Nhập từ bàn phím (scanf)

struct Sach s;
printf("Nhap so trang, tac gia, gia: ");
scanf("%d %s %f", &s.soTrang, s.tacGia, &s.gia);
// Lưu ý: mảng char không cần &, các kiểu khác cần &

Chương trình ví dụ cơ bản

#include <stdio.h>
#include <string.h>

struct Sach {
    int soTrang;
    char tacGia[30];
    float gia;
};

int main() {
    struct Sach s;
    
    printf("Nhap thong tin sach:\n");
    printf("So trang: ");
    scanf("%d", &s.soTrang);
    
    printf("Tac gia: ");
    scanf("%s", s.tacGia);  // Không đọc được tên có dấu cách
    
    printf("Gia: ");
    scanf("%f", &s.gia);
    
    printf("\nThong tin sach:\n");
    printf("So trang: %d\n", s.soTrang);
    printf("Tac gia: %s\n", s.tacGia);
    printf("Gia: %.2f\n", s.gia);
    
    return 0;
}

Ví dụ nâng cao: Danh sách liên kết đơn (Linked List)

#include <stdio.h>

struct Node {
    int data;
    struct Node *next;  // Con trỏ tới node tiếp theo
};

int main() {
    // Tạo 4 node
    struct Node n1, n2, n3, n4;
    
    n1.data = 10; n1.next = &n2;
    n2.data = 20; n2.next = &n3;
    n3.data = 30; n3.next = &n4;
    n4.data = 40; n4.next = NULL;
    
    // Duyệt danh sách
    struct Node *p = &n1;
    printf("Danh sach: ");
    while (p != NULL) {
        printf("%d -> ", p->data);
        p = p->next;
    }
    printf("NULL\n");
    
    return 0;
}

Kết quả

Danh sach: 10 -> 20 -> 30 -> 40 -> NULL

Ví dụ phức tạp: Struct lồng nhau và con trỏ

#include <stdio.h>

struct NhanVien {
    char ten[50];
    int tuoi;
    float luong;
    struct NhanVien *capDuoi;  // Con trỏ đến cấp dưới
};

int main() {
    struct NhanVien giamDoc = {"Nguyen Van A", 45, 5000.0, NULL};
    struct NhanVien truongPhong = {"Tran Thi B", 35, 3000.0, NULL};
    struct NhanVien nhanVien = {"Le Van C", 25, 1500.0, NULL};
    
    // Xây dựng cây cấp bậc
    giamDoc.capDuoi = &truongPhong;
    truongPhong.capDuoi = &nhanVien;
    
    // In thông tin
    struct NhanVien *p = &giamDoc;
    while (p != NULL) {
        printf("%s - Tuoi: %d - Luong: %.2f\n", p->ten, p->tuoi, p->luong);
        p = p->capDuoi;
    }
    
    return 0;
}

Tóm tắt quan trọng

Khái niệm Cú pháp Ví dụ
Khai báostruct Ten { ... };struct SinhVien { char ten[30]; int tuoi; };
Định nghĩa biếnstruct Ten bien;struct SinhVien sv;
Truy cập thành viênbien.thanhViensv.tuoi = 20;
Con trỏ structptr->thanhVienp->tuoi = 20;
Typedeftypedef struct { ... } Ten;typedef struct { ... } SinhVien;

Struct là nền tảng của lập trình hướng đối tượng trong C, cho phép xây dựng: danh sách liên kết, cây, hàng đợi, stack, đồ thị...