You are on page 1of 5

ThS.

Nguyễn Đắc Dzự Trình COS321 – Thực hành CTDL & TG

Danh sách liên kết


Một số bài tập giúp làm quen và rèn luyện cách thức cài đặt cũng như sử dụng
cấu trúc dữ liệu danh sách liên kết, bao gồm danh sách các phần tử có một
thành phần dữ liệu và danh sách các phần tử sử dụng kiểu dữ liệu cấu trúc.

Bài tập 1
Nhập một danh sách liên kết đơn gồm 𝑛 số nguyên từ bàn phím. Hãy thực hiện các
yêu cầu sau dưới dạng các hàm:
1. In ra màn hình danh sách vừa nhập (0.5 điểm)
2. Tính tổng giá trị các phần tử của danh sách và in ra màn hình (0.5 điểm)
3. Tìm và in ra màn hình giá trị nhỏ nhất và lớn nhất của danh sách (0.5 điểm)
4. Liệt kê các phần tử là số chính phương ra màn hình (0.5 điểm)
5. Nhập một giá trị 𝑥 từ bàn phím, hãy tìm trong danh sách xem có xuất hiện
phần tử nào có giá trị bằng 𝑥 hay không và thông báo ra màn hình vị trí của
phần tử đó, nếu có. (0.5 điểm).
6. Liệt kê tất cả các phần tử là số nguyên tố có trong danh sách (0.5 điểm)
7. Sắp xếp mảng này theo thứ tự giảm dần giá trị các phần tử bằng phương pháp
đổi chỗ trực tiếp (1.0 điểm)
8. Viết hàm 𝑚𝑎𝑖𝑛() lần lượt thực hiện các hàm đã cài đặt nói trên (1.0 điểm)

Bài tập 2
Hãy thực hiện các yêu cầu sau cho danh sách liên kết đơn các ký tự dưới dạng hàm:
9. Cài đặt các thao tác cơ bản của danh sách liên kết: 𝑐𝑟𝑒𝑎𝑡𝑒𝑁𝑜𝑑𝑒, 𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡,
𝑙𝑖𝑠𝑡𝐸𝑚𝑝𝑡𝑦, 𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐻𝑒𝑎𝑑, 𝑙𝑖𝑠𝑡𝑃𝑜𝑝𝐻𝑒𝑎𝑑, 𝑙𝑖𝑠𝑡𝑃𝑟𝑖𝑛𝑡, 𝑙𝑖𝑠𝑡𝐷𝑒𝑠𝑡𝑟𝑜𝑦 (2.0 điểm)
10. Nhập một số nguyên dương 𝑛 từ bàn phím. Hãy sử dụng cấu trúc danh sách
liên kết này để thực hiện hai hàm chuyển đổi sau: (2.0 điểm)
o Đổi số nguyên 𝑛 sang hệ nhị phân, xuất kết quả ra màn hình (1.0 điểm)
o Đổi số nguyên 𝑛 sang hệ thập lục phân, xuất kết quả ra màn hình (1.0
điểm)
11. Viết hàm 𝑚𝑎𝑖𝑛() lần lượt thực hiện các chức năng đã cài đặt ở Câu 2 (1.0 điểm)
Hướng dẫn:
• Tổ chức cấu trúc lưu trữ một phần tử như sau:

STRUCT NODE, *PNODE


char 𝑐
PNODE 𝑛𝑒𝑥𝑡
END

1
ThS. Nguyễn Đắc Dzự Trình COS321 – Thực hành CTDL & TG

• Đổi cơ số từ thập phân sang nhị phân:

𝑘𝑦𝑠𝑜 = {0,1}
Khởi tạo danh sách rỗng (𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡)
WHILE 𝑛 ≠ 0 DO
Chèn giá trị 𝑘𝑦𝑠𝑜[𝑛 % 2] vào đầu danh sách (𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐻𝑒𝑎𝑑)
𝑛 = 𝑛/2
END
Xuất nội dung danh sách (𝑙𝑖𝑠𝑡𝑃𝑟𝑖𝑛𝑡)
Huỷ danh sách (𝑙𝑖𝑠𝑡𝐷𝑒𝑠𝑡𝑟𝑜𝑦)

• Đổi cơ số từ thập phân sang thập lục phân:

𝑘𝑦𝑠𝑜 = {0 → 9, 𝐴 → 𝐹 }
Khởi tạo danh sách rỗng (𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡)
WHILE 𝑛 ≠ 0 DO
Chèn giá trị 𝑘𝑦𝑠𝑜[𝑛 % 16] vào đầu danh sách (𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐻𝑒𝑎𝑑)
𝑛 = 𝑛/16
END
Xuất nội dung danh sách (𝑙𝑖𝑠𝑡𝑃𝑟𝑖𝑛𝑡)
Huỷ danh sách (𝑙𝑖𝑠𝑡𝐷𝑒𝑠𝑡𝑟𝑜𝑦)

