标题:
患者到医院看病事件模拟
时 限:
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;
}


}