lOMoARcPSD| 60729183
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á
BÀI TẬP LỚN
HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
ĐỀ TÀI 5: ỨNG DỤNG DANH SÁCH LIÊN KẾT VÒNG ĐƠN VÀO
QUẢN LÝ DANH SÁCH SỐ NGUYÊN
Sinh viên thực hiện
Khóa
Lớp
Mã sinh viên
Trịnh Thế Sơn
K13
DCCNTT13.10.1
4
20222635
Bắc Ninh, năm 2023
lOMoARcPSD| 60729183
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á
BÀI TẬP LỚN
HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Nhóm: 5
ĐỀ TÀI 5: ỨNG DỤNG DANH SÁCH LIÊN KẾT VÒNG ĐƠN VÀO
QUẢN LÝ DANH SÁCH SỐ NGUYÊN
STT
Mã sinh
viên
Điểm
bằng số
Điểm
bằng chữ
1
20222635
CÁN BỘ CHẤM 1 CÁN BỘ CHẤM 2
(Ký và ghi rõ họ tên) (Ký và ghi rõ họ tên)
lOMoARcPSD| 60729183
MỤC LỤC
DANH MỤC CÁC TỪ VIẾT TẮT .................................................................................. 4
DANH MỤC BẢNG BIỂU VÀ SƠ ĐỒ ........................................................................... 5
Chương 1. Tổng quan về đề tài ........................................................................................ 6
1.1 Giới thiệu .................................................................................................................. 6
1.2 Phân công công việc .................................................................................................. 7
Chương 2. Thuật toán ....................................................................................................... 8
2.1 Mô tả bài toán ............................................................................................................ 8
2.2 Lưu đồ thuật toán tổng quát ...................................................................................... 9
2.3 Các bước của thuật toán tổng quát ............................................................................ 9
2.4 Thiết kế giao diện .................................................................................................... 10
2.5 Thuật toán, các bước và lưu đồ chi tiết ................................................................... 12
Chương 3. Cài đặt ........................................................................................................... 30
3.1 Code toàn bài ........................................................................................................... 30
3.2 Bộ dữ liệu mẫu ........................................................................................................ 44
3.3 Kết quả .................................................................................................................... 45
Chương 4. Hướng phát triển và tài liệu tham khảo.....................................................52
4.1 Hướng phát triển....................................................................................................52
4.2 Tài liệu tham khảo..................................................................................................52
lOMoARcPSD| 60729183
DANH MỤC CÁC TỪ VIẾT TẮT
STT
Chữ viết tắt
Giải thích
1
Đ
Đúng
2
S
Sai
lOMoARcPSD| 60729183
DANH MỤC BẢNG BIỂU VÀ SƠ ĐỒ
Số hiệu
Tên
Trang
1.1
Danh sách liên kết vòng đơn
6
1.2
Bảng phân công công việc
8
2.1
Lưu đồ tổng quát thuật toán ứng dụng danh sách liên kết vòng đơn
vào quản lý danh sách số nguyên
10
2.2
Lưu đồ thuật toán khởi tạo danh sách số nguyên
14
2.3
Lưu đồ thuật toán kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay
bằng 10
18
2.4
Lưu đồ thuật toán tính trung bình nhân các số chẵn, dương, chia hết
cho 5
22
2.5
Lưu đồ thuật toán sắp xếp danh sách theo thứ tự tăng dần
25
2.6
Lưu đồ thuật toán kiểm tra cấp số nhân 3 phần tử liên tiếp trong dãy
29
3
Bảng dữ liệu mẫu
31
lOMoARcPSD| 60729183
Chương 1. Tổng quan về đề tài
1.1 Giới thiệu
Danh sách liên kết vòng đơn – Singly circular linked list là một danh sách liên kết
(linked list) trong đó tất cả các nodes được kết nối với nhau để tạo thành một vòng
tròn. Sẽ không có con trỏ NULL ở cuối danh sách liên kết vòng
Hình 1.1 Danh sách liên kết vòng đơn
Ưu điểm:
1. Bất kỳ node nào cũng có thể là điểm bắt đầu (starting point). Chúng ta có thể
duyệttoàn bộ danh sách bằng cách bắt đầu tại bất kỳ điểm nào, tùy ý. Chúng ta chỉ
cần dừng lại khi node đầu tiên được duyệt, lại được duyệt tới một lần nữa.
2. Danh sách liên kết vòng rất hữu dụng trong việc triển khai queue – hàng đợi. Khi
sử dụng danh sách liên kết vòng để cài đặt queue, chúng ta sẽ không cần phải duy trì
hai điểm front (điểm đầu) và rear (điểm cuối) của queue. Chúng ta chỉ cần duy trì
một con trỏ dành cho note mới nhất được chèn vào (nằm ở cuối danh sách), lấy node
cuối cùng này làm mốc, ta có thể dễ dàng truy cập tới các nodes nằm ở phần đầu
danh sách.
3. Danh sách liên kết dạng vòng còn hữu dụng trong các ứng dụng phần mềm, để lặp
đi lặp lại danh sách. Ví dụ, khi nhiều ứng dụng đang chạy trên một Máy tính, thông
thường hệ điều hành sẽ đặt các ứng dụng đang chạy vào một danh sách, và sau đó
duyệt qua chúng, mỗi lần duyệt tới ứng dụng nào thì lại cho ứng dụng đó một khoảng
thời gian để thực thi, và sau đó lại đưa chúng về trạng thái đợi trong khi CPU được
cấp cho một ứng dụng khác. Vì thế, sẽ rất lý tưởng khi hệ điều hành sử dụng một
danh sách liên kết vòng để khi duyệt đến cuối danh sách, nó có thể quay vòng lên
phía trước danh sách/phần đầu danh sách.
Nhược điểm:
Có thể không biết khi nào đã duyệt qua toàn bộ phần tử cua danh sách. Điều này dẫn
đến qua trình duyệt vô hạn không điểm dừng.
lOMoARcPSD| 60729183
Thao tác cơ bản:
1. Tổ chức
2. Khởi tạo danh sách rỗng.
3. Tạo nút
4. Chèn vào đầu danh sách
5. Chèn vào cuối danh sách
6. Tìm kiếm paahnf tử trong danh sách\
7. Chèn nút
8. Hủy phàn tử trong danh sách
9. Hủy danh sách
Úng dụng:
Được sử dụng trong các ứng dụng trong đó toàn bộ danh sách được truy cập từng cái
một trong vòng lặp. Ứng dụng vào quản lý danh sách số nguyên.
1.2 Phân công công việc
Bảng 1.2 Bảng phân công công việc
STT
Tên đầu việc
Công việc
chia đến nhỏ nhất
Thành viên
Đánh giá
Kết luận
1
Viết chương
trình ứng dụng
danh sách liên
kết vòng đơn
vào quản lý
danh sách số
nguyên
Viết chương trình tạo
Menu
Trịnh Thế Sơn
Menu dễ sử dụng,
dễ hiểu
Chương trình chạy
nhanh, ổn định và đưa
ra kết quả chính xác
giúp người dùng quản
lý danh sách số
nguyên hiệu quả và tối
ưu
Viết chương trình khởi
tạo danh sách
Dễ dàng khởi tạo
danh sách theo ý
muốn
Kiểm tra vị trí thứ 5 có
phải số nguyên tố
không, nếu đúng thay
thế phần tử bằng số 10
Kiểm tra và thay
thế nhanh, chính
xác
Tính trung bình nhân
các số chắn dương chia
hết cho 5 (không kể số
0)
Tính toán nhanh
tối ưu
lOMoARcPSD| 60729183
Sắp xếp danh sách theo
thứ tự tăng dần
Xắp xếp nhanh và
chính xác
Kiểm tra xem trong
danh sách có 3 phần tử
liên tiếp là cấp số nhân
hay không?, in ra 3 số
đó
Kiểm tra đưa ra
kết quả nhanh
chính xác theo
yêu cầu
2
Làm báo cáo
Word
Chương 1 tổng quan về
đề tài
Hiểu về đề tài và
phân công việc
Bản báo cáo Word
giúp người xem hiểu
Chương 2 thuật toán
Trịnh Thế Sơn
Nắm bắt rõ lưu
dồ, các bộ mẫu và
giao diện
rõ về đề tài, cách phân
công việc và nắm bắt
được thuật toán
Chương 3 cài đặt
Hiểu về cách cài
đặt thuật toán và
kết quả đạt được
3
Làm Slide
Slide trình chiếu trước
lớp
Trịnh Thế Sơn
Tóm gọn nội dung
đề tài, đầy đủ ý
Slide ngắn gọn bao
quát đề tài, dễ hiểu
Chương 2. Thuật toán
2.1 Mô tả bài toán
Chương trình được cài đặt bằng ngôn ngữ C ứng dụng danh sách liên kết vòng đơn
giúp người dùng quản lý danh sách số nguyên và thực hiện các thao tác yêu cầu một cách
thuận tiện, nhanh chóng và có độ chính xác cao, người dùng sẽ tiết kiệm được nhiều thời
gian mà vẫn đạt được kết quả mong muốn chính xác. Người dùng sẽ nhập một danh sách
các số nguyên, chương sẽ trình tạo một Menu thực hiện các công việc sau:
1. Khởi tạo danh sách, quá trình nhập sẽ dừng lại khi nhập dấu “#”.
2. Kiểm tra xem ở vị trí thứ 5 có phải là số nguyên tố hay không? Nếu đúng hãy thay thế
phần tử này bằng số 10.
3. Tính trung bình nhân các số chẵn, dương, chia hết cho 5 (không kể số 0).
4. Sắp xếp danh sách theo thứ tự tăng dần.
lOMoARcPSD| 60729183
5. Kiểm tra xem trong danh sách có 3 phần tử liên tiếp là cấp số nhân hay không?, in ra 3
số đó.
Khi đó người dùng sẽ nhập lựa chọn của mình mong muốn để chương trình thực hiện
yêu cầu của mình.
2.2 Lưu đồ thut toán tổng quát
Hình 2.1 Lưu đồ thuật toán ứng dụng danh sách liên kết vòng đơn vào quản lý danh sách số nguyên
2.3 Các bước của thuật toán tng quát
1. Bắt đầu
In ra Menu các chức năng cho người dùng.
Đọc lựa chọn từ người dùng.
2. Nếu lựa chọn là 1: Khởi tạo danh sách:
Nhập khởi tạo danh sách số nguyên và nhập ‘# để dừng quá trình khởi tạo.
lOMoARcPSD| 60729183
Tạo danh sách liên kết vòng đơn từ các giá trị nhập vào.
3. Nếu lựa chọn là 2: Kiểm tra và thay thế phần tử thứ 5:
Nếu danh sách đã được khởi tạo di chuyển đến phần tử thứ 5 trong danh sách.
Kiểm tra xem giá trị của phần tử này có phải số nguyên tố không.
Nếu là số nguyên tố thì thay thế giá trị này bằng 10 và in ra danh sách.
Nếu không phải số nguyên tố thì in ra thông báo giá trị không là số nguyên tố.
4. Nếu lựa chọn là 3: Tính trung bình nhân các số chẵn, dương, chia hết cho 5:
Nếu danh sách đã dược khởi tạo, duyệt danh sách và tính trung bình nhân các phần
tử thỏa mãn điều kiện (số chẵn, dương, chia hết cho 5).
Nếu không có phần tử thỏa mãn điều kiện, in thông báo.
5. Nếu lựa chọn là 4: Sắp xếp danh sách theo thứ tự tăng dần:
Nếu danh sách đã được khởi tạo, sử dụng thuật toán sắp xếp để sắp xếp danh sách
theo thứ tự tăng dần.
In danh sách sau khi đã được sắp xếp.
6. Nếu lựa chọn là 5: Kiểm tra cấp số nhân 3 phần tử liên tiếp trong dãy:
Nếu danh sách đã được khởi tạo, duyệt danh sách và kiểm tra bộ ba từng phần tử
liên tiếp.
Nếu tìm thấy bộ ba phần tử là cấp số nhân in chúng ra.
Nếu không tìm thấy, in thông báo.
7. Nếu lựa chọn là 6: Thoát: Kết thúc chương trình.
2.4 Thiết kế giao diện
Giao diện điều khiển:
lOMoARcPSD| 60729183
lOMoARcPSD| 60729183
2.5 Thuật toán, các bước và lưu đồ chi tiết
Yêu cầu 1: Khởi tạo danh sách số nguyên.
1. Khởi tạo danh sách mới:
head được đặt thành NULL, làm cho danh sách liên kết rỗng.
2. Nhập danh sách mới từ người dùng:
In ra thông báo "Nhap danh sach :" để hướng dẫn người dùng.
Sử dụng vòng lặp vô hạn (while(1)) để liên tục đọc dữ liệu từ người dùng.
Dữ liệu được đọc vào biến input dưới dạng chuỗi.
Nếu chuỗi bắt đầu bằng dấu #, vòng lặp sẽ được kết thúc (break được gọi) và nhập
danh sách sẽ kết thúc.
Nếu không, chuỗi input được chuyển thành số nguyên (num = atoi(input)) và sau
đó được chèn vào danh sách liên kết sử dụng hàm insertNode(). Danh sách liên
kết mới được xây dựng trong quá trình lặp này.
3. Gán khoiTao thành 1:
Sau khi danh sách mới đã được tạo, khoiTao được đặt thành 1 để chỉ đánh dấu
rằng danh sách đã được khởi tạo.
4. Kết thúc vòng lặp và kết thúc thuật toán:
Vòng lặp nhập liệu sẽ kết thúc khi người dùng nhập dấu #. Sau đó, chương trình
sẽ kết thúc và tiếp tục thực hiện các lệnh tiếp theo nếu có.
lOMoARcPSD| 60729183
Hình 2.2 Lưu đồ thuật toán khởi tạo danh sách số nguyên
Cài đặt:
lOMoARcPSD| 60729183
// ham de them mot phan tu vao danh sach lien ket don vong
struct Node* insertNode(struct Node* head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct
Node)); newNode->data = data; newNode->next = NULL;
if (head == NULL) { newNode-
>next = newNode; return
newNode;
} else {
struct Node* current = head;
while (current->next != head) {
current = current->next;
}
current->next = newNode;
newNode->next = head;
return head;
}
}
case 1:
if (khoiTao) {
deleteList(head); // xoa danh sach lien ket don vong cu
}
lOMoARcPSD| 60729183
head = NULL; // khoi tao danh sach moi
printf("Nhap danh sach :\n");
while (1) {
scanf("%s", input);
if (input[0] == '#') {
break;
}
num = atoi(input);
head = insertNode(head, num);
}
khoiTao = 1;
break;
Kết quả:
Yêu cầu 2: Kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay bằng 10
1.Kiểm tra xem biến khoiTao có giá trị là true (khác 0) không:
Nếu khoiTao là true, tiếp tục thực hiện bước tiếp theo.
Nếu không, in ra thông báo "Danh sach chua duoc khoi tao." và kết thúc lệnh.
lOMoARcPSD| 60729183
2. Tìm phần tử thứ 5 trong danh sách:
Sử dụng một vòng lặp để đi đến phần tử thứ 5 trong danh sách liên kết đơn. Biến
fifth sẽ trỏ đến phần tử này.
Kiểm tra xem phần tử thứ 5 có phải là số nguyên tố không:
3. Gọi hàm isPrime(fifth->data) để kiểm tra xem giá trị của phần tử thứ 5 (fifth->data) có
phải là số nguyên tố không.
Nếu phần tử thứ 5 là số nguyên tố, thay đổi giá trị của nó thành 10.
Nếu phần tử thứ 5 không phải là số nguyên tố, in ra thông báo "Phan tu thu 5
khong la so nguyen to.".
Xuất danh sách liên kết sau khi thay thế (nếu cần):
4. Nếu phần tử thứ 5 là số nguyên tố và được thay thế, in ra thông báo "So o vi tri thu 5
laso nguyen to, danh sach sau khi duoc thay the :" và sau đó gọi hàm printList(head)
để xuất danh sách liên kết.
lOMoARcPSD| 60729183
Hình 2.3 Lưu đồ thuật toán kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay bằng 10
Cài đặt:
lOMoARcPSD| 60729183
// ham kiem tra 1 so co phai la so nguyen to khong int
isPrime(int num) { if (num <= 1) return 0; if
(num <= 3) return 1;
if (num % 2 == 0 || num % 3 == 0) return 0; for
(int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return 0;
} return
1;
}
case 2:
if (khoiTao) {
struct Node* fifth = head;
int count = 1;
while (count < 5) {
fifth = fifth->next;
count++;
}
if (isPrime(fifth->data)) {
fifth->data = 10;
printf("So o vi tri thu 5 la so nguyen to, danh sach sau khi duoc thay the
:\n");
lOMoARcPSD| 60729183
printList(head);
} else {
printf("Phan tu thu 5 khong la so nguyen to.\n");
}
} else {
printf("Danh sach chua duoc khoi tao.\n");
}
break;
Kết quả:
Yêu cầu 3: Tính trung bình nhân các số chẵn, dương, chia hết cho 5.
1. Kiểm tra xem biến khoiTao có giá trị true (khác 0) không:
Nếu khoiTao là true, tiếp tục thực hiện bước tiếp theo.
Nếu không, in ra thông báo "Danh sach chua duoc khoi tao." và kết thúc lệnh.
2.Tính tích của các số chẵn dương chia hết cho 5 và trung bình của chúng:
Sử dụng vòng lặp do-while để duyệt qua danh sách liên kết vòng.
Trong mỗi lần lặp, kiểm tra xem giá trị của nút hiện tại có phải là số chẵn dương
và chia hết cho 5 không.
Nếu có, nhân giá trị của nút với biến product và tăng giá trị của count lên 1.
Sau khi vòng lặp kết thúc, kiểm tra xem có số nào thỏa mãn điều kiện không:
Nếu có ít nhất một số thỏa mãn điều kiện, tính trung bình của chúng và in ra kết
quả.
lOMoARcPSD| 60729183
Nếu không có số nào thỏa mãn điều kiện, in ra thông báo "Khong co so thoa man
dieu kien.".

Preview text:

lOMoAR cPSD| 60729183
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á BÀI TẬP LỚN
HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
ĐỀ TÀI 5: ỨNG DỤNG DANH SÁCH LIÊN KẾT VÒNG ĐƠN VÀO
QUẢN LÝ DANH SÁCH SỐ NGUYÊN
Sinh viên thực hiện Khóa Lớp Mã sinh viên Trịnh Thế Sơn K13 20222635 DCCNTT13.10.1 4 Bắc Ninh, năm 2023 lOMoAR cPSD| 60729183
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á BÀI TẬP LỚN
HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Nhóm: 5
ĐỀ TÀI 5: ỨNG DỤNG DANH SÁCH LIÊN KẾT VÒNG ĐƠN VÀO
QUẢN LÝ DANH SÁCH SỐ NGUYÊN Điểm Điểm STT
Sinh viên thực hiện Mã sinh viên bằng số bằng chữ 1 Trịnh Thế Sơn 20222635 CÁN BỘ CHẤM 1 CÁN BỘ CHẤM 2
(Ký và ghi rõ họ tên)
(Ký và ghi rõ họ tên) lOMoAR cPSD| 60729183 MỤC LỤC
DANH MỤC CÁC TỪ VIẾT TẮT .................................................................................. 4
DANH MỤC BẢNG BIỂU VÀ SƠ ĐỒ ........................................................................... 5
Chương 1. Tổng quan về đề tài ........................................................................................ 6
1.1 Giới thiệu .................................................................................................................. 6
1.2 Phân công công việc .................................................................................................. 7
Chương 2. Thuật toán ....................................................................................................... 8
2.1 Mô tả bài toán ............................................................................................................ 8
2.2 Lưu đồ thuật toán tổng quát ...................................................................................... 9
2.3 Các bước của thuật toán tổng quát ............................................................................ 9
2.4 Thiết kế giao diện .................................................................................................... 10
2.5 Thuật toán, các bước và lưu đồ chi tiết ................................................................... 12
Chương 3. Cài đặt ........................................................................................................... 30
3.1 Code toàn bài ........................................................................................................... 30
3.2 Bộ dữ liệu mẫu ........................................................................................................ 44
3.3 Kết quả .................................................................................................................... 45
Chương 4. Hướng phát triển và tài liệu tham khảo.....................................................52
4.1 Hướng phát triển....................................................................................................52
4.2 Tài liệu tham khảo..................................................................................................52 lOMoAR cPSD| 60729183
DANH MỤC CÁC TỪ VIẾT TẮT STT Chữ viết tắt Giải thích 1 Đ Đúng 2 S Sai lOMoAR cPSD| 60729183
DANH MỤC BẢNG BIỂU VÀ SƠ ĐỒ Số hiệu Tên Trang 1.1
Danh sách liên kết vòng đơn 6 1.2
Bảng phân công công việc 8 2.1 10
Lưu đồ tổng quát thuật toán ứng dụng danh sách liên kết vòng đơn
vào quản lý danh sách số nguyên 2.2
Lưu đồ thuật toán khởi tạo danh sách số nguyên 14 2.3 18
Lưu đồ thuật toán kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay bằng 10 2.4 22
Lưu đồ thuật toán tính trung bình nhân các số chẵn, dương, chia hết cho 5 2.5
Lưu đồ thuật toán sắp xếp danh sách theo thứ tự tăng dần 25 2.6
Lưu đồ thuật toán kiểm tra cấp số nhân 3 phần tử liên tiếp trong dãy 29 3 Bảng dữ liệu mẫu 31 lOMoAR cPSD| 60729183
Chương 1. Tổng quan về đề tài 1.1 Giới thiệu
Danh sách liên kết vòng đơn – Singly circular linked list là một danh sách liên kết
(linked list) trong đó tất cả các nodes được kết nối với nhau để tạo thành một vòng
tròn. Sẽ không có con trỏ NULL ở cuối danh sách liên kết vòng
Hình 1.1 Danh sách liên kết vòng đơn Ưu điểm:
1. Bất kỳ node nào cũng có thể là điểm bắt đầu (starting point). Chúng ta có thể
duyệttoàn bộ danh sách bằng cách bắt đầu tại bất kỳ điểm nào, tùy ý. Chúng ta chỉ
cần dừng lại khi node đầu tiên được duyệt, lại được duyệt tới một lần nữa.
2. Danh sách liên kết vòng rất hữu dụng trong việc triển khai queue – hàng đợi. Khi
sử dụng danh sách liên kết vòng để cài đặt queue, chúng ta sẽ không cần phải duy trì
hai điểm front (điểm đầu) và rear (điểm cuối) của queue. Chúng ta chỉ cần duy trì
một con trỏ dành cho note mới nhất được chèn vào (nằm ở cuối danh sách), lấy node
cuối cùng này làm mốc, ta có thể dễ dàng truy cập tới các nodes nằm ở phần đầu danh sách.
3. Danh sách liên kết dạng vòng còn hữu dụng trong các ứng dụng phần mềm, để lặp
đi lặp lại danh sách. Ví dụ, khi nhiều ứng dụng đang chạy trên một Máy tính, thông
thường hệ điều hành sẽ đặt các ứng dụng đang chạy vào một danh sách, và sau đó
duyệt qua chúng, mỗi lần duyệt tới ứng dụng nào thì lại cho ứng dụng đó một khoảng
thời gian để thực thi, và sau đó lại đưa chúng về trạng thái đợi trong khi CPU được
cấp cho một ứng dụng khác. Vì thế, sẽ rất lý tưởng khi hệ điều hành sử dụng một
danh sách liên kết vòng để khi duyệt đến cuối danh sách, nó có thể quay vòng lên
phía trước danh sách/phần đầu danh sách. Nhược điểm:
Có thể không biết khi nào đã duyệt qua toàn bộ phần tử cua danh sách. Điều này dẫn
đến qua trình duyệt vô hạn không điểm dừng. lOMoAR cPSD| 60729183 Thao tác cơ bản: 1. Tổ chức
2. Khởi tạo danh sách rỗng. 3. Tạo nút
4. Chèn vào đầu danh sách
5. Chèn vào cuối danh sách
6. Tìm kiếm paahnf tử trong danh sách\ 7. Chèn nút
8. Hủy phàn tử trong danh sách 9. Hủy danh sách Úng dụng:
Được sử dụng trong các ứng dụng trong đó toàn bộ danh sách được truy cập từng cái
một trong vòng lặp. Ứng dụng vào quản lý danh sách số nguyên.
1.2 Phân công công việc
Bảng 1.2 Bảng phân công công việc STT Tên đầu việc Công việc Thành viên Đánh giá Kết luận
chia đến nhỏ nhất 1 Viết chương Viết chương trình tạo Menu dễ sử dụng, trình ứng dụng Menu dễ hiểu danh sách liên Chương trình chạy kết vòng đơn nhanh, ổn định và đưa vào quản lý ra kết quả chính xác danh sách số giúp người dùng quản Viết chương trình khởi Dễ dàng khởi tạo nguyên lý danh sách số tạo danh sách danh sách theo ý
nguyên hiệu quả và tối muốn ưu Kiểm tra và thay
Kiểm tra vị trí thứ 5 có thế nhanh, chính phải số nguyên tố xác không, nếu đúng thay
thế phần tử bằng số 10 Tính toán nhanh Tính trung bình nhân tối ưu các số chắn dương chia hết cho 5 (không kể số 0) Trịnh Thế Sơn lOMoAR cPSD| 60729183 Sắp xếp danh sách theo Xắp xếp nhanh và thứ tự tăng dần chính xác Kiểm tra đưa ra Kiểm tra xem trong kết quả nhanh danh sách có 3 phần tử chính xác theo
liên tiếp là cấp số nhân yêu cầu hay không?, in ra 3 số đó 2 Làm báo cáo Chương 1 tổng quan về Hiểu về đề tài và Bản báo cáo Word Word đề tài phân công việc giúp người xem hiểu Chương 2 thuật toán Trịnh Thế Sơn
rõ về đề tài, cách phân Nắm bắt rõ lưu công việc và nắm bắt
dồ, các bộ mẫu và được thuật toán giao diện Chương 3 cài đặt Hiểu về cách cài đặt thuật toán và kết quả đạt được 3 Làm Slide Trịnh Thế Sơn Slide trình chiếu trước
Tóm gọn nội dung Slide ngắn gọn bao lớp đề tài, đầy đủ ý quát đề tài, dễ hiểu
Chương 2. Thuật toán
2.1 Mô tả bài toán
Chương trình được cài đặt bằng ngôn ngữ C ứng dụng danh sách liên kết vòng đơn
giúp người dùng quản lý danh sách số nguyên và thực hiện các thao tác yêu cầu một cách
thuận tiện, nhanh chóng và có độ chính xác cao, người dùng sẽ tiết kiệm được nhiều thời
gian mà vẫn đạt được kết quả mong muốn chính xác. Người dùng sẽ nhập một danh sách
các số nguyên, chương sẽ trình tạo một Menu thực hiện các công việc sau:
1. Khởi tạo danh sách, quá trình nhập sẽ dừng lại khi nhập dấu “#”.
2. Kiểm tra xem ở vị trí thứ 5 có phải là số nguyên tố hay không? Nếu đúng hãy thay thế
phần tử này bằng số 10.
3. Tính trung bình nhân các số chẵn, dương, chia hết cho 5 (không kể số 0).
4. Sắp xếp danh sách theo thứ tự tăng dần. lOMoAR cPSD| 60729183
5. Kiểm tra xem trong danh sách có 3 phần tử liên tiếp là cấp số nhân hay không?, in ra 3 số đó.
Khi đó người dùng sẽ nhập lựa chọn của mình mong muốn để chương trình thực hiện yêu cầu của mình.
2.2 Lưu đồ thuật toán tổng quát
Hình 2.1 Lưu đồ thuật toán ứng dụng danh sách liên kết vòng đơn vào quản lý danh sách số nguyên
2.3 Các bước của thuật toán tổng quát 1. Bắt đầu
In ra Menu các chức năng cho người dùng.
Đọc lựa chọn từ người dùng.
2. Nếu lựa chọn là 1: Khởi tạo danh sách:
Nhập khởi tạo danh sách số nguyên và nhập ‘#’ để dừng quá trình khởi tạo. lOMoAR cPSD| 60729183
Tạo danh sách liên kết vòng đơn từ các giá trị nhập vào.
3. Nếu lựa chọn là 2: Kiểm tra và thay thế phần tử thứ 5:
Nếu danh sách đã được khởi tạo di chuyển đến phần tử thứ 5 trong danh sách.
Kiểm tra xem giá trị của phần tử này có phải số nguyên tố không.
Nếu là số nguyên tố thì thay thế giá trị này bằng 10 và in ra danh sách.
Nếu không phải số nguyên tố thì in ra thông báo giá trị không là số nguyên tố.
4. Nếu lựa chọn là 3: Tính trung bình nhân các số chẵn, dương, chia hết cho 5:
Nếu danh sách đã dược khởi tạo, duyệt danh sách và tính trung bình nhân các phần
tử thỏa mãn điều kiện (số chẵn, dương, chia hết cho 5).
Nếu không có phần tử thỏa mãn điều kiện, in thông báo.
5. Nếu lựa chọn là 4: Sắp xếp danh sách theo thứ tự tăng dần:
Nếu danh sách đã được khởi tạo, sử dụng thuật toán sắp xếp để sắp xếp danh sách theo thứ tự tăng dần.
In danh sách sau khi đã được sắp xếp.
6. Nếu lựa chọn là 5: Kiểm tra cấp số nhân 3 phần tử liên tiếp trong dãy:
Nếu danh sách đã được khởi tạo, duyệt danh sách và kiểm tra bộ ba từng phần tử liên tiếp.
Nếu tìm thấy bộ ba phần tử là cấp số nhân in chúng ra.
Nếu không tìm thấy, in thông báo.
7. Nếu lựa chọn là 6: Thoát: Kết thúc chương trình.
2.4 Thiết kế giao diện Giao diện điều khiển: lOMoAR cPSD| 60729183 lOMoAR cPSD| 60729183
2.5 Thuật toán, các bước và lưu đồ chi tiết
Yêu cầu 1: Khởi tạo danh sách số nguyên.
1. Khởi tạo danh sách mới:
• head được đặt thành NULL, làm cho danh sách liên kết rỗng.
2. Nhập danh sách mới từ người dùng:
• In ra thông báo "Nhap danh sach :" để hướng dẫn người dùng.
• Sử dụng vòng lặp vô hạn (while(1)) để liên tục đọc dữ liệu từ người dùng.
• Dữ liệu được đọc vào biến input dưới dạng chuỗi.
• Nếu chuỗi bắt đầu bằng dấu #, vòng lặp sẽ được kết thúc (break được gọi) và nhập danh sách sẽ kết thúc.
• Nếu không, chuỗi input được chuyển thành số nguyên (num = atoi(input)) và sau
đó được chèn vào danh sách liên kết sử dụng hàm insertNode().  Danh sách liên
kết mới được xây dựng trong quá trình lặp này. 3. Gán khoiTao thành 1:
• Sau khi danh sách mới đã được tạo, khoiTao được đặt thành 1 để chỉ đánh dấu
rằng danh sách đã được khởi tạo.
4. Kết thúc vòng lặp và kết thúc thuật toán:
• Vòng lặp nhập liệu sẽ kết thúc khi người dùng nhập dấu #. Sau đó, chương trình
sẽ kết thúc và tiếp tục thực hiện các lệnh tiếp theo nếu có. lOMoAR cPSD| 60729183
Hình 2.2 Lưu đồ thuật toán khởi tạo danh sách số nguyên Cài đặt: lOMoAR cPSD| 60729183
// ham de them mot phan tu vao danh sach lien ket don vong
struct Node* insertNode(struct Node* head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct
Node)); newNode->data = data; newNode->next = NULL; if (head == NULL) { newNode- >next = newNode; return newNode; } else { struct Node* current = head;
while (current->next != head) { current = current->next; } current->next = newNode; newNode->next = head; return head; } } case 1: if (khoiTao) {
deleteList(head); // xoa danh sach lien ket don vong cu } lOMoAR cPSD| 60729183
head = NULL; // khoi tao danh sach moi printf("Nhap danh sach :\n"); while (1) { scanf("%s", input); if (input[0] == '#') { break; } num = atoi(input);
head = insertNode(head, num); } khoiTao = 1; break; Kết quả:
Yêu cầu 2: Kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay bằng 10
1.Kiểm tra xem biến khoiTao có giá trị là true (khác 0) không:
• Nếu khoiTao là true, tiếp tục thực hiện bước tiếp theo.
• Nếu không, in ra thông báo "Danh sach chua duoc khoi tao." và kết thúc lệnh. lOMoAR cPSD| 60729183
2. Tìm phần tử thứ 5 trong danh sách:
• Sử dụng một vòng lặp để đi đến phần tử thứ 5 trong danh sách liên kết đơn. Biến
fifth sẽ trỏ đến phần tử này.
• Kiểm tra xem phần tử thứ 5 có phải là số nguyên tố không:
3. Gọi hàm isPrime(fifth->data) để kiểm tra xem giá trị của phần tử thứ 5 (fifth->data) có
phải là số nguyên tố không.
• Nếu phần tử thứ 5 là số nguyên tố, thay đổi giá trị của nó thành 10.
• Nếu phần tử thứ 5 không phải là số nguyên tố, in ra thông báo "Phan tu thu 5 khong la so nguyen to.".
• Xuất danh sách liên kết sau khi thay thế (nếu cần):
4. Nếu phần tử thứ 5 là số nguyên tố và được thay thế, in ra thông báo "So o vi tri thu 5
laso nguyen to, danh sach sau khi duoc thay the :" và sau đó gọi hàm printList(head)
để xuất danh sách liên kết. lOMoAR cPSD| 60729183
Hình 2.3 Lưu đồ thuật toán kiểm tra nếu phần tử thứ 5 là số nguyên tố thì thay bằng 10 Cài đặt: lOMoAR cPSD| 60729183
// ham kiem tra 1 so co phai la so nguyen to khong int
isPrime(int num) { if (num <= 1) return 0; if (num <= 3) return 1;
if (num % 2 == 0 || num % 3 == 0) return 0; for
(int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return 0; } return 1; } case 2: if (khoiTao) { struct Node* fifth = head; int count = 1; while (count < 5) { fifth = fifth->next; count++; }
if (isPrime(fifth->data)) { fifth->data = 10;
printf("So o vi tri thu 5 la so nguyen to, danh sach sau khi duoc thay the :\n"); lOMoAR cPSD| 60729183 printList(head); } else {
printf("Phan tu thu 5 khong la so nguyen to.\n"); } } else {
printf("Danh sach chua duoc khoi tao.\n"); } break; Kết quả:
Yêu cầu 3: Tính trung bình nhân các số chẵn, dương, chia hết cho 5.
1. Kiểm tra xem biến khoiTao có giá trị true (khác 0) không:
• Nếu khoiTao là true, tiếp tục thực hiện bước tiếp theo.
• Nếu không, in ra thông báo "Danh sach chua duoc khoi tao." và kết thúc lệnh.
2.Tính tích của các số chẵn dương chia hết cho 5 và trung bình của chúng:
• Sử dụng vòng lặp do-while để duyệt qua danh sách liên kết vòng.
• Trong mỗi lần lặp, kiểm tra xem giá trị của nút hiện tại có phải là số chẵn dương và chia hết cho 5 không.
• Nếu có, nhân giá trị của nút với biến product và tăng giá trị của count lên 1.
• Sau khi vòng lặp kết thúc, kiểm tra xem có số nào thỏa mãn điều kiện không:
• Nếu có ít nhất một số thỏa mãn điều kiện, tính trung bình của chúng và in ra kết quả. lOMoAR cPSD| 60729183
• Nếu không có số nào thỏa mãn điều kiện, in ra thông báo "Khong co so thoa man dieu kien.".