Cần giúp đỡ bài tập hàng đợi

Đề:smile: Viết chương trình mô phỏng quy trình xếp hàng đặt vé xem phim như sau:
Danh sách liên kết A chứa số ghế của các ghế trống trong rạp (ban dầu khởi tạo các số ghế từ 1 đến n).
Danh sách hàng đợi B chứa số thự tự xếp hàng của khách.
Danh sách liên kết C chứa thông tin khách đã mua vé (số ghế, tên).
Chức năng lấy số xếp hàng: Thêm nút vào B, nếu B rỗng thì nút thêm sẽ có số thứ tự xếp hàng là 1, ngược lại thì số thứ tự xếp hàng là k+1 với k là số thứ tự của nút cuối của B.
Chức năng mua vé: Nếu còn ghế trống và có khách đang chờ mua vé thì xóa nút khỏi B, lấy tên khách và số ghế khách chọn để thêm nút vào C đồng thời loại số ghế đó khỏi A.
Chức năng hủy vé: Xóa nút khỏi C đồng thời thêm số ghế mới hủy vào A.
Chức năng hiển thị: Hiển thị thông tin những vé đã bán (DSLK C).

Nhờ mọi người hướng dẫn mình cách làm mấy cái chức năng bài này với, mình viết code tới mấy chức năng này thì không biết cách giải quyết thế nào, mình tự học nhưng viết tới cái này thì nghĩ mãi không ra. Chỉ giúp mình cách giải quyết cũng được, code mình tự viết :smile: Cảm ơn các bạn nhiều ^^

ai giúp mình gợi ý hướng đi với

Bạn xem về các method cơ bản trong Linked List, thầy bạn đang yêu cầu làm một Queue cơ bản (cũng tương tự DSLK)

2 Likes

mình tự học cũng gọi là cũng thành thạo mấy cái method của Linklist cơ bản rồi, bạn có thể hướng dẫn mình làm chức năng 2 không ạ :frowning:

Đề bài cũng chỉ khá rõ rồi, bạn đọc qua chức năng 2 thì: Nếu còn ghế trống tức là DSLK A vẫn còn phần tử hay hàm kiểm tra isEmpty(A) != false, đồng thời "Có khách đang chở mua vé " tức Hàng đợi B còn phần tử. Nếu thỏa 2 điều kiện trên thì bạn deQueue hàng đợi B (Chắc bạn cũng biết deQueue hàng đợi rồi) , lấy phần data để tạo nút mới cho DSLK C.
Tóm lại nó như thế này

if(isEmpty(A) != false && isEmpty(B) != false)
{
// deQueue B để lấy data
//tao nút mới cho C với data bên trên
}

Các thao tác với linked List , Queue chắc bạn đã nắm hết rồi nên mình không nói ở đây.

2 Likes

cảm ơn bạn nhiều :smile:
hàm isEmty(A) mình viết như thế này đúng không bạn
int IsEmpty(QueueA &a) { if(a.pHead==NULL) return 1; else return 0; }

còn hàm IsEmpty(QueueB &b) giống như hàm IsEmpty(QueueA &a) đúng không bạn?
Hàm DeQueue viết thế này đúng không bạn

             int DeQueueB(QueueA &a, QueueB &b, int &giaTriLay)
             {
                NodeB *p = new Node[1];
               if (if (isEmpty(a) == 0 && isEmpty(b) == 0)) //Queue khong rong
                 {
                     p = b.pHead;
                     giaTriLay = p->soThuTu;
                     b.pHead = b.pHead->pNext;
                     return p;
                 }
                 else
                 {
                     cout << "Khong co ghe trong va khong co khach dang cho mua ve\n";// mình thấy câu này hơi kì, phải chia ra 2 trường hợp để xuất ra 2 vế thì hợp lí hơn nhỉ?
                     return 0;//Lấy thất bại
                 }
             }

