Cấu trúc dữ liệu di động chuong 3d

30 160 0
Cấu trúc dữ liệu di động chuong 3d

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA TPHCM TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT CHƯƠNG III CẤU TRÚC DỮ LIỆU ĐỘNG Nguyễn Trọng Chỉnh chinhnt@uit.edu.vn CẤU TRÚC DỮ 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ấu trú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

Ngày đăng: 08/09/2017, 15:38

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan