Bài giảng Cấu trúc dữ liệu - Chương 4: Danh sách liên kết cung cấp cho người học các kiến thức: Khái niệm danh sách liên kết, các phép tính trên danh sách liên kết đơn, các phép tính trên danh sách liên kết kép, ứng dụng của danh sách liên kết. Mời các bạn cùng tham khảo.
Trang 1C HƯƠNG 4
K IỂU D ANH S ÁCH L IÊN K ẾT
GV Th.S Thiều Quang Trung Trường Cao đẳng Kinh tế Đối ngoại
Trang 2• Khái niệm danh sách liên kết
Trang 3Danh sách liên kết
• Định nghĩa: Danh sách liên kết (DSLK) là một danh
sách mà các phần tử được kết nối với nhau nhờ vào vùng liên kết của chúng
• Một phần tử của DSLK bao gồm 2 vùng chính:
– Vùng chứa thông tin
– Vùng chứa địa chỉ, còn gọi là vùng liên kết
• DSLK là cấu trúc dữ liệu động nên có thể thực hiện các phép thêm vào, loại bỏ phần tử trong khi chạy
chương trình
• Việc lưu trữ DSLK tốn bộ nhớ hơn danh sách đặc vì
Trang 4Danh sách liên kết
• Các kiểu tổ chức DSLK:
– Danh sách liên kết đơn: mỗi phần tử liên kết với
phần tử đứng sau nó trong danh sách:
– Danh sách liên kết kép: mỗi phần tử liên kết với
các phần tử đứng trước và sau nó trong danh sách:
– Danh sách liên kết vòng: phần tử cuối danh sách
liên kết với phần tử đầu danh sách:
4
GV Thiều Quang Trung
Trang 6Danh sách liên kết
• Các phép toán cơ bản trên danh sách liên kết:
1 Khởi tạo danh sách
2 Kiểm tra danh sách rỗng
3 Tìm kiếm 1 phần tử trong danh sách
4 Thêm 1 phần tử vào danh sách
5 Hủy 1 phần tử khỏi danh sách
Trang 7Danh sách liên kết đơn
• Định nghĩa: DSLK đơn là loại DSLK mà vùng địa chỉ
của mỗi phần tử chỉ chứa duy nhất một địa chỉ của phần tử tiếp theo
• Phần tử cuối cùng của DSLK đơn sẽ trỏ đến NULL
head
NULL
Trang 8Danh sách liên kết đơn
• Ví dụ: Ta có danh sách theo dạng bảng sau
→Ta có danh sách liên kết là :
Joe – Marta – Bill – Koch - Sahra
GV Thiều Quang Trung 8
Address Name Age Link
Trang 9Cài đặt danh sách liên kết đơn
• Khai báo kiểu của 1 phần tử và kiểu danh sách liên kết đơn.
• Để đơn giản ta xét mỗi node gồm vùng chứa dữ liệu là kiểu
Trang 10Ví dụ danh sách liên kết đơn
GV Thiều Quang Trung 10
Trang 11Các phép toán trên DSLK đơn
1 Khởi tạo danh sách: Khi khởi tạo, DSLK rỗng, ta
đặt pHead = NULL
Trang 122 Kiểm tra danh sách rỗng: Kiểm tra pHead có
bằng NULL hay không
GV Thiều Quang Trung 12
Các phép toán trên DSLK đơn
Trang 133 Tìm kiếm 1 phần tử trong danh sách:
NODE* Search(LIST &list , int x)
Trang 144 Thêm 1 phần tử vào DSLK:
• Tạo node:
GV Thiều Quang Trung 14
// Gán thông tin cho phần tử p
Các phép toán trên DSLK đơn
Trang 154.1 Thêm vào đầu DSLK:
Các phép toán trên DSLK đơn
Trang 164.2 Thêm vào ngay sau phần tử q:
GV Thiều Quang Trung 16
Các phép toán trên DSLK đơn
Trang 175 Hủy 1 phần tử khỏi DSLK:
5.1 Hủy 1 phần tử ở đầu danh sách:
Các phép toán trên DSLK đơn
Trang 185.2 Hủy 1 phần tử đứng sau q:
GV Thiều Quang Trung 18
Các phép toán trên DSLK đơn
Trang 195.3 Hủy 1 phần tử có giá trị x:
Các phép toán trên DSLK đơn
Trang 206 Duyệt DSLK:
GV Thiều Quang Trung 20
Các phép toán trên DSLK đơn
Trang 227 Hủy toàn bộ DSLK:
GV Thiều Quang Trung 22
Các phép toán trên DSLK đơn
Trang 23Nhận xét danh sách liên kết đơn
• Ưu và nhược điểm của DSLK đơn:
Trang 24Danh sách liên kết kép
• Định nghĩa: DSLK kép (double linked list) là DSLK
mà mỗi phần tử có 2 vùng liên kết: một vùng liên kết đến phần tử đứng trước nó và một vùng liên kết đến phần tử đứng sau nó
GV Thiều Quang Trung 24
Trang 25Cài đặt danh sách liên kết kép
Trang 26Danh sách liên kết kép
• Các phép toán trên DSLK kép:
1 Khởi tạo danh sách (tương tự DSLK đơn)
2 Thêm 1 phần tử vào danh sách
3 Tìm kiếm 1 phần tử trong danh sach (tương tự DSLK
đơn)
4 Hủy một phần tử khỏi danh sách
5 Duyệt danh sách (tương tự DSLK đơn)
6 Hủy toàn bộ danh sách (tương tự DSLK đơn)
GV Thiều Quang Trung 26
Trang 27Các phép toán trên DSLK kép
• Hàm bổ trợ tạo một Node mới
–
Trang 28• Thêm 1 phần tử vào đầu danh sách
GV Thiều Quang Trung 28
Các phép toán trên DSLK kép
Trang 29• Thêm 1 phần tử vào đầu danh sách
–
Các phép toán trên DSLK kép
Trang 30• Thêm 1 phần tử vào sau phần tử q:
–
GV Thiều Quang Trung 30
Các phép toán trên DSLK kép
Trang 31Các phép toán trên DSLK kép
Trang 32• Thêm 1 phần tử vào trước phần tử q:
–
GV Thiều Quang Trung 32
Các phép toán trên DSLK kép
Trang 33• Hủy 1 phần tử khỏi danh sách:
– Hủy phần tử ở đầu danh sách:
Các phép toán trên DSLK kép
Trang 34• Hủy phần tử đứng sau phần tử q:
GV Thiều Quang Trung 34
Các phép toán trên DSLK kép
Trang 35• Hủy phần tử đứng trước phần tử q:
Các phép toán trên DSLK kép
Trang 36• Hủy phần tử có giá trị x:
GV Thiều Quang Trung 36
Các phép toán trên DSLK kép
Trang 371 Máy tính bỏ túi:
- Mô tả: xây dựng chương trình minh họa 1 máy tính
bỏ túi dạng đơn giản
- Cách biểu diển: Phép toán được nhập vào dưới dạng hậu tố
+ VD: tính a*(b+c) + biểu thức hậu tố: abc+*
- Ứng dụng stack để tính kết quả biểu thức
Ứng dụng của danh sách
Trang 382 Bài toán đa thức:
- Cộng, trừ, nhân, chia 2 đa thức
GV Thiều Quang Trung 38
Ứng dụng của danh sách
Trang 393 Bài toán tính giá trị biểu thức:
- Biểu thức dạng trung tố: là cách viết tự nhiên của
biểu thức
VD: 8+2*(5-3)
- Biểu thức dạng hậu tố(postfix): còn được gọi là dạng
ký pháp nghịch đảo Ba Lan (reverse Polish) Trong biểu thức dạng này, toán tử luôn đứng sau toán hạng của
nó
VD: 8+2*(5-3) → 8253-*+
Ứng dụng của danh sách
Trang 40GV: Thiều Quang Trung 40