标题:
|
患者到医院看病事件模拟
|
时 限:
|
1000 ms
|
内存限制:
|
10000 K
|
总时限:
|
3000 ms
|
描述:
|
患者到医院看病的顺序是:先排队等候,再看病治疗。要求设计一个算法,模拟病人等候就诊的过程。
其中:“病人到达”用命令“A”(或“a”)表示,“护士让下一位就诊”用“N”(或“n”)表示,“不再接收病人排队”用“S”(或“s”)表示。 |
输入:
|
A(或a) 病历号x
N(或n) S(或s) |
输出:
|
病历号为x的病人入队,无输出
若无病人,显示无病人就诊;否则输出队列中的第一个病人就诊信息 今天不再接收病人排队,输出队列中所有病人的病历号 若输入其它命令,则输出"输入命令不合法!" |
输入样例:
|
A 123
n n a 124 a 125 x s |
输出样例:
|
病历号为123的病人就诊
无病人就诊 输入命令不合法! 今天不再接收病人排队,下列排队的病人依次就诊:124 125 |
提示:
|
|
来源:
|
|
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
int d_index;
struct node *next;
}*List;
typedef struct nn
{
char ch;
int c_index;
struct nn *next;
}*Com;
List Init()
{
List head=malloc(sizeof(struct node));
head->next=NULL;
head->data=-1;
head->d_index=-1;
return head;
}
Com Ini()
{
Com head=malloc(sizeof(struct nn));
head->next=NULL;
head->ch='L';
head->c_index=-1;
return head;
}
int SeeDocter(List head,int index)
{ int Person_num=-1;
int tem_index=1;
while(head->next!=NULL&&tem_index<index)
{
if(head->next->data>0)
{
Person_num=head->next->data;
head->next->data=0;
break;
}
head=head->next;
tem_index++;
}
return Person_num;
}
void Add_to_list(List head,int data,int index)
{
List newnode=malloc(sizeof(struct node));
if(newnode==NULL)
{
printf("memory out of use!\n");
exit(1);
}
while(head->next!=NULL)
{
head=head->next;
}
newnode->data=data;
newnode->d_index=index;
newnode->next=NULL;
head->next=newnode;
}
void Add_command(Com head, char c,int index)
{
Com newnode=malloc(sizeof(struct nn));
if(newnode==NULL)
{
printf("memory out of use!\n");
exit(1);
}
while(head->next!=NULL)
{
head=head->next;
}
newnode->ch=c;
newnode->c_index=index;
newnode->next=NULL;
head->next=newnode;
}
void main()
{char cm;
char select_char;
int select_index;
int Person=-1;
int data;
int index=0;
int chose=1;
int c_index=1;
int d_index=1;
List head=Init();
Com m_com=Ini();
while(1)
{
scanf("%c",&cm);
if(cm=='S'||cm=='s')
{ Add_command(m_com,'s',c_index);
break;
}
switch (cm)
{
case 'A':
case 'a':Add_command(m_com,'a',c_index);
scanf("%d",&data);
Add_to_list(head,data,d_index);
d_index++;
c_index++;
break;
case 'N':
case 'n':Add_command(m_com,'n',c_index);
Add_to_list(head,0,d_index);
c_index++;
d_index++;
break;
case '\n':break;
default:Add_command(m_com,cm,c_index);
Add_to_list(head,-100,d_index);
c_index++;
d_index++;
break;
}
}
while(m_com->next->ch!='s')
{
select_char=m_com->next->ch;
select_index=m_com->next->c_index;
switch(select_char)
{
case 'a':break;
case 'n':Person=SeeDocter(head,select_index);
if(Person>0)
printf("病历号为%d的病人就诊\n",Person);
else
printf("无病人就诊\n");
break;
default: printf("输入命令不合法!\n");break;
}
m_com=m_com->next;
}
printf("今天不再接收病人排队,下列排队的病人依次就诊:");
while(head->next!=NULL)
{
if(head->next->data>0)
{
printf("%d \n",head->next->data);
head=head->next;
}
else
head=head->next;
}
}