栈与队列+病人看病模拟程序

一、问题描述

编写一个程序,反映病人到医院排队看医生的情况。在病人排队过程 中主要重复下面两件事。 (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; 
} 

三、代码分析

设计函数分析解释:

  1. queue 函数:用于添加病人到队列中。首先,它分配内存给一个新的数据节点,然后从用户那里读取病人的病历号,并将这个节点添加到队列的末尾。如果队列是空的,这个节点将成为队首和队尾。

  2. doctor 函数:用于处理病人的就诊。首先检查队列是否为空,如果不为空,它会打印出队首病人的病历号,并将其从队列中移除。

  3. see_queue 函数:用于查看当前队列中的所有病人。它遍历队列,打印出每个病人的病历号和他们在队列中的位置。

  4. no_queue 函数:用于结束队列中的所有病人的排队。它遍历队列,打印出每个病人的病历号,并释放内存,最后将队列清空。

  5. menu 函数:打印出程序的菜单选项,供用户选择。

  6. main 函数:程序的主入口,初始化队列,然后进入一个循环,根据用户的选择执行不同的功能。当用户选择5时,程序结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倚楼听风疏雨骤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值