Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 43

BỘ TÀI CHÍNH

TRƯỜNG ĐẠI HỌC TÀI CHÍNH – MARKETING

KHOA CÔNG NGHỆ THÔNG TIN




ĐỒ ÁN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Đề tài:

XÂY DỰNG PHẦN MỀM QUẢN LÝ GIAO HÀNG

GVHD: Th.S Nguyễn Huy Khang

SVTH: Nguyễn Ngọc Hân

MSSV: 2221004168

Lớp: 22DHT02
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Tp.HCM, tháng 3 năm 2023

MỤC LỤC
CHƯƠNG 1: GIỚI THIỆU.................................................................................................4
1.1 Giới thiệu đề bài....................................................................................................4
1.2 Cấu trúc.................................................................................................................4
1.3 Dữ liệu mẫu ( >= 10 đối tượng cần quản lý)..........................................................5
1.4 Các chức năng sẽ thực hiện...................................................................................5
CHƯƠNG 2: TÌM KIẾM VÀ SẮP XẾP TRÊN MẢNG CẤU TRÚC...............................7
2.1 Nhập danh sách GIAO HÀNG..............................................................................7
a) Chương trình con...................................................................................................7
b) Kết quả chạy..........................................................................................................8
2.2 Xuất danh sách giao hàng......................................................................................8
a) Chương trình con...................................................................................................8
b) Kết quả chạy..........................................................................................................9
2.3 Tìm kiếm...............................................................................................................9
2.3.1 Linear Search.....................................................................................................9
a) Chương trình con...................................................................................................9
b) Kết quả chạy..........................................................................................................9
2.3.2 Linear Search bằng lính canh...........................................................................10
a) Chương trình con.................................................................................................10
c) Kết quả chạy........................................................................................................11
2.3.3 Binary Search...................................................................................................11
a) Chương trình con.................................................................................................11
c) Kết quả chạy........................................................................................................12
2.4 Sắp xếp................................................................................................................12
2.4.1 Selection Sort...................................................................................................14
a) Chương trình con................................................................................................14
b) Kết quả chạy........................................................................................................14
2.4.2 Interchange Sort...............................................................................................15

Trang 1
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

a) Chương trình con.................................................................................................15


b) Kết quả chạy........................................................................................................15
2.4.3 Bubble Sort Từ Cuối........................................................................................15
a) Chương trình con.................................................................................................16
b) Kết quả chạy........................................................................................................16
2.4.4 Bubble Sort Từ Đầu.........................................................................................17
a) Chương trình con.................................................................................................17
b) Kết quả chạy........................................................................................................17
2.4.6 Shaker Sort.......................................................................................................18
a) Chương trình con.................................................................................................18
b) Kết quả chạy........................................................................................................18
2.4.7 Insertion Sort....................................................................................................19
a) Chương trình con.................................................................................................19
b) Kết quả chạy........................................................................................................19

Trang 2
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

DANH MỤC HÌNH ẢNH

Trang 3
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

CHƯƠNG 1: GIỚI THIỆU


1.1 Giới thiệu đề bài
Xây dựng chức năng tìm kiếm và sắp xếp các cấu trúc hỗ trợ quản lý thông tin giao hàng
bao gồm: Mã đơn hàng (MaDH), Tên nhân viên giao hàng (NVGH), Ngày giao hàng
(NgayGiao), Trọng lượng gói hàng (TrongLuong), Tiền sẽ nhận (Tien).
1.2 Cấu trúc
(mô tả cấu trúc được yêu cầu, chọn CTDL để thể hiện, khai báo/ định nghĩa cấu trúc)

Thông tin giao hàng cần quản lý gồm:


- MaDH: Mã đơn hàng, gồm một chuỗi ký tự số có chiều dài 10 ký tự
- NVGH: Tên nhân viên giao hàng, gồm một chuỗi ký tự chữ Việt có chiều dài dưới
50 ký tự
- NgayGiao: Ngày giao hàng, gồm một chuỗi ký tự số có chiều dài 6 ký tự được thể
hiện dạng ddmmyy, ví dụ 160204 nghĩa là ngày giao 16/02/2004
- TrongLuong: Trọng lượng gói hàng, gồm một chuỗi ký tự số
- Tien: Tiền sẽ nhận

Cấu trúc dữ liệu hỗ trợ quản lý thông tin giao hàng:


