【資料結構】佇列的應用-看病排隊候診問題
阿新 • • 發佈:2019-01-13
看病排隊候診問題
醫院各科室的醫生有限,病人到醫院看病時必須排隊就診,而病人病情有輕重之分,不能簡單地根據先來先服務的原則進行診斷治療,所以醫院根據病人的病情規定了不同的優先級別。醫生在診斷治療時,總是選擇優先級別高的病人進行診治,如果遇到兩個優先級別相同的病人,則選擇優先來排隊的病人進行診治。
基本要求:
(1)用佇列模擬上述病人看病排隊候診問題;
(2)兩個佇列分別對應不同的優先級別,優先順序高的佇列中的病人優先就診;
(3)按照從終端讀入數的方式進行模擬管理。
測試資料要求:
病人資訊包括:掛號編號、病歷號、看病的優先順序、姓名和性別。
病人類定義:
過載輸入:1、提示詞形式輸入 2、文字形式輸入
typedef struct Patient{ string Rt_No,Ce_No,Name,Sex; bool Prior; Patient(string R="0000", string C="0000", string N="He", string S="boy", bool P=false ) :Rt_No(R),Ce_No(C),Name(N),Sex(S),Prior(P){} friend istream &operator>>(istream &is,Patient &pat){ puts("Regist\tcase\tPrior\tname\tsex"); is>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex; if(!is) pat=Patient(); return is; } int Cin(){ puts("掛號編號 Registration number :");cin>>Rt_No; puts("病歷號 Case number :"); cin>>Ce_No; puts("看病的優先順序 Priority "); cin>>Prior; puts("姓名 name"); cin>>Name; puts("性別 sex"); cin>>Sex; } }QElemType;
佇列元素:
過載輸出運算子:
typedef struct QNode{ QElemType data; struct QNode *next; QNode (QElemType Data=t,struct QNode *Next=NULL){ data=Data;next=Next; } friend ostream & operator<<(ostream &os,const QNode &Q){ os<<Q.data.Rt_No<<"\t"<<Q.data.Ce_No<<"\t"<< (Q.data.Prior?"H":"L")<<"\t"<<Q.data.Name<<"\t" <<Q.data.Sex<<endl; } }QNode , *QueuePtr;
插入函式:
void EnQueue(LinkQueue &Q,QElemType e){
QueuePtr s=new QNode(e,NULL),L,R;
if(QueueEmpty(Q)){
Q.Front->next=s;
Q.Rear=s; return ;
}
L=Q.Front,R=L->next;
for(; L->next;L=L->next){
R=L->next;
if(R->data.Ce_No>e.Ce_No)
break;
}
R=L->next;
s->next=R;
L->next=s;
if(R==NULL){
Q.Rear=s;
}
//Q.Rear->next=s;
//Q.Rear=s;
}
完整的除錯程式碼:
#include<string>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct Patient{
string Rt_No,Ce_No,Name,Sex;
bool Prior;
Patient(string R="0000",
string C="0000",
string N="He",
string S="boy",
bool P=false )
:Rt_No(R),Ce_No(C),Name(N),Sex(S),Prior(P){}
friend istream &operator>>(istream &is,Patient &pat){
puts("Regist\tcase\tPrior\tname\tsex");
is>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex;
if(!is) pat=Patient();
return is;
}
int Cin(){
puts("掛號編號 Registration number :");cin>>Rt_No;
puts("病歷號 Case number :"); cin>>Ce_No;
puts("看病的優先順序 Priority "); cin>>Prior;
puts("姓名 name"); cin>>Name;
puts("性別 sex"); cin>>Sex;
}
}QElemType;
QElemType t={"000000","000000","He","boy",false};
typedef struct QNode{
QElemType data;
struct QNode *next;
QNode (QElemType Data=t,struct QNode *Next=NULL){
data=Data;next=Next;
}
friend ostream & operator<<(ostream &os,const QNode &Q){
os<<Q.data.Rt_No<<"\t"<<Q.data.Ce_No<<"\t"<<
(Q.data.Prior?"H":"L")<<"\t"<<Q.data.Name<<"\t"
<<Q.data.Sex<<endl;
}
}QNode , *QueuePtr;
typedef struct {
QueuePtr Front,Rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.Front=new QNode ;
Q.Rear=Q.Front;
Q.Front->next=NULL;
}
void ClearQueue(LinkQueue &Q){
QueuePtr p,s;
p=Q.Front->next;
Q.Front->next=NULL;
while(p){
s=p;p=p->next;
delete s;
}
Q.Rear=Q.Front;
}
bool QueueEmpty(LinkQueue Q){
return Q.Front==Q.Rear?true:false;
}
int QueueLength(LinkQueue Q){
int len=0;
QueuePtr p=Q.Front->next;
while(p){
len++;p=p->next;
}
return len;
}
void EnQueue(LinkQueue &Q,QElemType e){
QueuePtr s=new QNode(e,NULL),L,R;
if(QueueEmpty(Q)){
Q.Front->next=s;
Q.Rear=s; return ;
}
L=Q.Front,R=L->next;
for(; L->next;L=L->next){
R=L->next;
if(R->data.Ce_No>e.Ce_No)
break;
}
R=L->next;
s->next=R;
L->next=s;
if(R==NULL){
Q.Rear=s;
}
//Q.Rear->next=s;
//Q.Rear=s;
}
void DeQueue(LinkQueue &Q,QElemType &e){
if(QueueEmpty(Q)){
puts("error !!! queue is empty !!!");return ;
}
QueuePtr s=Q.Front->next;
Q.Front->next=s->next;
e=s->data;
if(Q.Rear==s){
Q.Rear=Q.Front;
}
delete s;
}
void GetHead(LinkQueue Q,QElemType &e){
if(QueueEmpty(Q)){
puts("error !!! queue is empty !!!");return ;
}
e=Q.Front->next->data;
}
void QueueTraverse(LinkQueue Q){
puts("Regist\tcase\tPrior\tname\tsex");
for(QueuePtr p=Q.Front->next;p;p=p->next){
cout<<*p<<endl;
}
}
void Warning(bool Pattern=false,int No=-1,int n=-1){
if(!Pattern){
puts("");return ;
}else if(No!=-1&&n==-3){
printf("請輸入第%d位病人的資訊:\n",No);
}else if(No==0&&n==-2){
printf("請輸入n的值:(n位病人)\n");
}else if(No==1){
printf("請依次輸入%d位病人的資訊:\n",n);
}else if(No==2){
printf("\n\n病情較為嚴重的,共有%d人,分別為:\n",n);
}else if(No==3){
printf("\n\n病情較為輕微的,共有%d人,分別為:\n",n);
}
}
int main()
{
int n;
bool Pattern = false;
Warning(Pattern,0,-2);
cin>>n;
QElemType pat;
LinkQueue QH,QL;
InitQueue(QH),InitQueue(QL);
Warning(Pattern,1,n);
for(int i=0;i<n;i++){
Warning(Pattern,i+1,-3);
//cin>>pat.Rt_No>>pat.Ce_No>>pat.Prior>>pat.Name>>pat.Sex;
if(Pattern)
pat.Cin();
else
cin>>pat;
EnQueue((pat.Prior?QH:QL),pat);
}
Warning(Pattern,2,QueueLength(QH));
QueueTraverse(QH);
Warning(Pattern,3,QueueLength(QL));
QueueTraverse(QL);
}
/*
6
0004 0012 1 張三 男
0002 0002 0 李四 女
0005 0007 1 王五 男
0001 0015 0 佳麗 女
0008 0011 1 龍九 男
0002 0010 0 小倩 女
*/