加一个遍历整个链队数组输出
按照窗口分别输出
遍历每个窗口就行
设一个节点指向对的头节点
然后循环输出每个节点的data
include<bits/stdc++.h>
using namespace std;
int n, m;
typedef struct Node
{
///结点构造
int date;///顾客顺序号
struct Node* next;///指针域
} Linknode, * LinkQnode;
typedef struct
{
//链队列结构
LinkQnode front;///队头指针
LinkQnode rear;///队队尾指针
int FW;//该窗口服务分数
int RS;//该窗口业务量
int num;//窗口人数
} LinkQueue;
int G(LinkQueue* A){
int min=A[0].num,k=0;
int i=0;
while(i<n)
{if(A[i].num<min){min=A[i].num;k=i;}
i++;
}
return k;
}
void getnum1(LinkQueue* A,int num){//普通窗口取号;
int i=G(A);
A[i].num++;
LinkQnode a;
a=new Node;
a->next=NULL;
a->date=num;
if(A[i].front==A[i].rear&&A[i].front==NULL) {
A[i].front=A[i].rear=a;
}
else{
A[i].rear->next=a;
A[i].rear=a; }
printf("*********************\n");
printf("* 您的号码为%d *\n",num);
printf("* 您还需要等待%d个人*\n",A[i].num-1);
printf("* 您的服务窗口为%d *\n",i+1);
printf("*********************\n");
}
int GV(LinkQueue* V){
int min=V[0].num,k=0;
int i=0;
while(i<m)
{if(V[i].num<min){min=V[i].num;k=i;}
i++;
}
return k;
}
void getnum2(LinkQueue* V,int num){//VIP窗口取号;
int i=GV(V);
LinkQnode a;
a=new Node;
a->next=NULL;
a->date=num;
if(V[i].front==V[i].rear) {
V[i].front=V[i].rear=a;
}
else{
V[i].rear->next=a;
V[i].rear=a;}
V[i].num++;
printf("********************\n");
printf("*尊贵的VIP您好 *\n");
printf("* 您的号码为%d *\n",num);
printf("* 您的服务窗口为5号*\n");
printf("********************");
}
void Likai(LinkQueue &Q) { //模拟顾客离开并输出评价页面
int FZ;//顾客评价分数
if (Q.num==0) {
printf("窗口无人\n");
return;
}
LinkQnode p;
p = Q.front;
if(Q.front==Q.rear) Q.front=Q.rear=NULL;
else
{Q.front= Q.front->next;
delete p;
}
int h;
printf("是否要评价这次服务\n1为是,0为否\n");
cin>>h;
if(h==1){
printf("___________________________________________________\n");
printf("|------------------评价服务平台-------------------|\n");
printf("|*****************1--非常不满意*******************|\n");
printf("|*****************2--不满意***********************|\n");
printf("|*****************3--一般*************************|\n");
printf("|*****************4--满意*************************|\n");
printf("|*****************5--十分满意*********************|\n");
printf("|_________________________________________________|\n");
printf("请你对此次服务做出评分(1~5分)");
cin >> FZ;
Q.FW = Q.FW + FZ;}
Q.RS++;
}
void LK(LinkQueue* A, LinkQueue* V) { //判断离开的顾客的身份
int hm;//窗口号;
printf("请输入顾客离开的窗口码\n");
cin >> hm;
if (hm<=n)
Likai(A[hm-1]);
else
Likai(V[hm-1]);
}
void CK(LinkQueue* A, LinkQueue* V) {
printf("请问您的窗口是否是VIP窗口(1是/0不是)\n 请输入(1/0)");
int FH;
cin >> FH;
printf("请输入您的排队号窗口号\n");
int HM,ck;
cin >> HM>>ck;
LinkQnode p;
int DDS=0;
if (FH == 1) {
p=V[0].front;
while(p&&p->date!=HM){
p=p->next;DDS++;
}}
if(FH==0){
p=A[ck-1].front;
while(p&&p->date!=HM){
p=p->next;DDS++;
}}
printf("您前面有%d人\n", DDS-1);
}
void Process(LinkQueue* A, LinkQueue* V) //菜单页面
{
int num1=0;//记录普通顾客编码
int num2=0;//记录VIP顾客编码
char ch;//选择功能
int flag = 1;//用于系统退出
while (flag)
{
printf("____________________________________________________\n");
printf("|-----------------银行排队系统模拟-----------------|\n");
printf("|***************A--表示顾客到达并取号**************|\n");
printf("|***************B--表示顾客离开并评价**************|\n");
printf("|***************C--查询正在办理的顾客位号码********|\n");
printf("|***************D--查询顾客前面的人数**************|\n");
printf("|***************E--查询业务量**********************|\n");
printf("|***************F--表示退出系统********************|\n");
printf("|__________________________________________________|\n");
printf("请输入:A/B/C/D/E/F/P\n");
cin >> ch;
switch (ch)
{
case 'A': { //功能1
printf("是否为VIP?1为是0为否\n");
int a;
cin>>a;
if(a==0){num1++;getnum1(A,num1);}
else {num2++;getnum2(V,num2);}
break;}
case 'B': //功能3
LK(A, V);
break;
case 'C': //功能2
{
int i;
printf("输入查找窗户口的号码\n");
cin>>i;
if(i<=n){
if(A[i-1].num==0) printf("该窗口没有人\n");
else printf("窗口%d正在为顾客%d办理\n",i,A[i-1].rear->date);}
else
{if(V[i-n-1].num==0)printf("该窗口没有人\n");
else
printf("VIP窗口%d正在为顾客%d办理\n",i,V[i-n-1].front->date);
}
break;
}
case 'D': //功能4
CK(A, V);
break;
case 'E':
{
cout<<"输入你要查询的窗口号码"<<endl;;
int a;
cin>>a;
if(a<=n)
cout<<A[a-1].RS;
else cout<<V[a-n-1].RS; //功能5
break;}
case 'F': //功能6
flag = 0;
break;
}
}
}
int main()
{
printf("请输入模拟系统中普通窗口数以及VIP窗口数\n");
cin >> n >> m;
LinkQueue A[n], V[m];//无头结点;
for (int i = 0; i < n; i++) { //初始化
A[i].front = A[i].rear = new Linknode;
A[i].front->next = NULL;
A[i].FW = 0;
A[i].RS = 0;
A[i].num=0;
}
for (int j = 0; j < m; j++) {
V[j].front = V[j].rear = new Linknode;
V[j].front->next = NULL;
V[j].FW = 0;
V[j].RS = 0;
V[j].num=0;
}
Process(A, V);
return 0;
}
你这个需要引入时间类,记录时间,通过办理时间开始和结束来判断当前是否正在忙呀
顾客类需要引入cometime,leavetime,leavetime通过随机生成rand时间几分钟来确定。
如果想要模拟真实的银行排队离开,必须得到电脑具体的时间,这样能够真实的模拟,
或者通过sleep1000来模拟现实中的一分钟,写一个time来,全程调用自己的time类函数
我觉得没有必要链队就是用数组进队出队就行。
可以把整个一天的数组保存到文件中就可以了。如果需要我有现成的代码,可以借鉴,可以私聊我,晚上发给你。我的是自己的时间类,并且有文件输出,是能够动态刷新当前队列的处理和离开。环境是vs2022,c++ 程序通过数组实现的队列。
void outputQueues(LinkQueue* queues, int n) {
for (int i = 0; i < n; i++) {
// 输出队列号
cout << "Queue " << i+1 << ": ";
// 设置一个指向队列前端的指针
LinkQnode* cur = queues[i].front;
// 遍历队列并输出每个节点的数据
while (cur) {
cout << cur->date << " ";
cur = cur->next;
}
cout << endl;
}
}
outputQueues(queues, n);
为了遍历整个链队数组并按照窗口分别输出,您可以尝试以下方法:
定义一个指向节点的指针变量,初始化为每个窗口的头节点。
在循环中,使用指针变量遍历每个窗口的节点,并输出其中的数据。
在循环结束后,将指针变量指向下一个窗口的头节点,继续循环遍历。
LinkQueue A[n];//定义n个普通窗口
LinkQueue V[m];//定义m个VIP窗口
for (int i = 0; i < n; i++) {
//遍历每个普通窗口
printf("普通窗口%d:\n", i+1);
LinkQnode ptr = A[i].front;//定义指向节点的指针变量
while (ptr != NULL) {
//遍历窗口中的所有节点
printf("%d ", ptr->date);//输出
实时输出排队情况