- MaDH: chuỗi gồm 10 ký tự số
- NVGH: chuỗi tối đa 30 ký tự
- NgayGiao: chuỗi tối đa 8 ký tự
- TrongLuong: chuỗi tối đa 10 ký tự
- Tien: chuỗi tối gồm các ký tự số

Trang 4
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Định nghĩa cấu trúc giao hàng:

struct giaohang {
int madh;
char nvgh[50];
int ngaygiao;
int trongluong;
int tien;
};

1.3 Dữ liệu mẫu ( >= 10 đối tượng cần quản lý)

STT MaDH Tên NVGH Ngày giao Trọng lượng Tiền

1 111 Bùi Thị Thu Hà 10/01/2023 25g 1,200,000

2 112 Đặng Thanh Mai 03/07/2023 500mg 2,500,000

3 113 Hoàng Anh Tuấn 22/02/2023 1kg 3,800,000

4 114 Lê Văn Thiện 15/06/2023 75g 5,000

5 115 Mai Thanh Thúy 11/11/2023 2.5kg 200,000

6 116 Ngô Đức Khoan 29/04/2023 125mg 500,000

7 117 Nguyễn Thanh Huyền 01/09/2023 3.2kg 9,000

8 118 Phạm Thị Ngọc Trâm 18/12/2023 450g 10,500

9 119 Trần Minh Quân 24/08/2023 8.7kg 12,000,000

10 120 Vũ Minh Hiếu 06/05/2023 150g 14,000

1.4

Trang 5
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

1.5 Các chức năng sẽ thực hiện


Các chức năng trên mảng cấu trúc
- Nhập danh sách giao hàng
- Xuất danh sách giao hàng
- Tìm thông tin Đơn hàng theo MaDH x (dùng Linear Search và Binary Search)
- Tìm thông tin Đơn hàng theo tên (dùng Linear Search và Binary Search)
- Sắp xếp danh sách theo MaDH (dùng Shaker Sort)
- Sắp xếp danh sách theo MaDH(dùng Selection Sort)
- Sắp xếp danh sách theo NVGH (dùng Interchange Sort)
- Sắp xếp danh sách theo NgayGiao (dùng Bubble Sort)
- Sắp xếp danh sách theo TrongLuong (dùng Insertion Sort)
- Sắp xếp danh sách theo Tien (dùng Quick Sort)

Các chức năng trên danh sách liên kết


- Nhập danh sách giao hàng
- Xuất danh sách giao hàng
- Tìm thông tin Đơn hàng theo MaDH x (dùng Linear Search và Binary Search)
- Tìm thông tin Đơn hàng theo tên (dùng Linear Search và Binary Search)
- Sắp xếp danh sách theo MaDH (dùng Shaker Sort)
- Sắp xếp danh sách theo MaDH(dùng Selection Sort)
- Sắp xếp danh sách theo NVGH (dùng Interchange Sort)
- Sắp xếp danh sách theo NgayGiao (dùng Bubble Sort)
- Sắp xếp danh sách theo TrongLuong (dùng Insertion Sort)
- Sắp xếp danh sách theo Tien (dùng Quick Sort)

Trang 6
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

CHƯƠNG 2: TÌM KIẾM VÀ SẮP XẾP TRÊN MẢNG CẤU


TRÚC
2
2.1 Nhập danh sách GIAO HÀNG
a) Chương trình con

Nhập 1 ô GIAO HÀNG: gồm mã đơn hàng, tên nhân viên giao hàng, ngày
void nhap_o(giaohang& a) {
cout << "\n\nNhap ma don hang: ";
cin >> a.madh;
cout << "\nNhap ho ten nhan vien giao hang: ";
cin.ignore();
cin.getline(a.nvgh, 50);
cout << "\nNhap ngay giao (theo dinh dang ddmmyy): ";
cin >> a.ngaygiao;
cout << "\nNhap trong luong don hang: ";
cin >> a.trongluong;
cout << "\nNhap so tien: ";
cin >> a.tien;
}
giao, trọng lượng và số tiền

Nhập danh sách GIAO HÀNG

void nhap_DS(giaohang ds[], int &n, int nthem) {


for (int i = n; i < (n + nthem); i++) {
nhap_o(ds[i]);
}
n = n + nthem;
}

Trang 7
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

b) Kết quả chạy

2.2 Xuất danh sách giao hàng


a) Chương trình con

Xuất 1 ô

