Danh sách liên kết là 1 cấu trúc dữ liệu được sử dụng để lưu trữ 1 tập hợp các dữ liệu
1. TP. HỒ CHÍ MINH, NĂM 2021
Giảng viên: ThS. Phan Tiến Dũng
Email: tdphan1901@gmail.com
Phone: 0906.609.942
2. Nội dung chính
1. Khái niệm
2. Cấu trúc danh sách
3. Phương pháp cài đặt danh sách
4. Hiện thực danh sách kề
5. Hiện thực danh sách liên kết đơn
6. Các loại danh sách liên kết khác
3. 1. KHÁI NIỆM
- Danh sách (List) là một trong những cấu trúc cơ bản
nhất được cài đặt trong hầu hết các chương trình ứng
dụng. Danh sách là một kiểu dữ liệu trừu tượng gồm
nhiều Node (nút) cùng kiểu dữ liệu, các nút trong danh
sách có thứ tự.
- Có 2 cách cài đặt danh sách:
Cài đặt theo kiểu kế tiếp => Danh sách kề
Cài đặt theo kiểu liên kết => Danh sách liên kết
Ví dụ: Xe lửa được liên kết theo một thứ tự cụ thể để có
thể được tải, dỡ, chuyển, thả và nhặt theo cách hiệu
quả nhất có thể.
4. 2. CẤU TRÚC DANH SÁCH
- Tác vụ Init: Khởi tạo danh sách
- Tác vụ IsEmpty: Kiểm tra danh sách rỗng
- Tác vụ IsFull: Kiểm tra danh sách có bị đầy không
- Tác vụ ListSize: Kiểm tra số nút có trong danh sách
- Tác vụ Retrieve: Truy xuất nút tại vị trí pos
- Tác vụ Insert: Thêm nút vào vị trí pos
Mô tả các tác vụ
5. 2. CẤU TRÚC DANH SÁCH
- Tác vụ Remove: Xóa nút tại vị trí pos
- Tác vụ Replace: Thay thế nút tại vị trí pos
- Tác vụ ShowList: Duyệt danh sách
- Tác vụ Sort: Sắp xếp danh sách theo một khóa sắp xếp
- Tác vụ Search: Tìm kiếm nút trong danh sách theo một
khóa
- Tác vụ ClearList: Xóa danh sách
Mô tả các tác vụ
6. 3. Phương pháp cài đặt danh sách
Cài đặt theo kiểu kế
tiếp
- Các nút trong danh sách được bố trí kế cận nhau trong bộ
nhớ mảng, chuỗi ký tự, Stack, Queue.
- Ví dụ: Danh sách kề dùng mảng 1 chiều
7
6 Nút 6
5 Nút 5
4 Nút 4
3 Nút 3
2 Nút 2
1 Nút 1
0 Nút 0
7. 3. Phương pháp cài đặt danh sách
Cài đặt theo kiểu kế
tiếp
• Mảng 1 chiều
– Kích thước cố định (fixed size)
– Các phần tử tuần tự theo chỉ số 0 n-1
– Truy cập ngẫu nhiên (random access)
– Chèn 1 phần tử vào mảng rất khó
0 1 2 3 4 n-2 n-1
chèn
…
8. 3. Phương pháp cài đặt danh sách
Cài đặt theo kiểu liên
kết
Danh sách liên kết đơn
typedef struct node
{
DataType Info;
struct Node *pNext;
} Node;
typedef struct List
{
Node *pHead;
Node *pTail;
} LIST;
A B C D E
pHead
pTail
9. 3. Phương pháp cài đặt danh sách
Danh sách liên kết đơn
A B C D E
pHead
pTail
• Cấp phát động lúc chạy chương trình
• Các phần tử nằm rải rác ở nhiều nơi trong bộ nhớ
• Kích thước danh sách chỉ bị giới hạn do RAM
• Thao tác thêm xoá đơn giản
Insert,
Delete
10. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Cấu trúc:
- Mảng được xây dựng dựa trên chỉ mục, ở đó mỗi phần tử
trong mảng được gắn với một chỉ mục (index) cố định.
Trước khi truy xuất 1 phần tử cần biết được index của nó.
- Các phần tử của danh sách liên kết được liên kết theo thứ
tự, chúng liên kết với phần tử đứng trước và đứng sau nó,
khi muốn truy xuất một phần tử trong danh sách liên kết ta
cần truy xuất các phần tử liền kề nó trước.
11. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Kích thước:
- Mảng yêu cầu một kích thước cố định trong quá trình khai
báo, khi số lượng phần tử vượt quá kích thước đó mảng
cần được resize.
- Danh sách liên kết thì linh hoạt trong việc thay đổi kích
thước và việc này diễn ra ngay trong quá trình chương
trình thực thi.
12. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Bộ nhớ:
- Danh sách liên kết yêu cầu lượng bộ nhớ nhiều hơn so với
mảng do thêm một lượng bộ nhớ cho việc tạo liên kết/tham
chiếu đến phần tử liền kề.
- Mảng yêu cầu bộ nhớ trong quá trình biên dịch còn danh
sách liên kết yêu cầu bộ nhớ trong quá trình chạy chương
trình.
- Các phần tử của mảng được lưu trữ tại các vị trí kề nhau
trong vùng nhớ Stack. Trong khi đó các phần tử trong DSLK
lưu trữ tại các vị trí ngẫu nhiên trong vùng nhớ Heap.
13. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Thời gian truy xuất phần tử:
- Đối với mảng, truy xuất trực tiếp phần tử, ví dụ khi truy xuất
phần tử thứ 4 của một mảng trong ngôn ngữ C array[3].
- Với danh sách liên kết phải truy xuất tuần tự và phải bắt đầu
truy xuất từ nút đầu tiên.
14. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Thao tác thêm/xóa phần tử:
- Việc thêm hay xóa phần tử trong mảng phức tạp hơn so với
danh sách liên kết, khi thêm một phần tử vào mảng cần dịch
chuyển các phần tử sau nó để tạo vị trí trống. Ví dụ thêm số
4 vào vị trí thứ 5 trong mảng {0,1,2,3,5,6,7, null}, cần dịch
5,6,7 ra sau 1 chỉ số để tạo khoảng trống cho số 4
{0,1,2,3,4,5,6,7, null}.
- Với danh sách liên kết muốn thêm hay xóa một phần tử chỉ
cần thay đổi liên kết của phần tử đứng trước và đứng sau vị
trí muốn thêm hay xóa.
15. 3. Phương pháp cài đặt danh sách
So sánh MẢNG và DANH SÁCH LIÊN KẾT
Ưu điểm của danh sách liên kết so với mảng: kích thước linh
hoạt, dễ thêm và xóa phần tử, không yêu cầu cấp phát trước
bộ nhớ.
Ưu điểm của mảng so với danh sách liên kết: truy xuất ngẫu
nhiên, bộ nhớ yêu cầu thấp, dễ thực thi và sử dụng.
16. 4. Hiện thực danh sách kề
Khai báo cấu trúc danh sách
17. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
18. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
19. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
20. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
21. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
25. 4. Hiện thực danh sách kề
Các tác vụ trên danh sách kề
Sinh viên nghiên cứu các tác vụ:
Thay thế (Replace)
Duyệt danh sách (ShowList)
Tìm kiếm (Search)
Sắp xếp (Sort)
26. 5. Hiện thực Danh sách liên kết
đơn
Giới thiệu
• DSLK đơn là một danh sách các node, mỗi node
gồm 2 thành phần:
– Phần chứa dữ liệu - Info
– Phần chỉ vị trí (địa chỉ) của phần tử tiếp theo trong
danh sách – Next
Info Next
Node
A B C D E
pHead
NULL
pTail
27. 5. Hiện thực Danh sách liên kết
đơn
Khai báo cấu trúc
Info Next
Node
28. 5. Hiện thực Danh sách liên kết
đơn
Khai báo cấu trúc
Info Next
Node
29. 5. Hiện thực Danh sách liên kết
đơn
Các tác vụ trên danh sách liên
kết
?
?
pHead
pTail
NULL?
pHead
pTail
NULL
NULL
30. 5. Hiện thực Danh sách liên kết
đơn
Các tác vụ trên danh sách liên
kết
?
?
X
31. VC
&
BB
Danh sách liên kết đơn
Chèn một nút vào đầu danh sách
Danh sách rỗng
Danh sách không rỗng
X
A B C D E
pHead
pTail
X
pHead
pTail
32. 5. Hiện thực Danh sách liên kết
đơn
Chèn một nút vào đầu danh sách
33. VC
&
BB
Danh sách liên kết đơn
Thêm một nút vào cuối danh sách
Danh sách rỗng
Danh sách không rỗng
X
A B C D E
pHead
pTail
X
pHead
pTail
34. 5. Hiện thực Danh sách liên kết
đơn
Các tác vụ trên danh sách liên
kết
35. VC
&
BB
Danh sách liên kết đơn
Thêm một nút p vào sau nút q
q == NULL chèn vào đầu danh sách
q != NULL
X
A B C D E
pHead
q
pTail
p
36. 5. Hiện thực Danh sách liên kết
đơn
=>Thao tác thêm node p trước node
q???
37. VC
&
BB
Danh sách liên kết đơn
Xóa một nút đầu danh sách
Danh sách rỗng không làm gì cả
Danh sách không rỗng (nếu sau khi xóa mà
pHead = NULL thì pTail = NULL)
A B C D E
pHead
pTail
p = pHead
41. 5. Hiện thực Danh sách liên kết
đơn
Xóa Node sau nhiều Node p
42. VC
&
BB
Danh sách liên kết đơn
Hủy một nút cuối danh sách
Nút cuối p (p = pTail)
Tìm nút q trước nút p (nếu có)
Hủy nút sau nút q
Hủy một nút có khóa k (Info = k)
Tìm nút p có khóa k và hủy nút q trước đó.
Hủy nút sau nút q (nếu có)
Hủy toàn bộ danh sách
Duyệt danh sách để in/tìm/đếm các nút
43. VC
&
BB
Danh sách liên kết đơn vòng (Circular Linked List)
typedef struct CNode
{
Data Info;
struct CNode *pNext;
} CNODE;
typedef struct CList
{
NODE *pHead;
NODE *pTail;
} CLIST;
Các loại danh sách liên kết
pHead pTail
A B C D E
44. VC
&
BB
Danh sách liên kết kép (Doubly Linked List)
typedef struct DNode
{
Data Info;
struct DNode *pNext, *pPrev;
} DNODE;
typedef struct DList
{
NODE *pHead;
NODE *pTail;
} DLIST;
Các loại danh sách liên kết khác
B
pHead pTail
A C D
45. BÀI TẬP THỰC HÀNH
Câu hỏi ôn tập trong giáo trình trang
31-32