Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 4: Kiểu dữ liệu trừu tượng danh sách cung cấp cho người học các kiến thức: Kiểu dữ liệu trừu tượng danh sách - đặc tả, cài đặt bằng mảng tĩnh. Mời các bạn cùng tham khảo nội dung chi tiết.
Bài 4: KDLTT danh sách cài đặt mảng tĩnh Giảng viên: Hồng Thị Điệp Khoa Cơng nghệ Thơng tin – Đại học Công Nghệ Cấu trúc liệu giải thuật HKI, 2013-2014 Nội dung KDLTT danh sách: đặc tả Cài đặt mảng tĩnh diepht@vnu Danh sách Danh sách cấu trúc liệu tuyến tính, phần tử liệu xếp theo thứ tự xác định Danh sách nhất: phần tử kiểu Ví dụ Danh sách sinh viên Danh sách điện thoại Danh sách môn học Danh sách hát Danh sách công việc diepht@vnu Trừu tượng hóa danh sách Đặc tả liệu Là dãy hữu hạn phần tử L = (a0, a1, … , an-1) Đặc tả phép tốn Kiểm tra danh sách có rỗng hay không Đếm số phần tử danh sách Trả phần tử vị trí thứ i danh sách Thêm phần tử x vào vị trí i danh sách Thêm phần tử x vào danh sách Loại phần tử vị trí thứ i danh sách Ta muốn thiết kế lớp danh sách để người lập trình dùng lớp biểu diễn danh sách phần tử có kiểu tùy ý Generic programming Template C++ diepht@vnu Trừu tượng hóa danh sách Đặc tả liệu L = (a0, a1, …, an-1) phần tử thứ i+1 danh sách L Ví dụ: L = (1, 2, 3, 3, 4, 5) L = (‘Vinh’, ‘Tuấn’, ‘Ánh’) Đặc tả phép tốn Kiểm tra danh sách có rỗng hay không: empty(L) Đếm số phần tử danh sách: length(L) Trả phần tử vị trí thứ i danh sách: element(L, i) Thêm phần tử x vào vị trí i danh sách: insert(L, i, x) Thêm phần tử x vào đuôi danh sách: append(L, x) Loại phần tử vị trí thứ i danh sách: erase(L, i) diepht@vnu Ví dụ L = (1, 2, 3, 3, 4, 5) empty(L) → false length(L) → element(L, 0) → element(L, 2) → insert(L, 2, 10) → L = (1, 2, 10, 3, 3, 4, 5) append(L, -5) → L = (1, 2, 10, 3, 3, 4, 5, -5) erase(L, 3) → L = (1, 2, 10, 3, 4, 5, -5) erase(L, 1) → L = (1, 10, 3, 4, 5, -5) diepht@vnu Cài đặt danh sách mảng Mảng (array) Tập hợp phần tử (các biến) có kiểu Một phần tử cụ thể mảng xác định truy cập số Trong C/C++, phần tử mảng đặt cạnh tạo thành khối liên tục Địa thấp tương ứng với phần tử đầu tiên, địa cao tương ứng với phần tử cuối Mảng chiều nhiều chiều diepht@vnu Cài đặt danh sách mảng Mảng chiều tĩnh int dayso[100]; Phanso dayphanso[15]; Mảng chiều động Cấp phát nhớ phép new int *daysod = new int[100]; Phanso *dayphansod = new Phanso[15]; Khi khơng dùng nữa, phải giải phóng nhớ phép delete delete [] daysod; delete [] dayphansod; L = (a0, a1, …, an-1) a0 a1 … an-1 ? n-1 n … ? MAX-1 diepht@vnu insert(L, i, x) a0 … ai-1 … an-1 ? ? … i-1 i … n-1 n n+1 a0 … ai-1 x … an-1 ? … i-1 i i+1 … n n+1 … ? MAX-1 … ? MAX-1 Dồn tất phần tử từ vị trí i tới vị trí n-1 sau vị trí Sau đặt giá trị x vào vị trí i Tăng số phần tử danh sách lên diepht@vnu erase(L, i) a0 … ai-1 ai+1 … an-1 ? … i-1 i i+1 … n-1 n a0 … ai-1 ai+1 … an-1 ? ? … i-1 i … n-2 n-1 n … ? MAX-1 … ? MAX-1 Dồn tất phần tử từ vị trí i+1 tới vị trí n-1 lên trước vị trí Giảm số phần tử danh sách 10 diepht@vnu Chuẩn bị tuần tới Thực hành: Cài đặt KDLTT danh sách mảng tĩnh Lý thuyết: Đọc chương (4.3 đến hết) chương giáo trình 11 diepht@vnu ... diepht@vnu erase(L, i) a0 … ai-1 ai+1 … an-1 ? … i-1 i i+1 … n-1 n a0 … ai-1 ai+1 … an-1 ? ? … i-1 i … n-2 n-1 n … ? MAX-1 … ? MAX-1 Dồn tất phần tử từ vị trí i+1 tới vị trí n-1 lên trước vị trí ... phải giải phóng nhớ phép delete delete [] daysod; delete [] dayphansod; L = (a0, a1, …, an-1) a0 a1 … an-1 ? n-1 n … ? MAX-1 diepht@vnu insert(L, i, x) a0 … ai-1 … an-1 ? ? … i-1 i … n-1 n... 10) → L = (1, 2, 10, 3, 3, 4, 5) append(L, -5 ) → L = (1, 2, 10, 3, 3, 4, 5, -5 ) erase(L, 3) → L = (1, 2, 10, 3, 4, 5, -5 ) erase(L, 1) → L = (1, 10, 3, 4, 5, -5 ) diepht@vnu Cài đặt danh