void xuat_o(giaohang a) {
cout << "\nThong tin don hang: ";
cout << "MDH: " << a.madh << ", HO&TEN_NVGH: " << a.nvgh << ",
NgayGiao: " << a.ngaygiao / 10000 << "/" << (a.ngaygiao % 10000) / 100 << "/" <<
(a.ngaygiao % 10000) % 100 << ", Trong luong: " << a.trongluong << ", So tien: " <<
a.tien << endl;
}

Trang 8
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Xuất danh sách GIAO HÀNG

void xuat_DS(giaohang ds[], int n) {


for (int i = 0; i < n; i++) {
xuat_o(ds[i]);
}
}

b) Kết quả chạy

2.3 Tìm kiếm


Sử dụng các chức năng tìm kiếm sau đây:
- Linear Search
- Linear Search bằng lính canh
- Binary Search
1
2
2.1
2.2
2.3
2.3.1 Linear Search
a) Chương trình con

int TimKiem(giaohang ds[], int n, int x) {


int i = 0;
while (ds[i].madh != x && i < n) {
i++;
}
if (i == n)
return -1;
return i;
}
Trang 9
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

b)

Trang 10
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

c) Kết quả chạy

2.3.2 Linear Search bằng lính canh


a) Chương trình con

int TimKiem_LinhCanh(giaohang ds[], int n, int x) {


int i = 0;
ds[n].madh = x;
while (ds[i].madh != x) {
i++;
}
if (i == n)
return -1;//ko tìm thấy
return i;
}

b)

Trang 11
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

c) Kết quả chạy

2.3.3 Binary Search


a) Chương trình con

int BinarySearch(giaohang ds[], int n, int x) {


int left = 0; int right = n - 1;
int mid = (left + right) / 2;
while (left <= right && ds[mid].madh != x) {
if (x < ds[mid].madh)
right = mid - 1;
else
left = mid + 1;
mid = (left + right) / 2;
}
if (left > right)
return -1;
return mid;
}

b)

Trang 12
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

c) Kết quả chạy

2.4 Sắp xếp


Sắp xếp có thể dùng :
- Selection Sort
- Interchange Sort
- Bubble Sort từ cuối mảng
- Bubble Sort từ đầu mảng
- Shaker Sort
- Insertion Sort

Trang 13
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Danh sách nhập tự động

void auto_input(giaohang ds[], int& n) {


n = 10;
ds[0] = { 111, "Bui Thi Thu Ha", 100123, 25, 1200000 };
ds[1] = { 115, "Mai Thanh Thuy", 111123, 25, 200000 };
ds[2] = { 112, "Dang Thanh Mai", 030723, 500, 2500000 };
ds[3] = { 114, "Le Van Thien", 150623, 75, 5000 };
ds[4] = { 113, "Hoang Anh Tuan", 220223, 1, 3800000 };
ds[5] = { 120, "Vu Minh Hieu", 060523, 150, 14000 };
ds[6] = { 116, "Ngo Duc Khoan", 290423, 125, 500000 };
ds[7] = { 119, "Tran Minh Quan", 240823, 87, 12000000 };
ds[8] = { 117, "Nguyen Thanh Huyen", 110923, 32, 9000 };
ds[9] = { 118, "Phan Thi Ngoc Tram", 181223, 450, 10500 };

Xuất danh sách nhập tự động


-

Trang 14
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.1 Selection Sort


a) Chương trình con

void SelectionSort(giaohang ds[], int n) {


int min;
for (int i = 0; i < n - 1; i++) {
min = i;
for (int j = i + 1; j < n; j++) {
if (ds[j].madh < ds[min].madh)
min = j;
}
swap(ds[i], ds[min]);
}
}

b) Kết quả chạy

Trang 15
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.2 Interchange Sort


a) Chương trình con

void InterchangeSort(giaohang ds[], int n) {


for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (ds[i].madh > ds[j].madh)
swap(ds[i], ds[j]);
}
}
}

b) Kết quả chạy

Trang 16
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.3

Trang 17
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.4 Bubble Sort Từ Cuối


a) Chương trình con

void BubbleSortTuCuoi(giaohang ds[], int n) {


for (int i = 0; i < n - 1; i++) {
for (int j = n - 1; j > i; j--) {
if (ds[j - 1].madh > ds[j].madh)
swap(ds[j], ds[j - 1]);
}
}
}

b) Kết quả chạy

