1.3.课设实验-数据结构-栈、队列-银行叫号系统

一.题目:

二.参考代码:

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值