目录
一、代码
二、功能函数介绍
三、运行截图
一、代码
#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.功能复合