Trang 18
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.5 Bubble Sort Từ Đầu


a) Chương trình con

void BubbleSortTuDau(giaohang ds[], int n) {


for (int i = n - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (ds[j].madh < ds[j + 1].madh)
swap(ds[j], ds[j + 1]);
}
}
}

b) Kết quả chạy

2.4.6

Trang 19
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.7 Shaker Sort


a) Chương trình con

void ShakerSort(giaohang ds[], int n) {


int left = 0;
int right = n - 1;
int k = n - 1;
while (left < right) {
for (int i = right; i > left; i--)
if (ds[i - 1].madh > ds[i].madh) {
swap(ds[i - 1], ds[i]);
k = i;
}
left = k;
for (int j = left; j < right; j++)
if (ds[j].madh > ds[j + 1].madh) {
swap(ds[j], ds[j + 1]);
k = j;
}
right = k;
}
}

b) Kết quả chạy

Trang 20
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.8

Trang 21
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.9 Insertion Sort


a) Chương trình con
void InsertionSort(giaohang ds[], int n) {
int pos;
int x;
for (int i = 1; i < n; i++) {
x = ds[i].madh; pos = i - 1;
while ((pos >= 0) && ds[pos].madh > x) {
ds[pos + 1].madh = ds[pos].madh;// dời trước
pos--;
}
ds[pos + 1].madh = x;
}
}

b) Kết quả chạy

2.4.10

Trang 22
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

2.4.11 Quick sort


a) Chương trình con

void QuickSort(giaohang ds[], int left, int right) {


int i = left;
int j = right;
int x = ds[(left + right) / 2].madh;
do {
while (ds[i].madh < x) i++;
while (ds[j].madh > x) j--;
if (i <= j)
swap(ds[i], ds[j]); i++; j--;
} while (i < j);
if (left < j) QuickSort(ds, left, j);
if (i < right) QuickSort(ds, i, right);
}

b)

Trang 23
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

c) Kết quả chạy

Trang 24
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

CHƯƠNG 3: TÌM KIẾM VÀ SẮP XẾP TRÊN

DANH SÁCH LIÊN KẾT


1
2
3
3.1 Định nghĩa danh sách liên kết
Cách cài đặt danh sách liên kết gồm các bước:
- Định nghĩa phần thông tin
- Định nghĩa nút
- Định nghĩa DSLK
3.1.1 Định nghĩa phần thông tin

struct giaohang {
int madh;
char nvgh[50];
int ngaygiao;
int trongluong;
int tien;
};
3.1.2 Định nghĩa nút
Nút là một phần tử của danh sách gồm 2 phần:
- Phần thông tin data
- Phần con trỏ pNext dùng để chỉ vào nút sau và tạo liên kết đến phần tử phía sau

struct node {
giaohang data;
node* pNext;
};

3.1.3 Định nghĩa DSLK


Một danh sách liên kết được quản lý bởi hai con trỏ:

Trang 25
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

- pHead chỉ vào con trỏ đầu


- pTail chỉ vào con trỏ sau

struct list {
node* pHead;
node* pTail;
};

3.2 Các thao tác cơ bản trên danh sách liên kết
3.2.1 Khởi tạo DSLK

Hàm sẽ gán giá trị NULL cho con trỏ pHead và pTail của list, chỉ ra rằng danh sách liên
kết hiện đang trống và không chứa bất kỳ nút nào. Hàm này được gọi một lần ở đầu
chương trình hoặc khi danh sách liên kết cần được đặt lại thành trạng thái trống.

void Init(list& l) {
l.pHead = l.pTail = NULL;
}

3.2.2 Nhập DSLK


a) Chương trình con

Bước 1: Nhập 1-ô

void nhap_o(giaohang& a) {
cout << "\n\nNhap ma don hang: ";
cin >> a.madh;
cout << "\nNhap ho va ten nhan vien giao hang: ";
cin.ignore();
cin.getline(a.nvgh, 10);
cout << "\nNhap ngay giao: ";
cin >> a.ngaygiao;
cout << "\nNhap trong luong don hang: ";
cin >> a.trongluong;
cout << "\nNhap so tien: "; Trang 26
cin >> a.tien;
}
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Bước 2: Đóng gói phần thông tin kèm theo con trỏ để tạo Node

node* MakeNode(giaohang x) {
node* p = new node;
if (p == NULL) return NULL;
p->data = x;
p->pNext = NULL;
return p;
}

