一、问题描述
编写一个程序,反映病人到医院排队看医生的情况。在病人排队过程 中主要重复下面两件事。 (1)病人达到诊室,将病历本交给护士,排到等待队列中候诊。
(2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就 诊。 要求模拟病人等待就诊这一过程。程序采用菜单的方式,通过选择不 同的选项进行不一样的功能操作,功能说明如下:
1:排队——输入排队病人的病历号(可以考虑使用 int 类型),加入 病人到排队队列中。
2:就诊——病人排队队列中最前面的病人就诊,并将其从队列中删 除。
3:查看排队——从队首到队尾列出所有排队病人的病历号。
4:不再排队,余下依次就诊——从队首到队尾列出所有排队病人的 病历号,并退出运行。
5:下班——退出运行。
二、问题解决
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct qnode
{ ElemType data; //数据元素
struct qnode *next;
} DataNode;
typedef struct
{ DataNode *front; //指向单链表队首结点
DataNode *rear; //指向单链表队尾结点
} LinkQuNode;
void queue (LinkQuNode*&q) //排队函数
{
DataNode*p;
p=(DataNode*)malloc(sizeof(DataNode));
printf(" 请输入排队病人病历号:");
scanf("%d",&p->data);
p->next=NULL;
if(q->rear==NULL)若链队为空,新结点是队首结点又是队尾结点
q->front=q->rear=p;
else
{
q->rear->next=p;//将 p 结点链到队尾,并将 rear 指向它
q->rear=p;
}
}
void doctor (LinkQuNode*&q) //就诊函数
{
DataNode*t;
if(q->front==NULL)
{
printf(" 当前没有病人排队!\n");
return ;
}
t=q->front;//t 指向第一个数据结点
printf(" 请病历号为%d 的患者就诊\n",t->data);
if(q->front==q->rear)//队列中只有一个结点时
q->front=q->rear=NULL;
else//队列中有多个结点时
q->front=q->front->next;
free(t);
}
void see_queue(LinkQuNode*&q) //查看排队
{
int num=1;
DataNode*p=(DataNode*)malloc(sizeof(DataNode));
if(p==NULL)
{
printf(" 当前没有病人排队\n");
return ;
}
for(p=q->front;p!=NULL;p=p->next)
{
printf(" 第%d 位病人病历号:%d\n",num,p->data);
num++;
}
}
void no_queue(LinkQuNode*&q) //不再排队(输出所有排队的病历号)
{
DataNode*p=(DataNode*)malloc(sizeof(DataNode)),*s;
p=q->front;
while(p!=NULL)
{ s=p;
p=p->next;
printf(" 请病历号为%d 的患者就诊\n",s->data);
free(s);
}
q->front=q->rear=NULL;
}
void menu()
{
printf(" 菜单 \n");
printf(" 输入 1:排队 \n");
printf(" 输入 2:就诊 \n");
printf(" 输入 3:查看排队 \n");
printf(" 输入 4:不再排队 \n");
printf(" 输入 5:下班 \n");
}
int main()
{
menu();
int T=0,option; //辅助变量 T,输入的选项序号 option
LinkQuNode*q=(LinkQuNode*)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL; //初始化队列
for(;;)
{
printf("请输入选项序号: ");
scanf("%d",&option);
switch(option)
{
case 1:
queue(q);
break;
case 2:
doctor(q);
break;
case 3:
see_queue(q);
break; case 4:
no_queue(q); //题目要求输入 4 后剩下所有患者就诊,
并且结束程序,∴执行完 4 后继续执行 5
case 5: //选项 5 只要求了
T=1;
break;
default:
printf("选项序号输入错误,请重新输入!\n");
}
if(T)
break;
}
printf("程序运行结束!\n");
return 0;
}
三、代码分析
设计函数分析解释:
-
queue
函数:用于添加病人到队列中。首先,它分配内存给一个新的数据节点,然后从用户那里读取病人的病历号,并将这个节点添加到队列的末尾。如果队列是空的,这个节点将成为队首和队尾。 -
doctor
函数:用于处理病人的就诊。首先检查队列是否为空,如果不为空,它会打印出队首病人的病历号,并将其从队列中移除。 -
see_queue
函数:用于查看当前队列中的所有病人。它遍历队列,打印出每个病人的病历号和他们在队列中的位置。 -
no_queue
函数:用于结束队列中的所有病人的排队。它遍历队列,打印出每个病人的病历号,并释放内存,最后将队列清空。 -
menu
函数:打印出程序的菜单选项,供用户选择。 -
main
函数:程序的主入口,初始化队列,然后进入一个循环,根据用户的选择执行不同的功能。当用户选择5时,程序结束。