- /*
- Copyright (c)2016,烟台大学计算机与控制工程学院
- All rights reserved.
- 文件名称:wu.cbp
- 作 者:武昊
- 完成日期:2016年10月9日
- 版 本 号:v1.0
- 问题描述: 编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队过程中,主要重复两件事:
- (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊。
- (2)护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊。
- 要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
- (1)排队——输入排队病人的病历号,加入到病人排队队列中。
- (2)就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除。
- (3)查看排队——从队首到队尾列出所有的排队病人的病历号。
- (4)不再排队,余下顺序就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行。
- (5)下班——退出运行,提示未就诊的病人明天再来。
- 输入描述:根据菜单提示选择
- 程序输出:各指令结果
- */
代码:
- #include <stdio.h>
- #include <malloc.h>
- typedef struct qnode
- {
- int data;
- struct qnode *next;
- } QNode; /*链队结点类型*/
- typedef struct
- {
- QNode *front,*rear;
- } QuType; /*链队类型*/
- void SeeDoctor()
- {
- int sel,flag=1,find,no;
- QuType *qu;
- QNode *p,*q;
- qu=(QuType *)malloc(sizeof(QuType)); /*创建空队*/
- qu->front=qu->rear=NULL;
- while (flag==1) /*循环执行*/
- {
- printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班 请选择:");
- scanf("%d",&sel);
- switch(sel)
- {
- case 1:
- printf(" >>输入病历号:");
- do
- {
- scanf("%d",&no);
- find=0;
- p=qu->front;
- while (p!=NULL && !find)
- {
- if (p->data==no)
- find=1;
- else
- p=p->next;
- }
- if (find)
- printf(" >>输入的病历号重复,重新输入:");
- }
- while (find==1);
- p=(QNode *)malloc(sizeof(QNode)); /*创建结点*/
- p->data=no;
- p->next=NULL;
- if (qu->rear==NULL) /*第一个病人排队*/
- {
- qu->front=qu->rear=p;
- }
- else
- {
- qu->rear->next=p;
- qu->rear=p; /*将*p结点入队*/
- }
- break;
- case 2:
- if (qu->front==NULL) /*队空*/
- printf(" >>没有排队的病人!\n");
- else /*队不空*/
- {
- p=qu->front;
- printf(" >>病人%d就诊\n",p->data);
- if (qu->rear==p) /*只有一个病人排队的情况*/
- {
- qu->front=qu->rear=NULL;
- }
- else
- qu->front=p->next;
- free(p);
- }
- break;
- case 3:
- if (qu->front==NULL) /*队空*/
- printf(" >>没有排列的病人!\n");
- else /*队不空*/
- {
- p=qu->front;
- printf(" >>排队病人:");
- while (p!=NULL)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- break;
- case 4:
- if (qu->front==NULL) /*队空*/
- printf(" >>没有排列的病人!\n");
- else /*队不空*/
- {
- p=qu->front;
- printf(" >>病人按以下顺序就诊:");
- while (p!=NULL)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- flag=0; /*退出*/
- break;
- case 5:
- if (qu->front!=NULL) /*队不空*/
- printf(" >>请排队的病人明天就医!\n");
- flag=0; /*退出*/
- break;
- }
- }
- p=qu->front; //销毁队列
- while (p!=NULL)
- {
- q = p->next;
- free(p);
- p = q;
- }
- }
- int main()
- {
- SeeDoctor();
- return 0;
- }