You are on page 1of 5

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN – ĐHQG.

TPHCM
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO BÀI TẬP LỚN


BINARY TREE

| Giảng viên thực hành |


Thầy Lê Tuấn Thu

| Nhóm thực hiện |


Hoàng Thị Khôn – 21120485
Chu Hải Linh – 21120496

Thành phố Hồ Chí Minh, tháng 10 năm 2022


BÁO CÁO BÀI TẬP LỚN
Đề bài: Viết chương trình lưu danh bạ số điện thoại của khách hàng sử dụng cấu trúc dữ liệu cây
nhị phân tìm kiếm. Biết rằng thông tin khách hàng gồm: họ và tên (Kiểu C string, Ex. char*
hoten), số điện thoại (kiểu C string), địa chỉ (kiểu C string),
ngày sinh (kiểu struct).
Yêu cầu:
1. Tạo cây BST để lưu danh bạ số điện thoại khách hàng.
2. Viết hàm tìm các khách hàng có cùng ngày sinh nhật.
3. Viết chương trình kiểm thử lại các hàm đã viết.
Chú ý: Mỗi khách hàng có một số điện thoại duy nhất.
Các bước thực hiện:

1. Xây dựng class Customer:


class customer{
public:
struct date{
int day;
int month;
int year;
};
char *name;
char *number;
char *address;
date birthday;

// Ham khoi tao customer


void Init_customer();
// Ham nhan mot khach hang
void Input_customer();
// Ham in mot khach hang
void Output_customer();
// Doc file mot khach hang
void readCustomer(ifstream& filein);
};

- Thông tin của khách hàng bao gồm:


 Name (họ và tên): kiểu C string;
 Number (số điện thoại): kiểu C string;
 Address (địa chỉ): kiểu C string;
 Birthday (ngày sinh) : struct bao gồm ngày, tháng, năm kiểu int
- Xây dựng các hàm xử lí thông tin khách hàng:
 void Init_customer():
o Khởi tạo vùng nhớ cho các biến kiểu C string như name, number, addres
o Khởi tạo ngày, tháng, năm sinh = 0

1
 void Input_customer(): Cho phép người dùng nhập thông tin khách hàng từ bàn phím
 void Output_customer(): Xuất thông tin khách hàng ra màn hình với các thông tin:
oHọ tên
oSố điện thoại
oĐịa chỉ
oNgày sinh: dd/mm/yyyy
 void readCustomer(ifstream& filein): Hàm đọc thông tin khách hàng từ file .txt

2. Xây dựng class BST (Binary Search Tree)


class BST{
public:
struct Node{
customer key;
Node *left, *right;

Node(customer key)
{
this->key = key;
left = nullptr;
right = nullptr;
}
};
typedef Node *link;

link root;

// Ham khoi tao cay


BST()
// Ham in cay
void print(link root);
// Ham so sanh so dien thoai cua khach hang
int compare(customer x, customer y)
// Ham them mot node vao cay
void insert(link& root, customer key)
// Ham tim gia tri nho nhat cua cay
link findMin(link root)
// Ham xoa mot node trong cay
link deleteNode(link& r, char* dataNumber)
// Ham kiem tra cung ngay sinh nhat
bool isSameDate(link r)
// Ham in ra khach hang co cung ngay sinh
void printSameDate(link r)
// Doc file vao cay
void readFile(ifstream& filein, link& r)

- Cấu trúc của một Node trong cây nhị phân:


 customer key: dữ liệu của Node là thông tin của khách hàng (họ tên, số điện
thoại, địa chỉ, ngày sinh)
 Node *left, *right: hai con trỏ trỏ đến cây con trái và cây con phải

2
- Node(customer key): khởi tạo Node mới với thông tin của khách hàng và gán hai con trỏ =
nullptr
- Xây dựng các hàm xử lí thông tin cây nhị phân:
 BST(): hàm khởi tạo cây rỗng (root=nullptr)
 void print(link root): nếu cây không phải là cây rỗng, thông tin khách hàng sẽ được ra
theo thứ tự Root – Left – Right (dùng đệ quy)
 int compare(customer x, customer y): hàm so sánh số điện thoại của khách hàng, giá trị
trả về mang kiểu int
 void insert(link& root, customer key): hàm thêm một Node mới vào cây với thông tin
khách hàng
o Nếu cây rỗng, Node mới thêm là gốc (root)
o Nếu cây khác rỗng, so sánh số điện thoại của khách hàng mới với số điện
thoại của khách hàng ở Node gốc: lớn hơn thì thêm Node mới ở phía cây
con phải, bé hơn thì thêm Node ở phía cây con trái (dùng đệ quy)
 link findMin(link root): hàm tìm Node có khóa nhỏ nhất trong cây (khóa ở đây là số
điện thoại của khách hàng)
o Node có khóa nhỏ nhất sẽ nằm bên phía cây con trái của gốc
o Duyệt đến node ngoài cùng nhất của cây con trái
o Khóa của Node có giá trị nhỏ nhất trong cây nhị phân
 link deleteNode(link& r, char* dataNumber): hàm xóa Node thông tin khách hàng với số
điện thoại cho trước
o Nếu cây rỗng: không có Node cần xóa
o Nếu cây không rỗng: Tìm Node mang thông tin khách hàng có số điện
thoại cho trước
 Trường hợp 1: Node cần xóa không có con (Node lá) => gán Node
= nullptr
 Trường hợp 2: Node cần xóa có 1 con
 Nếu Node có một cây con trái thì ta thực hiện duyệt sang
trái để cập nhật lại mối liên kết giữa Node cha và Node con
của Node cần xóa
 Nếu Node có một cây con phải thì ta thực hiện duyệt sang
phải để cập nhật lại mối liên kết giữa Node cha và Node
con của Node cần xóa.
 Sau khi cập nhật xong mối liên kết giữa Node cần xóa với
các Node con và Node cha, thì ta sẽ thực hiện xóa Node đó.
(gán Node=nullptr)
 Trường hợp 3: Node cần xóa có 2 con
 Tìm Node thế cho Node cần xóa => để đảm bảo cấu trúc:
tìm Node trái nhất (nhỏ nhất) của cây con phải.

3
 Cập nhật lại data của Node cần xóa chính là data của Node
thế. Cũng như cập nhật lại mối liên kết cho Node cha của
Node thế và Node con của Node thế.
 bool isSameDate(link r): Hàm kiểm tra khách hàng có ngày sinh trùng với ngày hôm
nay:
o Dùng hàm localtime_s(tm* Tm, const time* Time) để lấy ngày, giờ hôm
nay
o So sánh ngày và tháng sinh của khách hàng với ngày tháng của hệ thống
=> trả về giá trị true hoặc false
 void printSameDate(link r): Duyệt cây nhị phân và in ra thông tin của các khách hàng
nếu có ngày và tháng sinh trùng với ngày hôm nay (dùng hàm bool isSameDate(link r)
để kiểm tra)
 void readFile(ifstream& filein, link& r): đọc thông tin khách hàng từ file và thêm vào cây
nhị phân
* Cuối cùng là xây dựng hàm Menu cho chương trình kiểm thử, gồm các chức năng:
 Nhập dữ liệu khách hàng từ bàn phím
 Xuất danh sách khách hàng
 Thêm một khách hàng vào danh sách
 Xóa một khách hàng có số điện thoại cho trước
 Thống kê các khách hàng có cùng ngày sinh nhật là ngày hôm nay
 Đọc thông tin khách hàng từ file .txt

You might also like