Bước 3: Thêm Node vào DSLK

 Thêm vào đầu

void AddFirst(list& l, node* p) {


if (l.pHead == NULL) {
l.pHead = l.pTail = p;
}
else {
p -> pNext = l.pHead;
l.pHead = p;
}
}

 Thêm vào cuối

void AddLast(list& l, node* p) {


if (l.pHead == NULL) {
l.pHead = l.pTail = p;
}
else {
l.pTail->pNext = p;
l.pTail = p;
}
}

Trang 27
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

Bước 4: Tạo yêu cầu nhập tiếp

void InputList(list& l) {
int n;
giaohang x;
node* p;
cout << "\nNhap so luong don hang: ";
cin >> n;
for (int i = 1; i <= n; i++) {
cout << "\nDon hang thu " << i << ": ";
nhap_o(x);
p = MakeNode(x);
AddLast(l, p);
}
}

b) Chạy kết quả

Trang 28
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.2.3 Xuất DSLK


a) Chương trình con

Xuất 1-ô

void xuat_o(giaohang a) {
cout << "\nThong tin don hang: " << endl;
cout << "MADH: " << a.madh << " HO&TEN: " << a.nvgh << " NGAY: "
<<a.ngaygiao << " TRONG LUONG: " << a.trongluong << " TIEN: " << a.tien;

In node ra màn hình

void xuat_ds(giaohang ds[], int n) {


for (int i = 0; i < n; i++) {
xuat_o(ds[i]);
}
}

In danh sách ra màn hình

void OutList(list l) {
node* q = l.pHead;
cout << "\nCac phan tu trong danh sach gom: " << endl;
while (q != NULL) {
cout << "MADH: " << q->data.madh << " HO&TEN: " << q->data.nvgh
<< " NGAY: " << q->data.ngaygiao << " TRONG LUONG: " << q->data.trongluong
<< " TIEN: " << q->data.tien << endl;
q = q->pNext;
}
system("pause");
}

Trang 29
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

b) Chạy kết quả

3.3

Trang 30
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.4 AutoInput
a) Chương trình con

void AutoInput(list &l) {


giaohang ds[10];
node* p;
ds[0] = { 111, "Bui Thi Thu Ha", 100123, 25, 1200000 };
ds[1] = { 115, "Mai Thanh Thuy", 111123, 25, 200000 };
ds[2] = { 112, "Dang Thanh Mai", 030723, 500, 2500000 };
ds[3] = { 114, "Le Van Thien", 150623, 75, 5000 };
ds[4] = { 113, "Hoang Anh Tuan", 220223, 1, 3800000 };
ds[5] = { 120, "Vu Minh Hieu", 060523, 150, 14000 };
ds[6] = { 116, "Ngo Duc Khoan", 290423, 125, 500000 };
ds[7] = { 119, "Tran Minh Quan", 240823, 87, 12000000 };
ds[8] = { 117, "Nguyen Thanh Huyen", 110923, 32, 9000 };
ds[9] = { 118, "Phan Thi Ngoc Tram", 181223, 450, 10500 };
for (int i = 0; i < 10; i++) {
p = MakeNode(ds[i]);
AddLast(l, p);
}
}

b) Kết quả chạy

3.5

Trang 31
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.6 Xóa đầu và xóa theo Mã DH trong DSLK


3.6.1 Xóa đầu
a) Chương trình con

void DelFirst(list& l) {
node* p;
if (l.pHead != NULL) {
p = l.pHead;
l.pHead = l.pHead->pNext;
delete p;
if (l.pHead == NULL)
l.pTail = NULL;
}
}

b) Kết quả chạy

3.6.2

Trang 32
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.6.3 Xóa theo Mã ĐH trong DSLK


a) Chương trình con

void XoaTheoMasv(list& l, int x) {


if (l.pHead == NULL) return;
node* q;
node* r;
q = l.pHead;
r = l.pHead;
while (q != NULL && q->data.madh != x) {
r = q;
q = q->pNext;
}
if (q == NULL) {
cout << "\nKo co sv can xoa";
return;
}
if (q == l.pHead) {
l.pHead = l.pHead->pNext;
delete q;
if (l.pHead == NULL) l.pTail = NULL;
}
else if (q == l.pTail) {
l.pTail = r;
l.pTail->pNext = NULL;
delete q;
}
else {
r->pNext = q->pNext;
delete q;
}
}

