BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG ÁKHOA: CÔNG NGHỆ THÔNG TIN
Nguyễn Quốc Đại DCCNTT13.10.20 13
Bắc Ninh, năm 2023BỘ GIÁO DỤC VÀ ĐÀO TẠO
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG ÁKHOA: CÔNG NGHỆ THÔNG TIN
Điểm bằngchữ1Hoàng Trọng Giáp 20223729
CÁN BỘ CHẤM 1
(Ký và ghi rõ họ tên)
CÁN BỘ CHẤM 2
(Ký và ghi rõ họ tên)
Trang 3MỤC LỤC
Bảng phân công công việc 6
I LỜI NÓI ĐẦU 7
II LÝ THUYẾT 8
Chương 1 : Một số khái niệm cơ bản về cấu trúc dữ liệu và giải thuật 8
1.1 Giải thuật 8
1.2 Quan hệ giữa giải thuật và cấu trúc dữ liệu 8
1.3 Vị trí cấu trức dữ liệu trong một áp dụng tin học 8
1.4 Tìm hiểu một số cấu trúc dữ liệu cơ bản 9
1.5 Tổ chức các cấu trúc dữ liệu 10
Chương 2 : Danh sách đặc 12
Chương 3 : Danh sách liên kết 17
3.1 Vấn đề 17
3.2 Khái niệm về biến con trỏ 18
3.3 Danh sách liên kết đơn 19
3.2.3 Tìm và in danh sách cán bộ theo hệ số lương và phòng ban 28
3.2.4 Sắp xếp danh sách cán bộ theo thứ tự của tên 29
3.2.5 In danh sách hệ số lương 29
3.3 Lưu đồ thuật toán 30
5
Trang 4Thành viênCông việc
Hoàng Trọng Giáp
1.Làm báo cáo bài tập lớn2.Tìm và in danh sách cán bộ theo hệ số lương và phòng ban
3.Sắp xếp danh sách cán bộ theothứ tự của tên.
4.In danh sách hệ số lương, biết rằng các hệ số lương trùng nhau sẽ chỉhiển thị 1 lần.
5.Hàm menu()
Cao Xuân Trường
1.Khai báo danh sách cán bộ2.Tạo danh sách cán bộ3.Hiển thị danh sách cán bộ
2.In danh sách cán bộ theo chứcvụ
Bảng phân công công việc
Trang 5I LỜI NÓI ĐẦU
Cấu trúc dữ liệu và giải thuật (Data Structure and Algorithm) là một môn học cơ sở trongchương trình đào tạo sinh viên chuyên ngành Hệ thống thông tin quản lý và CNTT của trườngĐại học Công nghệ Đông Á Mục đích của môn học là trang bị cho sinh viên những kiến thứccơ bản về cấu trúc dữ liệu khi thiết kế và cài đặt các phần mềm
7
Trang 61.2 Quan hệ giữa giải thuật và cấu trúc dữ liệu
chọn, sẽ có những giải thuật tương ứng, phù hợp Khi cấu trúc dữ liệu thay đổi thường giảithuật cũng phải thay đổi theo để tránh việc xử lý gượng ép, thiếu tự nhiên trên một cấu trúckhông phù hợp Hơn nữa, một cấu trúc dữ liệu tốt sẽ giúp giải thuật xử lý trên đó có thể pháthuy tác dụng tốt hơn, vừa nhanh vừa tiết kiêm vật tư, giải thuật cũng đơn giản và dễ hiểu hơn
1.3 Vị trí cấu trức dữ liệu trong một áp dụng tin học
Cấu trúc dữ liệu thường được đặt ở lớp dữ liệu của ứng dụng Lớp dữ liệu chịu trách nhiệm lưu trữ và truy cập dữ liệu Cấu trúc dữ liệu xác định cách dữ liệu được lưu trữ trong bộ nhớ máy tính.
Cấu trúc dữ liệu cũng có thể được đặt ở lớp trình điều khiển Lớp trình điều khiển chịu trách nhiệm truy cập dữ liệu từ các nguồn bên ngoài, chẳng hạn như cơ sở
Cấu trúc dữ liệu + Gỉai thuật = Chươngtrình
Trang 7dữ liệu hoặc tệp Cấu trúc dữ liệu xác định cách dữ liệu được lưu trữ và truy cập từ các nguồn bên ngoài.
1.4 Tìm hiểu một số cấu trúc dữ liệu cơ bản
Cấu trúc dữ liệu là một cách thức để lưu trữ và tổ chức dữ liệu trong bộ nhớ máy tính Cấu trúc dữ liệu tốt sẽ giúp ứng dụng hoạt động hiệu quả và hiệu quả hơn.
Dưới đây là một số cấu trúc dữ liệu cơ bản:
Mảng là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được lưu trữ theo một thứ tự liên tiếp trong bộ nhớ Mảng có thể được truy cập bằng cách sử dụng chỉ số.
Danh sách liên kết
Danh sách liên kết là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được liên kết với nhau bằng các con trỏ Danh sách liên kết có thể được thêm hoặc xóa các phần tử một cách dễ dàng.
Ngăn xếp
Ngăn xếp là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được thêm và xóa theo thứ tự LIFO (Last In First Out).
9
Trang 9Cấu trúc dữ liệu tuyến tính là các cấu trúc dữ liệu trong đó các phần tử được lưu trữ theo một thứ tự tuyến tính Ví dụ về cấu trúc dữ liệu tuyến tính bao gồm mảng,danh sách và ngăn xếp.
Cấu trúc dữ liệu phi tuyến tính
Cấu trúc dữ liệu phi tuyến tính là các cấu trúc dữ liệu trong đó các phần tử không được lưu trữ theo một thứ tự tuyến tính Ví dụ về cấu trúc dữ liệu phi tuyến tínhbao gồm cây và đồ thị.
1.6 Lựa chọn cấu trúc dữ liệu
Khi lựa chọn cấu trúc dữ liệu cho một ứng dụng, cần xem xét các yếu tố sau:
Kiểu dữ liệu cần lưu trữ
Số lượng dữ liệu cần lưu trữ
Các truy vấn dữ liệu cần được thực hiện
Hiệu suất và khả năng mở rộng cần thiết
Việc lựa chọn cấu trúc dữ liệu phù hợp sẽ giúp ứng dụng hoạt động hiệu quả vàhiệu quả hơn.
1.7 Ứng dụng của các cấu trúc dữ liệu
Các cấu trúc dữ liệu được sử dụng trong tất cả các loại ứng dụng tin học Ví dụ,mảng được sử dụng để lưu trữ dữ liệu số, danh sách được sử dụng để lưu trữ danh sách các mục, và cây được sử dụng để lưu trữ dữ liệu có cấu trúc.
Dưới đây là một số ứng dụng cụ thể của các cấu trúc dữ liệu:
o Lưu trữ dữ liệu số
o Lưu trữ dữ liệu văn bản
o Lưu trữ dữ liệu nhị phân
Danh sách liên kết
o Thêm hoặc xóa các phần tử một cách dễ dàng11
Trang 10o Duyệt các phần tử theo thứ tự ngược lại
Ngăn xếp
o Lưu trữ dữ liệu theo thứ tự LIFO
o Thực hiện các phép toán như đảo ngược một chuỗi
Hàng đợi
o Lưu trữ dữ liệu theo thứ tự FIFO
o Thực hiện các phép toán như tìm kiếm dữ liệu nhanh chóng
o Lưu trữ dữ liệu có cấu trúc
o Tìm kiếm dữ liệu nhanh chóng
Chương 2 : Danh sách đặc2.1 Tổ chức vật lý và logic
Trang 11o Định dạng: Các phần tử được lưu trữ liên tiếp trong bộ nhớ.
o Vị trí: Mảng được lưu trữ trong bộ nhớ chính.
o Thứ tự: Các phần tử được lưu trữ theo thứ tự liên tiếp.
o Kiểu dữ liệu: Kiểu dữ liệu của các phần tử trong mảng.
o Kích thước phần tử: Kích thước của mỗi phần tử trong mảng.
o Khoảng cách: Các phần tử được lưu trữ cách nhau một khoảng cách bằng
kích thước của mỗi phần tử.
o Mối quan hệ: Các phần tử trong mảng không có mối quan hệ với nhau.
Danh sách liên kết
o Kích thước: Số phần tử trong danh sách liên kết.
o Định dạng: Các phần tử được liên kết với nhau bằng các con trỏ.
o Vị trí: Danh sách liên kết có thể được lưu trữ trong bộ nhớ chính hoặc bộ nhớ
o Thứ tự: Các phần tử có thể được lưu trữ theo thứ tự hoặc không theo thứ tự.
o Kiểu dữ liệu: Kiểu dữ liệu của các phần tử trong danh sách liên kết.
o Kích thước phần tử: Kích thước của mỗi phần tử trong danh sách liên kết.
o Khoảng cách: Khoảng cách giữa các phần tử là không xác định.
o Mối quan hệ: Các phần tử trong danh sách liên kết có thể có mối quan hệ với
2.2 Các thao tác cập nhật trên danh sách đặc
13
Trang 12Danh sách đặc trưng là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được lưu trữ theo thứ tự liên tiếp trong bộ nhớ Danh sách đặc trưng có thể được cập nhật bằng cách sử dụng các thao tác sau:
push_back(): Thêm phần tử vào cuối danh sách.
insert(): Thêm phần tử vào một vị trí cụ thể trong danh sách.
Xóa phần tử
Thao tác xóa phần tử khỏi danh sách đặc trưng có thể được thực hiện bằng cách sử dụng các phương thức sau:
pop_back(): Xóa phần tử cuối cùng trong danh sách.
erase(): Xóa phần tử tại một vị trí cụ thể trong danh sách.
#include <iostream>#include <list>
using namespace std;int main() {
// Tạo một danh sách đặc trưng
list<int> list_numbers = {1, 2, 3, 4, 5};
// Thêm phần tử vào cuối danh sách
1 10 4 5
Trang 13
2.3 Tìm kiếm
Tìm kiếm tuyến tính: Tìm kiếm tất cả các phần tử trong danh sách cho đến khi tìm
thấy phần tử có giá trị cụ thể.
Tìm kiếm nhị phân: Tìm kiếm phần tử có giá trị cụ thể bằng cách chia danh sách
thành hai nửa và tiếp tục tìm kiếm trong nửa có chứa phần tử có giá trị cụ thể.
2.4 Sắp xếp trong
Sắp xếp trong danh sách đặc trưng là một thao tác sắp xếp các phần tử trong danh sách theo một thứ tự cụ thể Có nhiều thuật toán sắp xếp khác nhau có thể được sử dụng cho danh sách đặc trưng, bao gồm:
Sắp xếp chèn: Sắp xếp các phần tử bằng cách chèn từng phần tử vào vị trí thích hợp
trong danh sách đã được sắp xếp.
Sắp xếp chọn: Sắp xếp các phần tử bằng cách chọn phần tử nhỏ nhất trong danh sách
và chèn nó vào vị trí thích hợp trong danh sách đã được sắp xếp.
Sắp xếp nổi bọt: Sắp xếp các phần tử bằng cách so sánh các phần tử liền kề và hoán
đổi vị trí của chúng nếu chúng không được sắp xếp theo thứ tự.
Sắp xếp nhanh: Sắp xếp các phần tử bằng cách chia danh sách thành hai nửa và tiếp
tục sắp xếp các nửa đó cho đến khi đạt được kết quả mong muốn.
2.5 Các thuật toán sắp xếp ngoài
Sắp xếp ngoài là một loại sắp xếp dữ liệu trong đó dữ liệu được lưu trữ trên một thiết bị lưu trữ ngoài, chẳng hạn như đĩa cứng hoặc SSD Các giải thuật sắp xếp ngoài phải giải quyết các vấn đề sau:
Cách đọc dữ liệu từ thiết bị lưu trữ ngoài: Các giải thuật sắp xếp ngoài phải đọc dữ
liệu từ thiết bị lưu trữ ngoài theo một cách hiệu quả.
Cách lưu trữ dữ liệu đã sắp xếp: Các giải thuật sắp xếp ngoài phải lưu trữ dữ liệu đã
sắp xếp trên thiết bị lưu trữ ngoài một cách hiệu quả.
Các giải thuật sắp xếp ngoài phổ biến
Sắp xếp bán ngoài: Sắp xếp bán ngoài là một giải thuật sắp xếp trong đó dữ liệu
được lưu trữ trên bộ nhớ chính và thiết bị lưu trữ ngoài.
Sắp xếp ngoài hoàn toàn: Sắp xếp ngoài hoàn toàn là một giải thuật sắp xếp trong đó
dữ liệu được lưu trữ hoàn toàn trên thiết bị lưu trữ ngoài.15
Trang 14Sắp xếp bán ngoài
Sắp xếp bán ngoài là một giải thuật sắp xếp trong đó dữ liệu được lưu trữ trên bộ nhớ chính và thiết bị lưu trữ ngoài Các giải thuật sắp xếp bán ngoài thường được sử dụng cho các danh sách lớn, trong đó dữ liệu không thể được lưu trữ hết trong bộ nhớ chính.
Một số giải thuật sắp xếp bán ngoài phổ biến bao gồm:
Sắp xếp merge: Sắp xếp merge là một giải thuật sắp xếp bán ngoài trong đó dữ liệu
được chia thành các phần nhỏ và sau đó được sắp xếp theo từng phần.
Sắp xếp quicksort: Sắp xếp quicksort là một giải thuật sắp xếp bán ngoài trong đó dữ
liệu được chia thành các phần nhỏ và sau đó được sắp xếp theo từng phần.
Sắp xếp heapsort: Sắp xếp heapsort là một giải thuật sắp xếp bán ngoài trong đó dữ
liệu được lưu trữ trong một heap và sau đó được sắp xếp bằng cách sử dụng các phép toán heapify.
Sắp xếp ngoài hoàn toàn
Sắp xếp ngoài hoàn toàn là một giải thuật sắp xếp trong đó dữ liệu được lưu trữhoàn toàn trên thiết bị lưu trữ ngoài Các giải thuật sắp xếp ngoài hoàn toàn thường được sử dụng cho các danh sách rất lớn, trong đó dữ liệu không thể được lưu trữ hết trong bộ nhớ chính.
Một số giải thuật sắp xếp ngoài hoàn toàn phổ biến bao gồm:
Sắp xếp bucket: Sắp xếp bucket là một giải thuật sắp xếp ngoài hoàn toàn trong đó
dữ liệu được chia thành các nhóm dựa trên giá trị của nó.
Sắp xếp phân đoạn: Sắp xếp phân đoạn là một giải thuật sắp xếp ngoài hoàn toàn
trong đó dữ liệu được chia thành các phân đoạn nhỏ và sau đó được sắp xếp theo từng phân đoạn.
Sắp xếp chèn: Sắp xếp chèn là một giải thuật sắp xếp ngoài hoàn toàn trong đó dữ
liệu được sắp xếp bằng cách chèn từng phần tử vào vị trí thích hợp trong danh sách đã được sắp xếp.
So sánh các giải thuật sắp xếp ngoài
Các giải thuật sắp xếp ngoài có thể được so sánh dựa trên các tiêu chí sau:
Trang 15 Kích thước dữ liệu: Các giải thuật sắp xếp ngoài hoàn toàn có thể được sử dụng cho
các danh sách rất lớn, trong khi các giải thuật sắp xếp bán ngoài chỉ có thể được sử dụng cho các danh sách lớn.
Yêu cầu bộ nhớ: Các giải thuật sắp xếp bán ngoài yêu cầu bộ nhớ chính để lưu trữ dữ
liệu đang được sắp xếp, trong khi các giải thuật sắp xếp ngoài hoàn toàn không yêu cầu bộ nhớ chính.
Thời gian chạy: Thời gian chạy của các giải thuật sắp xếp ngoài phụ thuộc vào kích
thước của danh sách và thuật toán được sử dụng.
Hiệu quả: Hiệu quả của các giải thuật sắp xếp ngoài phụ thuộc vào kích thước của
danh sách và thuật toán được sử dụng.
2.6 Tổng kết danh sách đặc ưu , khuyết
Ưu điểm
Thêm và xóa phần tử nhanh chóng: Các phần tử có thể được thêm và xóa khỏi danh
sách đặc trưng một cách nhanh chóng và hiệu quả.
Dễ dàng truy cập các phần tử: Các phần tử trong danh sách đặc trưng có thể được
truy cập bằng cách sử dụng chỉ số.
Dễ dàng cập nhật các phần tử: Các phần tử trong danh sách đặc trưng có thể được
cập nhật một cách dễ dàng.
Nhược điểm
Sử dụng nhiều bộ nhớ: Danh sách đặc trưng sử dụng nhiều bộ nhớ hơn các cấu trúc
dữ liệu tuyến tính khác, chẳng hạn như mảng.
Không hiệu quả cho các thao tác tìm kiếm: Các thao tác tìm kiếm trong danh sách
đặc trưng có thể không hiệu quả nếu danh sách lớn.
Tổng kết
Danh sách đặc trưng là một cấu trúc dữ liệu linh hoạt và hiệu quả có thể được sử dụng cho nhiều ứng dụng Tuy nhiên, cần lưu ý các ưu điểm và nhược điểm của danh sách đặc trưng để lựa chọn cấu trúc dữ liệu
Chương 3 : Danh sách liên kết3.1 Vấn đề
Danh sách liên kết là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được liên kết với nhau bằng các con trỏ Danh sách liên kết có thể được sử dụng để lưu trữ
17
Trang 16các danh sách có thể thay đổi kích thước, chẳng hạn như danh sách các mục tiêu cần hoàn thành hoặc danh sách các tệp cần xử lý.
Danh sách liên kết có một số vấn đề cần lưu ý, bao gồm:
Tốn bộ nhớ
Khả năng truy cập ngẫu nhiên kém
Khả năng thay đổi kích thước kém
Một số giải pháp cho các vấn đề của danh sách liên kết
Sử dụng danh sách liên kết 2 chiều
Sử dụng cấu trúc dữ liệu khác
Kết luận
Danh sách liên kết là một cấu trúc dữ liệu linh hoạt và hiệu quả có thể được sử dụng cho nhiều ứng dụng Tuy nhiên, cần lưu ý các vấn đề của danh sách liên kết để lựa chọn cấu trúc dữ liệu phù hợp với ứng dụng cụ thể.
3.2 Khái niệm về biến con trỏ
Biến con trỏ là một biến có thể lưu trữ địa chỉ của một biến khác Biến con trỏ thường được sử dụng để truy cập các biến hoặc dữ liệu nằm ở vị trí khác trong bộ nhớ.
Khai báo biến con trỏ
int* p; // Biến p trỏ đến một biến int
double* q; // Biến q trỏ đến một biến double
Gán giá trị cho biến con trỏ
int x = 10;
int* p = &x; // Gán địa chỉ của biến x cho biến p
Truy cập giá trị của biến được trỏ đến
Trang 17int x = 10;
int* p = &x;
cout << *p; // In giá trị của biến x
//Chuyển đổi giá trị của biến con trỏ
int x = 10;
int* p = &x;
int y = *p; // Chuyển đổi giá trị của biến p thành biến y
3.3 Danh sách liên kết đơn
Danh sách liên kết đơn là một cấu trúc dữ liệu tuyến tính trong đó các phần tử được liên kết với nhau bằng các con trỏ Mỗi phần tử trong danh sách liên kết đơn chỉ có một con trỏ trỏ đến phần tử tiếp theo trong danh sách.
Cấu trúc dữ liệu của danh sách liên kết đơn
struct Node {
int data; // Giá trị của phần tử
Node* next; // Con trỏ trỏ đến phần tử tiếp theo};
Các thao tác trên danh sách liên kết đơn
Tạo danh sách liên kết đơn
Thêm phần tử vào danh sách liên kết đơn
Xóa phần tử khỏi danh sách liên kết đơn
Tìm kiếm phần tử trong danh sách liên kết đơn
Duy trì danh sách liên kết đơnKhởi tạo danh sách liên kết đơn
19
Trang 18void CreateList(List &I){I.pHead=NULL;
Ví dụ về danh sách liên kết đơn
// Tạo danh sách liên kết đơn Node* head = new Node();
Node* iter = head;while (iter != nullptr) { cout << iter->data << " ";
iter = iter->next;}
Đoạn mã trên sẽ in ra kết quả sau:1 2 3 4 5
Ưu điểm và nhược điểm của danh sách liên kết đơnƯu điểm:
Trang 19 Khả năng thay đổi kích thước hiệu quả: Các phần tử có thể được thêm hoặc xóa khỏi danh sách liên kết đơn mà không cần thay đổi kích thước của danh sách.
Không cần cấp phát bộ nhớ liên tục: Mỗi phần tử trong danh sách liên kết đơn có thể được cấp phát ở bất kỳ vị trí nào trong bộ nhớ.
int data; // Giá trị của phần tử
Node* next; // Con trỏ trỏ đến phần tử tiếp theo};
Trong danh sách liên kết vòng, con trỏ next của phần tử cuối cùng trỏ đến phần tử đầu tiên Điều này tạo thành một vòng, với phần tử đầu tiên là phần tử cuối cùng và ngược lại.
Các thao tác trên danh sách liên kết vòng
21