Tải bản đầy đủ (.pptx) (70 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 - Trần Minh Thái (Trường Đại học Hồng Bàng )

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 (261.48 KB, 70 trang )

Chương 4. Danh sách
liên kết
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn
Cập nhật: ngày 10 tháng 04 năm 2016


Mục tiêu
 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++

2


Vấn đề kiểu dữ liệu tĩnh
66
10
10
1

55

77

2



3

33
4

99
5

15
15
22
6

7

11
8

? Làm sao để chèn thêm số 6 vào vị trí 5 của mảng
3


Vấn đề kiểu dữ liệu tĩnh
66

?

10
10

1

Giả sử cần thêm tiếp 1 phần tử

55

77

2

3

33
4

99
5

15
15

22
6

7

Bổ sung thêm

11
8


9

4


Bài tập
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 vị trí vt trong
mảng số nguyên a, kích thước n, theo mẫu hàm
như sau:
void ChenX(int a[], int &n, int x, int vt);

5


Vấn đề kiểu dữ liệu tĩnh

10
10
1

55

77

2

3


33
4

99
5

15
15
22
6

7

11
8

? Làm sao để xóa phần tử 9
6


Vấn đề kiểu dữ liệu tĩnh

10
10
1

55

77


2

3

33
4

99
5

15
15
22
6

7

11
8
7


Bài tập
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);
8



Vấn đề kiểu dữ liệu tĩnh

i

Độ phức tạp của chèn/ xóa
trên mảng 1 chiều là O(n)

9


Vấn đề kiểu dữ liệu tĩnh
 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
10


Biến tĩnh và biến động trong C++
 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
11


Biến tĩnh và biến động trong C++
 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
12


Biến tĩnh và biến động trong C++
 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
13


Danh sách liên kết (DSLK)

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”

14


1
7
2
6
3
10
8
5
9
4

Để đơn giản

hơn trong việc
minh họa
15


Đặc điểm DSLK
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ớ)

16


Đặc điểm DSLK
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

17


Cấu tạo của DSLK

Node


List

pHead

pTail
18


Cấu tạo của DSLK
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
19


Cấu tạo của nút
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
20



Thao tác chèn thêm node vào DSLK
“Kết nối” lại sợi dây liên kết theo trình tự

List

pHead

pTail

21


Thao tác xóa node khỏi DSLK
Cần xóa

List

pHead

pTail
22


Các loại hình DSLK
DSLK đơn: Các phần tử kết nối với nhau theo
hướng “chiều đi tới”

23



Các loại hình DSLK
DSLK đơ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”

24


Các loại hình DSLK
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

25


×