病人看病排队问题:设计一个程序,反映病人到医院看病、排队看医生的情况。
病人排队看医生采用先到先看的方式,所以要用到一个队列,这里设计了一个带头节点的单链表作为队列。完整的程序如下:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct QNode
{
char data[10]; /*数据域为字符类型*/
struct QNode *next;
} QType; /*链队节点类型*/
typedef struct
{
QType *front,*rear;
} LinkQueue; /*链队类型*/
void SeeDoctor()
{
int sel,flag=1;
LinkQueue *lq;
QType *s;
char name[10];
lq=(LinkQueue *)malloc(sizeof(LinkQueue));
lq->front=(QType *)malloc(sizeof(QType));
lq->front->next=NULL;
lq->rear=lq->front;
while (flag==1) /*未下班时循环执行*/
{
printf("1:排队2:看医生3:查看排队0:下班 请选择:");
scanf("%d",&sel);
switch(sel)
{
case 0:
if(lq->front!=lq->rear) /*队不空*/
printf(">>请排队的患者明天就医\n");
flag=0;
break;
case 1:
printf(">>输入患者姓名:");scanf("%s",name);
s=(QType *)malloc(sizeof(QType));
strcpy(s->data,name);s->next=NULL;
lq->rear->next=s;lq->rear=s;
break;
case 2:
if (lq->front==lq->rear) /*队空*/
printf(">>没有排队的患者\n");
else
{
s=lq->front->next;
if (lq->rear==s)
lq->rear=lq->front;
printf(">>患者%s看医生\n",s->data);
lq->front->next=s->next;
free(s);
}
break;
case 3:
if (lq->front==lq->rear) /*队空*/
printf(">>没有排列的患者\n");
else
{
s=lq->front->next;
printf(">>排队患者:");
while (s!=NULL)
{
printf("%s",s->data);
s=s->next;
}
printf("\n");
}
break;
}
}
}
void main()
{
SeeDoctor();
}
本程序的一次执行结果如下:
1:排队2:看医生3:查看排队0:下班 请选择:1↙
>>输入患者姓名:Smith↙
1:排队2:看医生3:查看排队0:下班 请选择:1↙
>>输入患者姓名:John↙
1:排队2:看医生3:查看排队0:下班 请选择:3↙
>>排队患者:Smith John
1:排队2:看医生3:查看排队0:下班 请选择:1↙
>>输入患者姓名:Mary↙
1:排队2:看医生3:查看排队0:下班 请选择:2↙
>>患者Smith看医生
1:排队2:看医生3:查看排队0:下班 请选择:2↙
>>患者John看医生
1:排队2:看医生3:查看排队0:下班 请选择:0↙
>>请排队的患者明天就医