一.题目:

二.参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MaxSize 3//顾客
typedef struct
{//编号 int num;//姓名char name[20];
}Person; //顾客所在队列的结点(带头结点)
typedef struct LinkNode
{//数据元素 Person p;//指向下一个元素的指针 struct LinkNode *next;
}LinkNode;//顾客所在队列(链式存储)
typedef struct
{//队头指针 LinkNode *front; //队尾指针LinkNode *rear; //添加:队列当前长度int length;
}LinkQueue; /*-----------------------------------黄黄-----------------------------------*/
//初始化队列
LinkQueue InitQueue(LinkQueue &Q)
{//初始化时front指针和rear指针都指向头结点Q.front = Q.rear = (LinkNode*) malloc( sizeof(LinkNode) );//头指针指向NULLQ.front->next = NULL; // 初始化头结点的数据Q.front->p.num = 0;strcpy(Q.front->p.name, "");// 初始化队列长度Q.length = 0;//返回队列 return Q;
} //入队操作
/*p为要入队的元素*/
void EnQueue(LinkQueue &Q,Person p)
{//1.初始化一个结点LinkNode *s=(LinkNode *)malloc( sizeof(LinkNode) );//2.结点赋值s->p= p;//3.新结点s之后为NULLs->next = NULL;//4.新结点s位于尾指针之后 Q.rear->next = s;//5.新的尾指针指向sQ.rear = s; //6.队列长度加1Q.length++;
}
/*-----------------------------------黄黄-----------------------------------*//*-----------------------------------青格勒-----------------------------------*/
//进入不同队列的函数
/*形参需要不同队列的编号以及队列数组、新入队的元素*/
void InsertDifferentQueue(LinkQueue *lq,int var,Person p)
{//1.取出队列队尾元素的编号并加1,就是新入队的元素的编号 int numResult = 0;LinkNode *current = lq[var].front->next;while(current != NULL){if(current->p.num > numResult) {numResult = current->p.num;}current = current->next;}p.num = numResult + 1; //2.新元素入队列EnQueue(lq[var],p);
} //用于判断进入哪个队列的函数
/*形参就是创建的3个队列的数组*/
void InsertQueue(LinkQueue *lq) //LinkQueue lq[MaxSize]改为LinkQueue *lq即使用指针传递
{//1.输入个人信息Person p; //新入队的元素 printf("请输入姓名:");char name[20];scanf("%s",&name);strcpy(p.name,name); //2.判断是否使用智能机printf("是否使用智能机(1.是;2.否-输入编号即可):");int choose;scanf("%d",&choose);if(choose==1){//此时使用智能机,直接进入智能机队列即可InsertDifferentQueue(lq,2,p);//2.3.函数结束return; } else{//此时不使用智能机 printf("是否是vip(1.是;2.否-输入编号即可):");int choose;scanf("%d",&choose);if(choose==1){//此时直接进入vip队列即可InsertDifferentQueue(lq,0,p);//函数结束return; }else{//此时直接进入普通队列即可InsertDifferentQueue(lq,1,p);//函数结束return; } }
}
/*-----------------------------------青格勒-----------------------------------*//*-----------------------------------赵旭文-----------------------------------*/
//打印单个队列信息
void showInfo(LinkQueue Q)
{/*注:是从头指针指向的下一个元素开始打印*///1.定义变量记录头指针指向的下一个元素LinkNode *temp=Q.front->next;//2.循环打印while(temp!=NULL){printf("编号为%d,姓名为%s->",temp->p.num,temp->p.name); temp = temp->next;} printf("\n");
} //打印全部队列信息
void showAllInfo(LinkQueue lq[MaxSize])
{//外循环是所有队列:vip队列,普通队列,智能机队列 for(int i=0;i<MaxSize;i++){if(i==0) printf("vip队列:");if(i==1) printf("普通队列:");if(i==2) printf("智能机队列:");//内循环是对单个队列的打印 showInfo(lq[i]);}
}//打印各个队列的队头元素
void showFirstInfo(LinkQueue lq[MaxSize])
{//1.循环遍历3个队列for(int i=0;i<MaxSize;i++){if(i==0) printf("vip队列当前正在办理的客户信息:");if(i==1) printf("普通队列当前正在办理的客户信息:");if(i==2) printf("智能机队列当前正在办理的客户信息:");//2.输出单个队列的队头元素,定义变量记录队尾头元素 LinkNode *temp=lq[i].front->next;printf("编号为%d,姓名为%s \n",temp->p.num,temp->p.name); }
}
/*-----------------------------------赵旭文-----------------------------------*///初始化队列数据的方法
void method(LinkQueue *lq)
{//vip队列LinkQueue vipQueue;lq[0]=InitQueue(vipQueue);Person p1={1,"张三"};EnQueue(vipQueue,p1);//普通队列LinkQueue commonQueue;lq[1]=InitQueue(commonQueue);Person p2={1,"李四"};EnQueue(commonQueue,p2);//智能机队列LinkQueue smartQueue;lq[2]=InitQueue(smartQueue);Person p3={1,"王五"}; EnQueue(smartQueue,p3); //2.打印信息printf("之前已排队的顾客如下:\n"); showAllInfo(lq);
}/*-----------------------------------吴佳峻-----------------------------------*/
//查看是否轮到自己的函数
void ownOperate(LinkQueue lq[MaxSize])
{//判断是否轮到自己,只需要看自己所在队列的队头指针是否指向自己//1.输入所在队列编号 int result;printf("请输入所在队列(1.vip队列;2.普通队列;3.智能机队列):");scanf("%d",&result); //2.定义变量记录头指针指向的下一个元素LinkNode *temp=lq[result-1].front->next;//3.输入个人信息int num;char name[20];printf("请输入个人信息(编号和姓名):");scanf("%d",&num); scanf("%s",&name);//4.比较 if( num==temp->p.num && strcmp(name,temp->p.name)==0 ){printf("轮到自己办理 \n");printf("办理结束 \n");} else{printf("前面还有顾客,请耐心等待 \n");}
} //判断队列是否为空
bool isEmpty(LinkQueue lq[MaxSize])
{//1.输入所要查询的队列编号 int result;printf("请输入所在队列(1.vip队列;2.普通队列;3.智能机队列):");scanf("%d",&result); //2.判断 if(lq[result].front==lq[result].rear){//为空printf("该队列为空 \n");return true;}else{//不为空printf("该队列不为空 \n");return false;}
}
/*-----------------------------------吴佳峻-----------------------------------*//*-----------------------------------黄黄-----------------------------------*/
//队头元素出队
void DeQueue(LinkQueue *lq) //用指针传递,因为真正要改数据
{//1.循环遍历3个队列for(int i=0;i<MaxSize;i++){//2.判断是否为空 if(lq[i].front==lq[i].rear){//为空printf("当前队列没有顾客。 \n");return; }else{//不为空 //3.记录当前队列头元素 LinkNode *p=lq[i].front->next;//4.头元素要出队,那么头元素的下一个元素就是新的头元素 lq[i].front->next = p->next;//5.尾指针指向当前对头同一元素时,修改队尾指针 if(lq[i].rear==p) lq[i].rear=lq[i].front;//6.释放空间 free(p);return;}}
}
/*-----------------------------------黄黄-----------------------------------*/int main()
{//1.初始化3个队列LinkQueue lq[MaxSize];method(lq);//2.操作界面printf("------------------------------------------------------------- \n");printf(" 欢迎来到银行办理业务中心 \n"); printf(" 1.取工资 2.判断当前队列是否为空 \n"); printf(" 3.查看当前正在办理的顾客 4.查看是否轮到自己 \n");printf(" 5.查看正在排队的顾客 6.停止办理 \n");printf("------------------------------------------------------------- \n");//3.开始操作 while(true){//4.定义变量记录要操作的选项int choose;printf("请输入接下来的操作:");scanf("%d",&choose);//5.操作实现switch(choose){case 1:{//进入其中一个队列 InsertQueue(lq);printf("------------------------------------------------------------- \n");break;}case 2:{isEmpty(lq);printf("------------------------------------------------------------- \n");break;} case 3:{//显示当前处理的元素 showFirstInfo(lq);//当前处理的元素即队头元素出队 DeQueue(lq);printf("------------------------------------------------------------- \n");break;}case 4:{ownOperate(lq);printf("------------------------------------------------------------- \n");break;} case 5:{//查看正在排队的客户 showAllInfo(lq);printf("------------------------------------------------------------- \n");break;}case 6:{printf("正在退出,请稍等。");exit(0);}default:{printf("不存在该选项 \n");printf("------------------------------------------------------------- \n");break;}} }return 0;
}