Có thể nói, mảng là cấu trúc dữ liệu căn bản và được sử dụng rộng rãi nhất trong tất cả các ngôn ngữ lập trình. Một mảng là 1 tập hợp cốđịnh các thành phần có cùng 1 kiểu dữ liệu, được lưu trữ kế tiếp nhau và có thểđược truy cập thông qua một chỉ số. Ví dụ, để truy cập tới phần tử
thứ i của mảng a, ta viết a[i]. Chỉ số này phải là số nguyên không âm và nhỏ hơn kích thước của mảng (số phần tử của mảng). Trong chương trình, chỉ số này không nhất thiết phải là các hằng số
hoặc biến số, mà có thể là các biểu thức hoặc các hàm.
a1 a2 ... ai ai+1 ... an
Lưu ý rằng cấu trúc của bộ nhớ máy tính cũng được tổ chức thành các ô nhớ, và cũng có thể
truy cập ngẫu nhiên thông qua các địa chỉ. Do vậy, việc lưu trữ dữ liệu trong mảng có sự tương thích hoàn toàn với bộ nhớ máy tính, trong đó có thể coi toàn bộ bộ nhớ máy tính như 1 mảng, và
địa chỉ các ô nhớ tương ứng như chỉ số của mảng. Chính vì sự tương thích này mà việc sử dụng cấu trúc dữ liệu mảng trong các ngôn ngữ lập trình có thể làm cho chương trình hiệu quả hơn và chạy nhanh hơn.
Mảng có thể có nhiều hơn 1 chiều. Khi đó, số các chỉ số của mảng sẽ tương ứng với số
chiều. Chẳng hạn, trong mảng 2 chiều a, thành phần thuộc cột i, hàng j được viết là a[i][j]. Mảng 2 chiều còn được gọi là ma trận (matrix).
a11 a21 ... ai1 ai+11 ... am1 a12 a22 ... ai2 ai+12 ... am2 ... ... ... ... ... ... ... a1j a2j ... aij ai+1j ... amj a1j+1 a2j+1 ... aij+1 ai+1j+1 ... amj+1 ... ... ... ... ... ... ... a1n a2n ... ain ai+1n ... amn
Như đã nói ở trên, mảng là cấu trúc dữ liệu dễ sử dụng, tốc độ truy cập cao. Tuy nhiên, nhược điểm chính của mảng là không linh hoạt về kích thước. Nghĩa là khi ta đã khai báo 1 mảng thì kích thước của nó là cốđịnh, không thể thay đổi trong quá trình thực hiện chương trình. Điều này rất bất tiện khi ta chưa biết trước số phần tử cần xử lý. Nếu khai báo mảng lớn sẽ tốn bộ nhớ
và ảnh hưởng đến hiệu suất của chương trình. Nếu khai báo mảng nhỏ sẽ dẫn đến thiếu bộ nhớ. Ngoài ra, việc bố trí lại các phần tử trong mảng cũng khá phức tạp, bởi vì mỗi phần tửđã có vị trí cốđịnh trong mảng, và để bố trí 1 phần tử sang 1 vị trí khác, ta phải tiến hành “dồn” các phần tử
có liên quan.
Trong phần tiếp theo, chúng ta sẽ xem xét một cấu trúc dữ liệu khác, cũng cho phép lưu trữ
1 tập các phần tử, nhưng có kích thước và cách bố trí linh hoạt hơn. Đó là cấu trúc dữ liệu danh sách liên kết.
3.2DANH SÁCH LIÊN KẾT 3.2.1 Khái niệm