Advertisement

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

阅读量:

一、问题描述

编写一个程序,反映病人到医院排队看医生的情况。在病人排队过程 中主要重复下面两件事。 (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; 
    
 } 
    
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/HfD6rpOiwyqjIZ70JW8asFN2TxuK.png)

三、代码分析

设计函数分析解释:

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

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

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

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

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

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

全部评论 (0)

还没有任何评论哟~