Nhiệm vụ cần giữ thứ tự ban đầu
Dùng danh sách liên kết để quản lí một danh sách bài hát. Nếu nhập bài A rồi B rồi C mà luôn **chèn đầu**, khi duyệt sẽ được C, B, A. Vì cần in theo thứ tự đã nhập, hãy nối mỗi nút mới vào **cuối**. Tìm bài hát phải đi từ `head` và đếm vị trí từ 1; nếu tên trùng, trả vị trí **đầu tiên**. Dùng tên bài hát giả trong ví dụ để tập xử lí dữ liệu, không phụ thuộc danh mục nhạc thực.
Tạo, tìm và liệt kê trong ba hàm
```python
from LinkedList import LL, Node
def tao_danh_sach_bai_hat(ten_bai):
L = LL()
cuoi = None
for ten in ten_bai:
nut = Node(ten)
if cuoi is None:
L.head = nut
else:
cuoi.next = nut
cuoi = nut
return L
def tim_bai(L, ten_can_tim):
vi_tri = 1
x = L.head
while x is not None:
if x.key == ten_can_tim:
return vi_tri
vi_tri += 1
x = x.next
return None
def cac_dong_bai_hat(L):
ket_qua = []
vi_tri = 1
x = L.head
while x is not None:
ket_qua.append(f"{vi_tri}. {x.key}")
vi_tri += 1
x = x.next
return ket_qua
```
Đặt hai lớp `Node`, `LL` của Bài 30 vào tệp `LinkedList.py` (không chép các lệnh chạy thử); lưu ba hàm trên ở `quan_ly_cd.py`, cùng thư mục với `LinkedList.py`. Tệp `main.py` ở cùng thư mục nhập `quan_ly_cd` để dùng. Gọi `tao_danh_sach_bai_hat(["Bài A", "Bài B", "Bài A"])` rồi in từng dòng kết quả sẽ được `1. Bài A`, `2. Bài B`, `3. Bài A`; `tim_bai(L, "Bài A")` cho `1` vì đó là lần đầu gặp tên. Để nhập thật, chương trình chính đọc một số lượng không âm `n`, gọi `input` đúng n lần để tạo dãy tên rồi đưa dãy vào `tao_danh_sach_bai_hat`. Với n=0, danh sách rỗng và `tim_bai` trả `None`.
Bài luyện
Nếu nhập A, B, C rồi luôn chèn đầu, thứ tự khi duyệt từ head là gì?
Mỗi nút mới lên đầu, nên thứ tự bị đảo.
Đó là thứ tự nếu nối cuối.
Không đúng phép chèn.
Không đúng phép chèn.
Lời giải
Sau A là [A], sau B là [B,A], sau C là [C,B,A].
Bài luyện
Với danh sách `["Bài A","Bài B","Bài A"]`, tìm “Bài A” theo mã trả vị trí nào?
Hàm dừng ở lần gặp đầu tiên.
Vị trí 2 là Bài B.
Đó là lần gặp thứ hai.
Tên xuất hiện hai lần.
Lời giải
Duyệt từ head, nút đầu đã có key bằng “Bài A”, nên trả ngay vị trí 1.
Bài luyện
Với danh sách rỗng, `tim_bai` trả gì?
Không có nút nào để tìm nên vòng lặp không chạy.
Mã dùng None để báo không thấy.
Không có vị trí 1.
Danh sách không có tên.
Lời giải
Khi head là None, vòng while bỏ qua và hàm trả None để báo không tìm thấy.
Đang học