mình không biết cách lấy khách và số ghế khách chọn để thêm nút vào C bạn chỉ mình với :frowning:
mình yếu phần này lắm… làm phiền bạn… cảm ơn bạn nhiều

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.

1 Like

full code, ban tu goi ham nhe

#include<iostream>
#include<Windows.h>
#include<list>
#include<queue>
#include<string>
struct ve
{
	int soghe;
	string ten;
};
using namespace std;
int chonCN = 0;
void color(int n);
void inputA(list <int> &A);
void outputA(list <int> A);
void inputB(queue <int> &B);
void outputB(queue <int> B);
void muave(list <ve> &C, queue<int>&B, list<int>&A);
ve trave(list <ve> &C, list<int>&A);
int timghe(list<int>A, int soghe);
ve timve(list<ve> C, int soghedamua);
//hang doi
list <int> A;//danh sach ghe trong trong rap tu 1-20.
void main()
{
	do
	{
		system("cls");
		color(2);
		cout << "\n***************MENU***************\n";
		cout << "\t 1.Chuc nang xep hang lay so.\n";
		cout << "\t 2.Chuc nang mau ve.\n";
		cout << "\t 3.Chuc nang huy ve.\n";
		cout << "\t 4.Chuc nang hien thi thong tin da ban.\n";
		cout << "\t 5.that chuong trinh.\n";
		cout << "\n***********************************\n";
		cout << " \n Ban chon chuc nang so: \n";
		cin >> chonCN;
		switch (chonCN)
		{
		case 1: break;
		case 2: break;
		case 3: break;
		case 4: break;
		default:
			color(21);
			cout << " Ban chon thoat chuong trinh! Cam on!\n";
		}
		system("pause");
	} while (chonCN >= 1 && chonCN <=4);
	
}
ve trave(list <ve> &C, list<int>&A)
{
	if (C.empty() == true)
	{
		cout << " Khong tra duoc ve!\n";
		return;
	}
	else
	{
		int soghedamua = 0;
		cout << " N hap so ghe trong ve can tra: ";
		ve xV = timve(C, soghedamua);
		C.remove(xV);
		A.push_back(soghedamua);
		A.sort();
	}
}
ve timve(list<ve> C, int soghedamua)
{
	list <ve>::iterator p = C.begin();
	while (p != C.end())
	{
		if (p->soghe==soghedamua)
			return *p;
		p++;
	}
}
int timghe(list<int>A, int soghe)
{
	list <int>::iterator p = A.begin();
	while (p != A.end())
	{
		if (*p == soghe)
			return *p;
		p++;
	}
	return -1;
}
void muave(list <ve> &C, queue<int>&B, list<int>&A)
{
	if (B.empty() == true)
	{
		cout << " Khong co nguoi cho mua ve!\n";
		return;
	}
	else
	{
		ve xV;
		cout << " Nhap ten: "; rewind(stdin); getline(cin, xV.ten);
		do
		{
			cout << " Danh sach ghe con trong: \n";
			outputA(A);
			cout << " Chon so ghe: ";
			cin >> xV.soghe;
		} while (timghe(A, xV.soghe) == -1);
		C.push_back(xV);
		A.remove(xV.soghe);
		B.pop();
	}
}
list <ve> C;//danh sach ve duoc mua
void inputB(queue <int> &B)
{
	if (B.empty() == true)
	{
		B.push(1);
	}
	else
	{
		B.push(A.back() + 1);
	}
}
void outputB(queue <int> B)
{
	queue<int>B1;
	B1 = B;
	while (B1.empty()==false)
	{
		cout << " " << B1.front();
		B1.pop();
	}
}
void outputA(list <int> A)
{
	list <int>::iterator p = A.begin();
	while (p!=A.end())
	{
		cout << *p<<" ";
	}
	cout << endl;
}
void inputA(list <int> &A)
{
	int n = 0;
	for (int i = 1; i <= 20; i++)
	{
		A.push_back(i);
	}
}
void color(int n)
{
	HANDLE color;
	color = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(color, n);
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?