Phân tích chút xíu: Phần data cuả A va B giống nhau vì data của A la 1 số int lưu số thứ tự ghế, phần data của B là số thứ tự trong hàng (cái này thừa)
-> vậy định nghĩa 1 danh sách liên kết cho A và B
Phần data của C tức dslk lưu các vé đã đặt thì có ten, số thứ tự ghế. nên định nghĩa riêng cho C 1 dslk
/* cac dinh nghia cho dslk A va B */
struct node {
int data; //phan data luu so ghi tren ghe/ luu so thu tu khac hang
nodeA *pnext;
};
struct list {
nodeA *head;
nodeA *tail;
};
//Mot so ham thao tac co ban dslk
nodeA* createNode(int data); //Ham tao 1 node dung de them vao dslk
//Do dslk A khong can them tung ghe 1 nen ban co the viet 1 ham them 1 phat nhieu ghe thay cho ham tren:
void khoiTaoA(list &list); //dung cho A, ham khoi tao n ghe ban dau cho A
void removeNode(list &list,int ghe); //Dung cho A, xoa 1 ghe trong A
void enqueue(list &list,int stt); //Dung cho B, Thuc ra ham nay la ham addTail thuong dung trong dslk, them 1 stt cho khach vao B
int dequeue(list &list); //Ham dung cho B, Lay 1 stt tu B de goi len dat ve, ham nay la ham removeFirt thuong dung trong dslk don
//hoac neu muon ro rang ban dinh nghia A va B rieng nhau.
/* cac dinh nghia cho dslk C */
//Phan data cho C , phan data cua C lay ra tu B
struct dataC {
int soGhe; //So ghe ma khach dat
string TenKh;
};
//Co ban van la dslk nen van co cac struct va ham
struct nodeC
{
dataC data;
nodeC *pnext;
};
struct listC
{
nodeC *head;
nodeC *tail;
};
//Van la cac ham phai co voi dslk
nodeC* createNodeC(dataC data); //Tao 1 node de them vao C
void addFirtC(listC &list, dataC data); //Ham addFirt co ban trong dslk, dung de them khach hang vao C (kh duoc lay tu B)
void removeNodeC(listC &list,dataC data); //Xoa 1 node co data , dung de xoa 1 ve trong dslk C
void duyetC(listC &list); //Ham co ban duyet dslk va show thong tin ra , dung de hien thi thong tin cac ve trong C
/* Ngoai ra ban co cac ham voi dslk , rat can ban trong dslk dong */
bool isEmpty(list l); //Ham kiem tra A,B co trong khong
bool isCEmpty(listC c); //Ham kiem tra C co trong khong
//va cac ham khoi tao dslk
sau khi ban da co cac khai bao, dinh nghia cho 3 dslk thi ban co cac ham chuc nang nhu bai ra:
gia su ban se khai bao va khoi tao 3 dslk de dung trong bai
list A; //Dung luu ghe nhu bai
list B; //Dung xep hang
listC C; //dung luu thong tin ve
1.Lay so xep hang
//khi dat ve thi su dung den B
void xepHang(list &b) {
//tao stt nhu bai ra (b trong thi khoi tao stt = 1, khong thi stt bang stt node cuoi + 1)
//Them node cho B
enqueue(b,stt);
//xong xep hang
}
2. Mua ve
//Khi mua ve thi dung den ca B,C,A
void muaVe(list &a, list &b, listC &c)
{
//dau tien kiem trang hang xep con ai dang doi khong
if(isEmpty(b))
{
cout<<"Khong ai doi mua ve";
return;
}
//tiep theo phai kiem tra con ghe trong khong
if(isAEmpty(a)) {
cout<<"Het ghe";
return;
}
//Neu con ghe trong va co nguoi dat ve thi dat ve
//Lay thong tin lam data cho c
//Lay thong tin ten
//Lay thong tin so ghe
//them nut voi thong tin da lay vao C
//vi du ta co data vua nhap la data
addFirtC(c,data);
//Them roi thi cap nhat lai ghe trong, tuc xoa ghe co soGhe vua nhap nay
removeNode(a,soGhe);
}
2 chuc nang tiep theo thi chac de roi.
Thực ra mình thấy cái B no cứ vô dụng làm sao ấy, cần gì stt, nguoi dung dat ve la kiem tra ghe trong roi them ve vao C thoi chu nhi, mình tưởng phần xếp hàng là đặt vé nên
bên trên có dequeue để lấy data nhưng đọc thì B chỉ có tác dụng xếp hàng mua vé.
Tóm lại các thao tác với dslk đơn chắc chắn bạn phải nắm vững. Các hàm trên đều dựa vào các thao tác với dslk đơn thôi.