/*********************************************************************************************
Xây dựng CTDL queue cài đặt bằng DSLK đơn để mô phỏng qui trình cho thuê máy ở một
phòng NET với các yêu cầu:
- Danh sách các máy trống A – Dùng kiểu queue, mỗi nút chứa số máy;
- Danh sách khách đang chờ nhận máy Q – Dùng kiểu queue, mỗi nút chứa họ tên người thuê.
- Danh sách khách đang thuê máy H - Dùng kiểu DSLK đơn, mỗi nút có họ tên khách, giờ bắt
đầu thuê máy, số máy.
- Các chức năng cần phải có:
o Đăng ký thuê máy: Còn máy trong A thì thêm khách vào H và lấy máy vừa cho thuê ra
khỏi queue A. Nếu A trống thì thêm khách vào queue Q.
o Trả máy: Thêm máy trả vào queue A, bỏ người đó khỏi danh sách thuê H.
o Phục vụ: Kiểm tra A và Q để phục vụ và cập nhật lại A, Q, H.
**********************************************************************************************/
#include<iostream>
#include<string.h>
using namespace std;
struct NodeA{
int soMay;
NodeA *sau;
};
struct QueueA{
NodeA *dau, *cuoi;
};
struct NodeQ{
char hoTen[33];
NodeQ *sau;
};
struct QueueQ{
NodeQ *dau, *cuoi;
};
struct NodeH{
char tenKhach[33];
int soMay, gio, phut;
NodeH *sau;
};
struct ListH{
NodeH *dau, *cuoi;
};
void ThemA(QueueA &A, int x)
{
NodeA *data = new NodeA[1];//cấp phát bộ nhớ cho đủ 1 phần tử
data->soMay = x;
data->sau = NULL;
if (A.cuoi == NULL)
A.cuoi = A.dau = data;
else
{
A.cuoi->sau = data;
A.cuoi = data;
}
}
void XuatA(QueueA A)
{
NodeA *data;
data = A.dau;
if (data == NULL)
cout << "Het may!";
else
{
cout << "========Danh sach may trong========" << endl;
while (data != NULL)
{
cout << data->soMay << "\t";
data = data->sau;
}
cout << endl;
/*for (data = A.dau; data != NULL; data = data->sau)
cout << data->soMay << "\t";*/
}
}
void ThemH(ListH &H, int soMay, char tenKhach[33])
{
NodeH *data = new NodeH[1];
data->soMay = soMay;
strcpy(data->tenKhach, tenKhach);
cout << "Nhap vao gio va phut: " << endl;
cin >> data->gio >> data->phut;
data->sau = NULL;
if (H.dau == NULL)
H.dau = H.cuoi = data;
else
{
H.cuoi->sau = data;
H.cuoi = data;
}
cout << "Khach " << data->tenKhach << " thue may thanh cong!" << endl;;
}
void ThemQ(QueueQ &Q)
{
NodeQ *data = new NodeQ[1];
cout << "Nhap ten cua khach: " << endl;
cin.ignore(1);
cin.getline(data->hoTen, 33);
data->sau = NULL;
if (Q.dau == NULL)
Q.dau = Q.cuoi = data;
else
{
Q.cuoi->sau = data;
Q.cuoi = data;
}
cout << "Da them khach " << data->hoTen << " vao danh sach cho may!" << endl;
}
int XoaA(QueueA &A)//Hàm trả về giá trị là số nút bị xóa
{
NodeA *xoa;
xoa = A.dau;
int x = xoa->soMay;
A.dau = A.dau->sau;
delete xoa;
return x;
}
void ThueMay(QueueA &A, QueueQ &Q, ListH &H)
{
if (A.dau == NULL)
{
cout << "Het may!" << endl << "Khach co muon cho hay khong (0/1)" << endl;
int cho;
cin >> cho;
if (cho == 0)
return;
else
{
ThemQ(Q);
}
}
else
{
int soMay;
soMay = XoaA(A);
char tenKhach[33];
cout << "Nhap vao ten khach: " << endl;
cin.ignore(1);
cin.getline(tenKhach, 33);
ThemH(H, soMay, tenKhach);
}
}
void XuatQ(QueueQ Q)
{
NodeQ *data;
data = Q.dau;
if (data == NULL)
cout << "Khong co khach nao dang cho ca!"<<endl;
else
{
cout << "========Danh sach khach cho========" << endl;
cout << "STT\tHo Va Ten" << endl;
for (int i = 1; data != NULL; i++, data = data->sau)
cout << i << "\t" << data->hoTen << endl;
}
}
void XuatH(ListH H)
{
NodeH *data;
data = H.dau;
if (data == NULL)
cout << "Khong co khach nao dang dung may!" << endl;
else
{
cout << "========Danh sach khach dang dung may========" << endl;
cout << "STT\tHo Va Ten\tSo May\tThoi Gian" << endl;
for (int i = 1; data != NULL; i++, data = data->sau)
cout << i << "\t" << data->tenKhach << "\t" << data->soMay << "\t" << data->gio << ":" << data->phut << endl;
}
}
int isset(ListH H, int soMay)//Kiểm tra xem trong H có số máy nào có số máy truyền vào không
{
NodeH *data;
data = H.dau;
while (data != NULL)
{
if (data->soMay == soMay)
return 1;
data = data->sau;
}
return 0;
}
void XoaH(ListH &H, int soMay)
{
NodeH *data;
data = H.dau;
if (data->soMay == soMay)
{
H.dau = H.dau->sau;
delete data;
}
else
{
while (data != H.cuoi&&data->sau->soMay != soMay)
{
data = data->sau;
NodeH *xoa;
xoa = data->sau;
data->sau = xoa->sau;
if (xoa == H.cuoi)
H.cuoi = data;
delete xoa;
}
}
}
void TraMay(QueueA &A, ListH &H)
{
int soMay;
cout << "Nhap so may tra: ";
cin >> soMay;
if (isset(H, soMay) == 1)
{
XoaH(H, soMay);
ThemA(A, soMay);
cout << "Tra may thanh cong!" << endl;
}
else
cout << "So may nhap khong co trong danh sach thue may!" << endl;
}
int main()
{
QueueA MayTrong;
MayTrong.dau = MayTrong.cuoi = NULL;
QueueQ KhachCho;
KhachCho.dau = KhachCho.cuoi = NULL;
ListH KhachThue;
KhachThue.dau = KhachThue.cuoi = NULL;
int i, n;
cout << "Cho biet so luong may cua tiem: ";
cin >> n;
for (i = 1; i <= n; i++)
ThemA(MayTrong, i);//Thêm vào danh sách máy trống giá trị i
int chucNang;
ChucNang:
cout << "========Lua chon chuc nang========" << endl;
cout << "Chon 0 de thoat khoi chuong trinh" << endl;
cout << "Chon 1 de xem danh sach may trong" << endl;
cout << "Chon 2 de thue may" << endl;
cout << "Chon 3 de xem danh sach khach dang cho may" << endl;
cout << "Chon 4 de xem danh sach khach dang dung may" << endl;
cout << "Chon 5 de tra may" << endl;
cin >> chucNang;
switch (chucNang)
{
case 0:return 0;
case 1:XuatA(MayTrong); goto ChucNang;
case 2:ThueMay(MayTrong, KhachCho, KhachThue); goto ChucNang;
case 3:XuatQ(KhachCho); goto ChucNang;
case 4:XuatH(KhachThue); goto ChucNang;
case 5:TraMay(MayTrong, KhachThue); goto ChucNang;
default:cout << "Chuc nang nay khong co!"; goto ChucNang;
}
}