看病排队问题

目录

一、代码

二、功能函数介绍

三、运行截图


一、代码

#define  _CRT_SECURE_NO_WARNINGS 1//不用VS删除这一行
#include<stdio.h>
#include<stdlib.h>
struct LinkQueue
{
	int data;
	struct LinkQueue* next;
};

struct Node
{
	LinkQueue* frount;
	LinkQueue* rear;
};

int e;//全局变量,记录患者编号

//取号,入队实现
void EnQueue(LinkQueue& Q, Node& N)
{
	e++;
	LinkQueue* p;
	p = (LinkQueue*)malloc(sizeof(LinkQueue));
	p->data = e;
	N.rear->next = p;
	N.rear = p;
	printf("您是%d号,请耐心候诊!\n", N.rear->data);
}

//医生操作就诊,出队实现
void DeQueue(LinkQueue& Q, Node& N)
{
	LinkQueue* r;
	r = N.frount;
	N.frount = N.frount->next;
	free(r);
	if (N.rear == N.frount)
	{
		N.frount = N.rear;
		printf("目前无病人候诊!\n");
		exit(0);
	}
	else
		printf("请%d号病人就诊,请%d号病人候诊\n", N.frount->data, N.frount->data + 1);
}

//病人查询自己前面还有多少位病人
void PatientQuery(LinkQueue& Q, Node& N)
{
	int i;
	printf("请输入您是几号病人:");
	scanf("%d", &i);
	N.rear->data = i;
	if (N.rear->data == 1)
		printf("您是1号,请尽快就诊!\n");
	else
		printf("在您前面还有%d位病人\n", N.rear->data - N.frount->data - 1);
}

//医生查询还需诊断的人数
void DoctorQuery(LinkQueue& Q, Node& N)
{
	printf("您还需要诊断%d位病人\n", N.rear->data - N.frount->data);
}

//菜单
void menu(void)
{
	printf("***************************************************\n");
	printf("******           请输入您的选择             *******\n");
	printf("******            1 ---- 取号               *******\n");
	printf("******            2 ---- 就诊(医生操作)     *******\n");
	printf("******     3 ---- 查看候诊人数(医生操作)    *******\n");
	printf("******    4 ---- 查看您前面还有多少位病人   *******\n");
	printf("***************************************************\n");
}

//主函数
int main(void)
{
	LinkQueue Q;
	Node N;
	LinkQueue* q;
	q = (LinkQueue*)malloc(sizeof(LinkQueue));
	q->next = NULL;
	q->data = 0;
	N.frount = N.rear = q;
	N.frount->data = N.rear->data = q->data;
	//以上为初始化链队列
	menu();
	while (1)
	{
		int choice;
		printf("\n请输入选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			EnQueue(Q, N);
			break;
		case 2:
			DeQueue(Q, N);
			break;
		case 3:
			DoctorQuery(Q, N);
			break;
		case 4:
			PatientQuery(Q, N);
			break;
		}
	}
	return 0;
}

二、功能函数介绍

1. EnQueue 函数:实现患者取号并入队操作,每次取号增加全局变量 e 值,将其赋给新的 LinkQueue 结构体指针 p 的 data 成员,然后将其插入到链队列的尾部(rear 指针所指向节点的 next 指针),并打印出患者所得到的编号。

//取号,入队实现
void EnQueue(LinkQueue& Q, Node& N)
{
	e++;
	LinkQueue* p;
	p = (LinkQueue*)malloc(sizeof(LinkQueue));
	p->data = e;
	N.rear->next = p;
	N.rear = p;
	printf("您是%d号,请耐心候诊!\n", N.rear->data);
}

2. DeQueue 函数:实现医生查看患者信息、就诊操作,并从链队列头部(front 指针所指向节点)删除该患者信息。如果链队列为空,则输出提示信息并退出程序;否则输出目前行列头部患者信息和下一个等待就诊的患者信息。

//医生操作就诊,出队实现
void DeQueue(LinkQueue& Q, Node& N)
{
	LinkQueue* r;
	r = N.frount;
	N.frount = N.frount->next;
	free(r);
	if (N.rear == N.frount)
	{
		N.frount = N.rear;
		printf("目前无病人候诊!\n");
		exit(0);
	}
	else
		printf("请%d号病人就诊,请%d号病人候诊\n", N.frount->data, N.frount->data + 1);
}

3. PatientQuery 函数: 这个函数可用于查询一个患者在队列中的位置。它接收输入的患者编号,计算该患者前面有多少个患者,然后将这些信息显示给患者。

//病人查询自己前面还有多少位病人
void PatientQuery(LinkQueue& Q, Node& N)
{
	int i;
	printf("请输入您是几号病人:");
	scanf("%d", &i);
	N.rear->data = i;
	if (N.rear->data == 1)
		printf("您是1号,请尽快就诊!\n");
	else
		printf("在您前面还有%d位病人\n", N.rear->data - N.frount->data - 1);
}

4. DoctorQuery 函数: 这个函数用于为医生显示队列中还有多少个患者需要就诊。它计算队列中的患者数量,队尾数据域减对头数据域即可,然后显示结果。

//医生查询还需诊断的人数
void DoctorQuery(LinkQueue& Q, Node& N)
{
	printf("您还需要诊断%d位病人\n", N.rear->data - N.frount->data);
}

5. main() 函数:main函数中包含了初始化链队列,此时N.frount和N.rear的数据域都等于1。使用 menu() 函数打印主菜单,然后通过 while 循环等待用户的输入,根据用户输入调用相应的功能函数产生操作,并重复上述流程直到用户选择退出。

//主函数
int main(void)
{
	LinkQueue Q;
	Node N;
	LinkQueue* q;
	q = (LinkQueue*)malloc(sizeof(LinkQueue));
	q->next = NULL;
	q->data = 0;
	N.frount = N.rear = q;
	N.frount->data = N.rear->data = q->data;
	//以上为初始化链队列
	menu();
	while (1)
	{
		int choice;
		printf("\n请输入选择:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			EnQueue(Q, N);
			break;
		case 2:
			DeQueue(Q, N);
			break;
		case 3:
			DoctorQuery(Q, N);
			break;
		case 4:
			PatientQuery(Q, N);
			break;
		}
	}
	return 0;
}

三、运行截图

1.取号 

2.就诊

 

3.医生查询、病人查询

4.功能复合

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值