加一个实时输出排队情况的函数

加一个遍历整个链队数组输出
按照窗口分别输出

遍历每个窗口就行
设一个节点指向对的头节点
然后循环输出每个节点的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);//输出


实时输出排队情况