项目 5 - 排队看病模拟(队列)

来源:互联网 发布:香港大学计算机 知乎 编辑:程序博客网 时间:2024/05/16 03:36
/* 
 
*Copyright (c) 2016,烟台大学计算机学院
*All right reserved. 
 
*文件名称:test.cpp 
 
*作者:杨天瑞 
 
*完成日期:2016年11月2日 
 
*版本号:v1.4.2
   

 
*  问题描述:编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队过程中,主要重复两件事: 
  (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊。 
  (2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
           要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
  (1)排队——输入排队病人的病历号,加入到病人排队队列中。 
  (2)就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
  (3)查看排队——从队首到队尾列出所有的排队病人的病历号。
  (4)不再排队,余下顺序就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。
  (5)下班——退出运行,提示未就诊的病人明天再来。
 
*程序输入:输入病人需求情况。 
 
*程序输出:病人需求结果回应。 
 

*/

r.h:

#ifndef LIQUEUE_H_INCLUDED#define LIQUEUE_H_INCLUDED#include<malloc.h>typedef int ElemType;typedef struct qnode{    ElemType data;    struct qnode *next;} QNode;        //链队数据结点类型定义typedef struct{    QNode *front;    QNode *rear;} LiQueue;          //链队类型定义void InitQueue(LiQueue *&q);  //初始化链队void DestroyQueue(LiQueue *&q);  //销毁链队bool QueueEmpty(LiQueue *q);  //判断链队是否为空int QueueLength(LiQueue *q);  //返回队列中数据元素个数void enQueue(LiQueue *&q,ElemType e);  //入队bool deQueue(LiQueue *&q,ElemType &e);   //出队#endif // LIQUEUE_H_INCLUDED


t.cpp:

#include <stdio.h>#include <malloc.h>#include "r.h"void InitQueue(LiQueue *&q)  //初始化链队{    q=(LiQueue *)malloc(sizeof(LiQueue));    q->front=q->rear=NULL;}void DestroyQueue(LiQueue *&q)  //销毁链队{    QNode *p=q->front,*r;   //p指向队头数据节点    if (p!=NULL)            //释放数据节点占用空间    {        r=p->next;        while (r!=NULL)        {            free(p);            p=r;            r=p->next;        }    }    free(p);    free(q);                //释放链队节点占用空间}bool QueueEmpty(LiQueue *q)  //判断链队是否为空{    return(q->rear==NULL);}int QueueLength(LiQueue *q)  //返回队列中数据元素个数{    int n=0;    QNode *p=q->front;    while (p!=NULL)    {        n++;        p=p->next;    }    return(n);}void enQueue(LiQueue *&q,ElemType e)  //入队{    QNode *p;    p=(QNode *)malloc(sizeof(QNode));    p->data=e;    p->next=NULL;    if (q->rear==NULL)      //若链队为空,则新节点是队首节点又是队尾节点        q->front=q->rear=p;    else    {        q->rear->next=p;    //将*p节点链到队尾,并将rear指向它        q->rear=p;    }}bool deQueue(LiQueue *&q,ElemType &e)   //出队{    QNode *t;    if (q->rear==NULL)      //队列为空        return false;    t=q->front;             //t指向第一个数据节点    if (q->front==q->rear)  //队列中只有一个节点时        q->front=q->rear=NULL;    else                    //队列中有多个节点时        q->front=q->front->next;    e=t->data;    free(t);    return true;}


main.cpp:

 

#include <iostream>#include "r.h"#include<stdio.h>#define N 100int main(){    LiQueue *qu;    ElemType a,no,ne[N],i=0;    InitQueue(qu);    while(1)    {        printf("1.排队 2.就诊 3.查看排队 4.不再排队,余下依次就诊 5.下班");        printf("\n");        printf("请选择:");        scanf("%d",&a);        switch(a)        {        case 1:        {            printf(">>输入病历号:");            scanf("%d",&no);            enQueue(qu,no);        }        break;        case 2:        {            printf(">>病人");            deQueue(qu,no);            printf("%d",no);            printf("就诊");            printf("\n");        }        break;        case 3:        {            printf(">>排队病人:");            while(!QueueEmpty(qu))            {                deQueue(qu,ne[i]);                printf("%d ",ne[i]);                i++;            }            printf("\n");        }        break;        case 4:        {            printf(">>病人按以下顺序就诊:");            for(int j=0; j<i; j++)            {                printf("%d ",ne[j]);            }           printf("\n");        }        break;        default:            a=5;            /*case 5:            {                printf("下班");                printf("\n");            }            break;            }*/            printf("下班");            printf("\n");            return 0;        }    }}


 

总结:

利用队列的方法,简单的反映病人到医院看病,排队看医生的情况。

 

0 0