Bài tập 3
Hãy viết chương trình để tính chuỗi sau: (10 điểm)
𝑆(𝑥, 𝑛) = 𝑥1 + 𝑥2 + 𝑥3 + ⋯ + 𝑥𝑛
Với 𝑥, 𝑛 được nhập từ bàn phím.
Sử dụng cấu trúc danh sách liên kết đơn để thực hiện. Mỗi phần tử trong danh sách
liên kết có hai thành phần dữ liệu là 𝑥 và 𝑖, trong đó 𝑖 = 1. . 𝑛.
Hướng dẫn:
• Tổ chức cấu trúc lưu trữ một phần tử như sau (2.0 điểm)

STRUCT NODE
int 𝑥
int 𝑖
STRUCT NODE * 𝑛𝑒𝑥𝑡
END

• Cài đặt các hàm: 𝑐𝑟𝑒𝑎𝑡𝑒𝑁𝑜𝑑𝑒, 𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡, 𝑙𝑖𝑠𝑡𝐸𝑚𝑝𝑡𝑦, 𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐻𝑒𝑎𝑑, 𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐵𝑎𝑐𝑘,


𝑙𝑖𝑠𝑡𝐷𝑒𝑠𝑡𝑟𝑜𝑦, 𝑙𝑖𝑠𝑡𝑃𝑟𝑖𝑛𝑡 (4.0 điểm)

2
ThS. Nguyễn Đắc Dzự Trình COS321 – Thực hành CTDL & TG

• Xây dựng danh sách chứa các phần tử của chuỗi số (1.0 điểm)

𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡(ℎ𝑒𝑎𝑑)
FOR 𝑖 = 1 TO 𝑛 DO
𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐵𝑎𝑐𝑘(ℎ𝑒𝑎𝑑, 𝑥, 𝑖)
𝑙𝑖𝑠𝑡𝑃𝑟𝑖𝑛𝑡(ℎ𝑒𝑎𝑑)

• Duyệt danh sách để tính giá trị của chuỗi 𝑆(𝑥, 𝑛) (3.0 điểm)

𝑝 = ℎ𝑒𝑎𝑑
𝑠𝑢𝑚 = 0
WHILE 𝑝 ≠ 𝑁𝑈𝐿𝐿 DO
𝑠𝑢𝑚 = 𝑠𝑢𝑚 + 𝑝𝑜𝑤(𝑝 → 𝑥, 𝑝 → 𝑖)
𝑝 = 𝑝 → 𝑛𝑒𝑥𝑡
PRINT 𝑠𝑢𝑚

Bài tập 4
Tổ chức danh sách liên kết đơn để lưu trữ thông tin của các sinh viên, gồm các trường
thông tin sau:
• Mã SV .................. : 4 ký tự
• Họ tên .................. : 20 ký tự
• Điểm trung bình.. : số thực.
Thực hiện các yêu cầu sau dưới dạng hàm.
• Nhập danh sách sinh viên (1.0 điểm)
• Xuất danh sách sinh viên, thông tin mỗi sinh viên nằm trên một dòng (1.0 điểm)
• Liệt kê các sinh viên có điểm trung bình đạt yêu cầu (Đ𝑇𝐵 ≥ 5) (1.0 điểm)
• Tìm kiếm thông tin một sinh viên dựa trên Mã SV (1.0 điểm).
• Sắp xếp danh sách sinh viên giảm dần theo điểm trung bình (1.0 điểm)
• Thêm một sinh viên vào cuối danh sách (1.0 điểm)
• Huỷ toàn bộ danh sách (1.0 điểm)
• Cho phép xoá một sinh viên khỏi danh sách dựa trên Mã SV (2.0 điểm)
• Xây dựng hàm 𝑚𝑎𝑖𝑛() dưới dạng menu, cho phép tương tác thực hiện các chức
năng đã cài đặt ở trên. Trên menu luôn hiện sĩ số hiện tại của lớp (1.0 điểm).
Hướng dẫn
• Chỉnh sửa và cài đặt các chức năng: 𝑙𝑖𝑠𝑡𝐼𝑛𝑖𝑡, 𝑙𝑖𝑠𝑡𝐸𝑚𝑝𝑡𝑦, 𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐻𝑒𝑎𝑑,
𝑙𝑖𝑠𝑡𝑃𝑢𝑠ℎ𝐵𝑎𝑐𝑘, 𝑙𝑖𝑠𝑡𝑆𝑒𝑎𝑟𝑐ℎ, 𝑙𝑖𝑠𝑡𝑆𝑜𝑟𝑡, 𝑙𝑖𝑠𝑡𝐷𝑒𝑠𝑡𝑟𝑜𝑦…
• Đối với chức năng xoá một sinh viên khỏi danh sách dựa trên Mã SV, ta xây dựng
hàm đệ quy 𝑙𝑖𝑠𝑡𝑅𝑒𝑚𝑜𝑣𝑒 như sau:

3
ThS. Nguyễn Đắc Dzự Trình COS321 – Thực hành CTDL & TG

