一.题目:

二.参考代码:
#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) );
//头指针指向NULL
Q.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之后为NULL
s->next = NULL;
//4.新结点s位于尾指针之后
Q.rear->next = s;
//5.新的尾指针指向s
Q.rear = s;
//6.队列长度加1
Q.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;
}