b) Kết quả chạy

Trang 33
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.7 Tìm kiếm theo Mã ĐH trong DSLK


a) Chương trình con

void TimKiemTheoMa(list& l, int x) {


node* p;
p = l.pHead;
while (p != NULL && p->data.madh != x) {
p = p->pNext;
}
if (p == NULL)
cout << "\nKo tim thay";
else {
cout << "\nThong tin cua ma san pham " << x << " la:";
xuat_o(p->data);
}
}

b) Kết quả chạy

3.8 Sắp xếp trong DSLK


Sắp xếp trong DSLK đơn có thể dùng các cách sau:
- Selection Sort
- Interchange Sort
- Bubble Sort
- Insertion Sort

Trang 34
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

- Quick Sort

Trang 35
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.8.1 Selection Sort


a) Chương trình con

void SelectionSort(list& l) {
node* min;
node* q;
node* r;
if (l.pHead == NULL) return;
q = l.pHead;
while (q != NULL) {
min = q;
r = q->pNext;
while (r != NULL) {
if (r->data.madh < min->data.madh)
min = r;
r = r->pNext;
}
swap(min->data, q->data);
q = q->pNext;
}
}

b) Kết quả chạy

3.8.2

Trang 36
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.8.3 Interchange Sort


a) Chương trình con

void InterchangeSort(list& l) {
if (l.pHead == NULL) return;
node* q, * r;
q = l.pHead;
while (q != NULL) {
r = q->pNext;
if (r->data.madh < q->data.madh)
swap(r->data, q->data);
r = r->pNext;
}
q = q->pNext;
}

b) Kết quả chạy

c)

Trang 37
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.8.4 Bubble Sort


a) Chương trình con

void BubbleSort(list& l) {
if (l.pHead == NULL) return;
node* q, * r, * Tail2;
q = new node;
Tail2 = l.pTail;
while (Tail2 != l.pHead) {
r = l.pHead;
while (r != Tail2) {
q = r;
r = r->pNext;
if (q->data.madh > r->data.madh)
swap(q->data, r->data);
}
Tail2 = q;
}
}

b) Kết quả chạy

Trang 38
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.8.6 Insertion Sort


a) Chương trình con

void InsertionSort(list& l) {
if (l.pHead == NULL) return; // neu danh sach rong thi ket thuc

node* curr;
list l1;
Init(l1);
curr = l.pHead;
l.pHead = l.pHead->pNext;
curr->pNext = NULL;
AddFirst(l1, curr);
while (l.pHead != NULL) {
curr = l.pHead;
l.pHead = l.pHead->pNext;
curr->pNext = NULL;
node* q = l1.pHead;
if (curr->data.madh < q->data.madh) {
curr->pNext = q;
l1.pHead = curr;
}
else if (curr->data.madh > l1.pTail->data.madh) {
l1.pTail->pNext = curr;
l1.pTail = curr;
}
else {
while (q->pNext != NULL && q->pNext->data.madh < curr-
>data.madh) {
q = q->pNext;
}
curr->pNext = q->pNext;
q->pNext = curr;
}
}
l.pHead = l1.pHead;
l.pTail = l1.pTail;
}

Trang 39
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

b) Kết quả chạy

Trang 40
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

3.8.7 Quick Sort


a) Chương trình con

void QuickSort(list& l) {
node* flag, * q;
if (l.pHead == NULL) return;
list l1, l2;
Init(l1); Init(l2);
flag = l.pHead;
l.pHead = l.pHead->pNext;
flag->pNext = NULL;
while (l.pHead != NULL) {
q = l.pHead; l.pHead = l.pHead->pNext; q->pNext = NULL;
if (q->data.madh <= flag->data.madh)
AddFirst(l1, q);
else
AddFirst(l2, q);
}
QuickSort(l1);
QuickSort(l2);
// Noi l1 vao flag -> vao l2
if (l1.pHead == NULL) {
l.pHead = flag;
}
else {
l.pHead = l1.pHead;
l1.pTail->pNext = flag;
}
flag->pNext = l2.pHead;
// xong l.pHead chi con l.ptail
if (l2.pTail != NULL)
l.pTail = l2.pTail;
else
l.pTail = flag;
}

Trang 41
Đồ án Cấu Trúc Dữ Liệu – Giải Thuật

b) Kết quả chạy

Trang 42

You might also like