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
2
Vấn đề kiểu dữ liệu tĩnh
6
10
10
1
5
2
5
7
3
6
9
7
3
4
15
15
9
3
5
2
1
2
6
7
? Làm sao để chèn thêm số 6 vào vị trí 5 của mảng
3
8
1
Vấn đề kiểu dữ liệu tĩnh
6
?
10
10
1
6
Giả sử cần thêm tiếp 1 phần tử
5
2
5
7
3
9
7
3
4
3
5
15
15
9
2
1
2
6
7
Bổ sung thêm
4
8
1
9
Bài tập
Hãy cài đặt hàm (bằng ngôn ngữ 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
5
2
5
7
9
7
3
3
4
3
5
15
15
9
2
1
2
6
7
? Làm sao để xóa phần tử 9
6
8
1
Vấn đề kiểu dữ liệu tĩnh
10
10
1
5
2
5
7
3
9
7
3
4
3
5
15
15
9
2
1
2
6
7
7
8
1
Bài tập
Hãy cài đặt hàm (bằng ngơn ngữ 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ớ: (kdl*)malloc(kích thước)
Giải phóng bộ nhớ: free vùng nhớ
Ví dụ:
int *a;
a=(int *)malloc(10); // Cấp phát
//Các thao tác trên a
free a;
// Giải phóng
13
Danh sách liên kết (DSLK)
1
Các phần tử kết dính với nhau
bằng “sợi dây liên kết”
7
2
6
3
10
8
5
9
4
14
1
7
2
6
3
10
Để đơn giản hơn trong
8
việc minh họa
5
9
4
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