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áo | struct Ten { ... }; | struct SinhVien { char ten[30]; int tuoi; }; |
| Định nghĩa biến | struct Ten bien; | struct SinhVien sv; |
| Truy cập thành viên | bien.thanhVien | sv.tuoi = 20; |
| Con trỏ struct | ptr->thanhVien | p->tuoi = 20; |
| Typedef | typedef 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ị...