看病排队问题

目录

一、代码

二、功能函数介绍

三、运行截图


看病排队问题_第1张图片

一、代码

#define  _CRT_SECURE_NO_WARNINGS 1//不用VS删除这一行
#include
#include
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张图片

2.就诊

看病排队问题_第3张图片 

3.医生查询、病人查询

看病排队问题_第4张图片

4.功能复合

看病排队问题_第5张图片 看病排队问题_第6张图片

你可能感兴趣的:(数据结构,链队列,队列,排队问题,c语言)