FUNC 𝑙𝑖𝑠𝑡𝑅𝑒𝑚𝑜𝑣𝑒(PNODE 𝑝, char 𝑚𝑠𝑠𝑣[])


IF 𝑝 == 𝑁𝑈𝐿𝐿 THEN
RETURN 𝑓𝑎𝑙𝑠𝑒;
IF (𝑝 → 𝑚𝑠𝑠𝑣 == 𝑚𝑠𝑠𝑣) THEN // 𝑠𝑡𝑟𝑐𝑚𝑝(𝑝 → 𝑚𝑠𝑠𝑣, 𝑚𝑠𝑠𝑣) == 0
PNODE 𝑞 = 𝑝
𝑝 = 𝑝 → 𝑛𝑒𝑥𝑡
FREE(𝑞)
RETURN 𝑡𝑟𝑢𝑒
RETURN 𝑙𝑖𝑠𝑡𝑅𝑒𝑚𝑜𝑣𝑒(𝑝 → 𝑛𝑒𝑥𝑡, 𝑚𝑠𝑠𝑣, 𝑠𝑢𝑐𝑐𝑒𝑠𝑠)
END

• Giả sử ta có cấu trúc SV để lưu trữ dữ liệu từng sinh viên theo như mô tả của đề
bài, dưới đây là một số dữ liệu thử nghiệm

SV samples[] = {
{"1000", "Nguyen Thanh Trung", 5.8},
{"1001", "Ho Tuong Van", 8.2},
{"1002", "Vo Van Thanh", 4.5},
{"1003", "Le Minh Trung", 7.0},
{"1004", "Hoang Hung", 9.4},
{"1005", "Nguyen Tuan Ha", 3.5},
};

#define SAMPLE_SIZE (sizeof(samples)/sizeof(samples[0]))

// ...
// Chèn dữ liệu thử vào danh sách liên kết
for (int i = 0; i < SAMPLE_SIZE; i++)
listPushBack(pHead, samples[i]);
// ...

Bài tập 5
Xây dựng ứng dụng quản lý sách trong kho sử dụng danh sách liên kết (10 điểm)
Cấu trúc mỗi cuốn sách gồm các thông tin sau (1.0 điểm)
• Mã sách ......... : số nguyên
• Tên sách ........ : chuỗi ký tự, độ dài tối đa 24
• Tên tác giả .... : chuỗi ký tự, độ dài tối đa 16
• Năm xuất bản : số nguyên
• Đơn giá .......... : số nguyên
• Số lượng ......... : số nguyên
Thực hiện các yêu cầu sau:

4
ThS. Nguyễn Đắc Dzự Trình COS321 – Thực hành CTDL & TG

• Nhập thông tin một cuốn sách (0.5 điểm)


• Xuất thông tin một cuốn sách trên một dòng (0.5 điểm).
• Thêm một cuốn sách vào cuối danh sách (1.0 điểm).
• Liệt kê tất cả sách trong danh sách (1.0 điểm).
• Sắp thứ tự tăng dần theo mã sách (1.0 điểm).
• Tìm một cuốn sách dựa trên tên sách, xuất đầy đủ thông tin cuốn sách tìm được,
nếu có (1.0 điểm).
• Nhập vào giá trị 𝑘 biểu thị năm, liệt kê các sách có năm ≥ 𝑘 (1.0 điểm).
• Nhập vào giá trị 𝑚 biểu thị đơn giá, liệt kê các sách có đơn giá ≥ 𝑚 (1.0 điểm).
• Nhập vào mã sách, xoá khỏi danh sách cuốn sách có mã vừa nhập (1.0 điểm).
• Xây dựng hàm 𝑚𝑎𝑖𝑛() dưới dạng menu, thực hiện tất cả các yêu cầu nói trên (1.0
điểm).
Một số dữ liệu để thử nghiệm.

BOOK samples[] = // du lieu thu nghiem, source FAHASA


{
{1002, "The Lord of the Rings", "JJR Tolkien", 2022, 448000, 10},
{1008, "The Alchemist", "Paulo Coelho", 2008, 142000, 8},
{1020, "Bad Science", "Ben Goldacre", 2009, 203000, 7},
{1007, "The Gene", "S. Mukherjee", 2017, 201000, 10},
{1012, "Simply Quantum Physicss", "DK", 2021, 243200, 30},
{1021, "Kafka On The Shore", "Murakami", 2005, 224000, 15},
{1003, "The Da Vinci Code", "Dan Brown", 2006, 170000, 30},
{1013, "A Brief History of Time", "Stephen Hawking", 1998, 179000, 20},
{1005, "The Hobbit", "JJR Toklien", 2012, 183000, 50},
{1004, "The Old Man And The Sea", "Ernest Hemingway", 1951, 129000, 5},
{1009, "Dune", "Frank Herbert", 1965, 175750, 45},
{1013, "The Complete Human Body", "DK", 2016, 663100, 5}
};

#define SAMPLE_SIZE (sizeof(samples)/sizeof(samples[0]))

You might also like