Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
375,58 KB
Nội dung
ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CẤUTRÚCDỮLIỆU VÀ GIẢI THUẬT CHƯƠNG III CẤUTRÚCDỮLIỆUĐỘNG Nguyễn Trọng Chỉnh chinhnt@uit.edu.vn CẤUTRÚCDỮLIỆUĐỘNG ❖ĐẶT VẤN ĐỀ ❖KIỂU DỮLIỆU CON TRỎ ❖DANH SÁCH LIÊN KẾT ❖DANH SÁCH ĐƠN ❖MỘT SỐ DẠNG DANH SÁCH LIÊN KẾT KHÁC ĐẶT VẤN ĐỀ ❖QUẢN LÝ VÙNG NHỚ Vùng nhớ chương trình quản lý theo hai cách: • Quản lý tự động: Được thực khai báo biến, C/C++ Các đối tượng gọi biến cấp phát tĩnh (biến tĩnh, biến nửa tĩnh) • Quản lý người lập trình: Được thực cấp phát vùng nhớ Các vùng nhớ cấp phát gọi biến cấp phát động (biến động) ĐẶT VẤN ĐỀ ❖BIẾN CẤP PHÁT TĨNH Là biến tạo khai báo Ví dụ: struct PS{ int ts, ms; }; int x, y; char s[50]; PS p; ĐẶT VẤN ĐỀ ❖BIẾN CẤP PHÁT TĨNH - - Biến cấp phát tĩnh (biến tĩnh, biến tĩnh) có đặc điểm sau: Được khai báo tường minh, có tên gọi Tồn phạm vi khai báo Được cấp phát stack segment data segment Kích thước không đổi Ví dụ: kích thước mảng ĐẶT VẤN ĐỀ ❖BIẾN CẤP PHÁT ĐỘNG Là biến tạo cấp phát vùng nhớ Ví dụ: struct PS{ int ts, ms; }; - Tạo vùng nhớ cho biến kiểu nguyên: malloc(sizeof(int)); new int; - Tạo vùng nhớ cho biến kiểu PS: malloc(sizeof(PS)); new PS; ĐẶT VẤN ĐỀ ❖BIẾN CẤP PHÁT ĐỘNG - Biến cấp phát động (biến động) có đặc điểm sau: Không khai báo tường minh, tên gọi Cấp phát cần sử dụng, hết sử dụng phải giải phóng Được cấp phát heap segment Kích thước vùng nhớ cấp phát tùy theo yêu cầu giới hạn nhớ ĐẶT VẤN ĐỀ ❖NHƯỢC ĐIỂM CỦA CẤP PHÁT TĨNH - Lãng phí nhớ Ví dụ: danh sách nhân viên công ty thay đổi Giải pháp: xác định kích thước tối đa n danh sách, khai báo mảng với kích thước n lãng phí nhớ ĐẶT VẤN ĐỀ ❖NHƯỢC ĐIỂM CỦA CẤP PHÁT TĨNH - Không thể định nghĩa kiểu có cấutrúc đệ quy không xác định kích thước Ví dụ: tổ chức liệu cho cây: struct Node { node int Key; node Node left, mid, right; node node }; node node KIỂU DỮLIỆU CON TRỎ ❖KHÁI NIỆM Cho trước kiểu T= Kiểu trỏ Tp= trỏ đến biến kiểu T Khi đó, biến kiểu Tp có giá trị địa biến kiểu T - Vp miền giá trị kiểu trỏ Tp gồm giá trị NULL(bằng 0) địa biến kiểu T - Op phép toán kiểu trỏ Tp gồm: tăng địa (+), giảm địa (-), phân giải địa (*), gán giá trị địa (=) 10 KIỂU DỮLIỆU CON TRỎ ❖CÁC THAO TÁC TRÊN KIỂU CON TRỎ - Tạo biến cấp phát động để trỏ quản lý + Trong C, dùng hàm hàm void* malloc(size) void* calloc(n,size) + Trong C++, dùng phép toán new new kiểu // cấp phát vùng nhớ cho biến new kiểu[n] //cấp phát vùng nhớ cho n biến Kết cấp phát địa ô nhớ vùng nhớ cấp phát giá trị NULL không cấp phát 16 KIỂU DỮLIỆU CON TRỎ ❖CÁC THAO TÁC TRÊN KIỂU CON TRỎ - Giải phóng biến cấp phát động trỏ quản lý + Trong C, dùng hàm void free(p) + Trong C++, dùng phép toán delete delete p // p = new kiểu delete [] p // p = new kiểu[n] 17 KIỂU DỮLIỆU CON TRỎ ❖CÁC THAO TÁC TRÊN KIỂU CON TRỎ - Tăng giảm địa vùng nhớ trỏ quản lý n lần kích thước kiểu: dùng phép toán tương ứng + - Ví dụ: int *p; p = (int *)1; p = p + 4; // giá trị p 1+4*4=17 int = bytes p ; // giá trị p 17-1*4=13 Lưu ý: *(p + i) tương đương với p[i] 18 KIỂU DỮLIỆU CON TRỎ ❖CÁC THAO TÁC TRÊN KIỂU CON TRỎ - Phân giải địa trỏ (dereference) phép toán * Phân giải địa trỏ truy cập đến biến cấp phát động Ví dụ: int *p; p = new int; // tạo biến cấp phát động cho p *p = 100; // gán 100 cho biến cấp phát động *p *= 2; // nhân với giá trị biến cấp phát động cout i; j ) if (A[j] < A[j-1]) {x = A[j]; A[j] = A[j - 1]; A[j-1] = x;} } 21 KIỂU DỮLIỆU CON TRỎ int main(char **arg, int c) { int n, i; DaySo A; cin >> n; A = new int[n]; if (A == NULL) return EXIT_FAILURE; for (i = 0; i < n; i++) cin >> A[i]; cout