Tải bản đầy đủ (.ppt) (56 trang)

Chương 3: Cấu trúc dữ liệu động potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.08 MB, 56 trang )

Chương 3 Cấu trúc dữ liệu động
*
Nắm vững khái niệm về kiễu dữ liệu tĩnh và
động
*
Nắm vững cách tổ chức dữ liệu động bằng danh
sách liên kết và minh họa được các thao tác xử
lý trên danh sách liên kết đơn
*
Cài đặt minh họa được các thao tác của danh
sách đơn bằng ngôn ngữ C/ C++
*
Cho một mảng có N=8 phần tử
1 2 3 4 5 6 7 8
*
Làm sao để chèn thêm số 6 vào mảng tại vị trí 5
1 2 3 4 5 6 7 8 9
Bổ sung thêm
Giả sử cần thêm tiếp 1 phần tử
?
*
Làm sao để chèn thêm số 6 vào mảng tại vị trí 5
*
Hãy cài đặt hàm (bằng ngôn ngữ C/C++) chèn
một phần tử có giá trị x vào một mảng số
nguyên a, kích thước n (có thứ tự tăng dần) sao
cho mảng a vẫn có thứ tự tăng dần, theo mẫu
hàm như sau:
void ChenX(int a[], int n, int x, int vt);
*
Làm sao để xóa phần tử 9 ?


1 2 3 4 5 6 7 8
*
Làm sao để xóa phần tử 9 ?
1 2 3 4 5 6 7 8
*
Hãy cài đặt hàm (bằng ngôn ngữ C/C++) xóa
phần tử có giá trị x (nếu có) trong mảng số
nguyên a, kích thước n (giả sử giá trị các phần
tử trong mảng không trùng nhau), theo mẫu
hàm như sau:
void XoaX(int a[], int &n, int x);
Độ phức tạp của chèn/ xóa
trên mảng 1 chiều là O(n)
*
Giải quyết vấn đề phức tạp khi chèn/ xóa?
*
Giải quyết vấn đề giới hạn kích thước vùng
nhớ tối đa?
*
Giải quyết vấn đề vùng nhớ không liên tục?
*
Giải quyết vấn đề giải phóng vùng nhớ khi
không cần dùng đến?
DÙNG CẤU TRÚC DỮ LIỆU ĐỘNG
*
Biến tĩnh
<kiểu dữ liệu> tên biến;
Vd: int a; float y; char s[20];

Tồn tại trong phạm vi khai báo


Được cấp phát vùng nhớ trong vùng dữ liệu

Kích thước cố định
*
Biến động
<kiểu dữ liệu> *tên biến;
Vd: int *a; float *y;

Chứa địa chỉ của một đối tượng dữ liệu

Được cấp phát hoặc giải phóng bộ nhớ tùy
thuộc vào người lập trình

Kích thước có thể thay đổi
*
Biến động

Cấp phát bộ nhớ: new int [kích thước]

Giải phóng bộ nhớ: delete vùng nhớ
Ví dụ:
int *a;
a=new int [10]; // Cấp phát
//Các thao tác trên a
………………
delete a; // Giải phóng
*
Giới thiệu cấu trúc “Danh sách liên kết”
1

7
2
6
3
10
8
5
9
4
Các phần tử kết
dính với nhau bằng
“sợi dây liên kết”
1
7
2
6
3
10
8
5
9
4
Để đơn giản
hơn trong việc
minh họa
*
Một dãy tuần tự các nút (Node)
*
Giữa hai nút có con trỏ liên kết
*

Các nút không cần phải lưu trữ liên tiếp nhau
trong bộ nhớ
*
Có thể mở rộng tuỳ ý (chỉ giới hạn bởi dung
lượng bộ nhớ)
*
Thao tác Chèn/Xóa không cần phải dịch chuyển
phần tử mà chỉ cần thay đổi mối liên kết
*
Quản lý phần tử đầu tiên bằng con trỏ pHead
*
Có thể truy xuất đến các phần tử khác thông qua
con trỏ liên kết
Node
pHead pTail
List
*
Quản lý toàn bộ danh sách liên kết thông qua
con trỏ đầu pHead
*
pHead không phải là 1 nút, nó chỉ là “con trỏ
chỉ đến nút” mà thôi
*
Ta cũng có thể quản lý danh sách bằng cách sử
dụng thêm con trỏ cuối (pTail)
*
pTail không phải là 1 nút, nó chỉ là “con trỏ
chỉ đến nút” mà thôi
*
Tạo lập bằng cách cấp phát bộ nhớ động

*
Mỗi nút có 2 thông tin:
*
Dữ liệu (data)
*
Con trỏ liên kết đến phần tử kế tiếp trong
danh sách (Next pointer link)
*
Nếu không trỏ đến phần tử nào thì con trỏ Next
= NULL
*
“Kết nối” lại sợi dây liên kết theo trình tự
pHead pTail
List
pHead pTail
List
*
Danh sách liên kết đơn: Các phần tử kết nối
với nhau theo hướng “chiều đi tới”
*
Danh sách liên kết đôi: Các phần tử kết nối với
nhau theo hướng “chiều đi tới và và đi lui”
*
Danh sách liên kết vòng: Các phần tử kết nối
với nhau theo hướng “chiều đi tới” và phần tử
cuối cùng có “đường đi vòng trở lại tới” phần
tử đầu danh sách
Mảng Danh sách liên kết
Kích thước cố định Số phần tử thay đổi tùy ý
Các phần tử lưu trữ tuần tự

(địa chỉ tăng dần) trong bộ
nhớ
Các phần tử liên kết với
nhau bằng con trỏ
Phải dịch chuyển các phần
tử khi Thêm/Xóa
Chỉ cần thay đổi con trỏ liên
kết khi Thêm/Xóa
Truy xuất ngẫu nhiên Truy xuất tuần tự

×