暑假期间,在学校小学期做了数据结构的第二阶段作业,就诊管理。
就诊管理模拟病人到医院看病,选择看病的诊室排队看医生的情况。在病人排队过程中,主要重复两件事:①病人到达诊室,将病历本交给护士,排到等待队列中候诊。②护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊(请参照铁大医院设置科室)
设计要求:
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
(1) 显示可选择的各诊室。
(2) 排队——输入排队病人的病历号,加入到某诊室病人排队队列中。
(3) 就诊——该诊室病人排队队列中最前面的病人就诊,并将其从队列中删除。
(4) 查看各诊室排队——从队首到队尾列出所有的该诊室排队病人的病历号。
(5) 不再排队,余下依次就诊——从队首到队尾列出所有的排队病人的病历号及就诊诊室,并退出运行。
(6) 下班——退出运行。
#pragma warning(disable:4996) #include <stdio.h> #include <malloc.h> typedef struct qnode { int data; struct qnode* next; } QNode; /*链队结点类型*/ typedef struct { QNode* front, * rear; } QuType; /*链队类型*/ //排队 void PaiDui(QuType* qu,int num) { int find; QNode* p, * q; find = 0; p = qu->front; while (p != NULL && !find) { if (p->data == num) find = 1; else p = p->next; } if (find) { printf("病历号重复,该病人之前已进入到队列 "); } else { p = (QNode*)malloc(sizeof(QNode)); /*创建结点*/ p->data = num; p->next = NULL; if (qu->rear == NULL) /*第一个病人排队*/ { qu->front = qu->rear = p; } else { qu->rear->next = p; qu->rear = p; /*将*p结点入队*/ } } } //就诊 int JiuZhen(QuType* qu) { QNode* p, * q; int jiuzhen=-1; if (qu->front == NULL) { printf("没有排队中的病人"); } else { p = qu->front; jiuzhen = p->data; printf("病人%d就诊",p->data); if (qu->rear == p) { qu->front = qu->rear = NULL; } else { qu->front = p->next; } free(p); } return jiuzhen; } //查询各诊室排队情况 void queryPaidui(QuType *qu) { QNode *p; if (qu->front == NULL) /*队空*/ printf(" >>没有排列的病人! "); else /*队不空*/ { p = qu->front; printf(" >>排队病人:"); while (p != NULL) { printf("%d ", p->data); p = p->next; } printf(" "); } } //全部就诊 void allJiuZhen(QuType *qu) { QNode* p; if (qu->front == NULL) /*队空*/ printf(" >>没有排列的病人! "); else /*队不空*/ { p = qu->front; printf(" >>病人按以下顺序就诊:"); while (p != NULL) { printf("%d ", p->data); p = p->next; } printf(" "); } } void SeeDoctor() { int sel, flag = 1, no,keshi,num=-1; int bingli[100]; int zhenshi[100]; int jilu=0,see3,see4; int m, n, j; QuType* qu,*qu1,*qu2,*qu3; qu = (QuType*)malloc(sizeof(QuType)); /*创建空队*/ qu1 = (QuType*)malloc(sizeof(QuType)); qu2 = (QuType*)malloc(sizeof(QuType)); qu3 = (QuType*)malloc(sizeof(QuType)); qu->front = qu->rear = NULL; qu1->front = qu1->rear = NULL; qu2->front = qu2->rear = NULL; qu3->front = qu3->rear = NULL; while (flag == 1) { printf(" *********************************************** "); printf(" 1.选择诊室 "); printf(" 2.排队 "); printf(" 3.就诊 "); printf(" 4.查看各诊室排队 "); printf(" 5.不再排队,依次就诊 "); printf(" 6.下班 "); printf(" *********************************************** "); printf("请选择:"); scanf("%d",&sel); switch (sel) { case 1: n = 1; j = 0; printf("1.外科 2.内科 3.皮肤科 4.骨科 "); //选择诊室,并分配病历号 scanf("%d", &keshi); zhenshi[jilu] = keshi; printf("分配病历号:"); scanf("%d",&no); while (n) //判断病历号分配是否有重复 { for (int i = 0; i < jilu;i++) { if (no == bingli[i]) { printf("病历号重复!请重新分配:"); break; } else { j++; } } if (j == jilu)break; else { scanf("%d", &no); } } bingli[jilu] = no; jilu++; break; case 2: printf(" >>输入病历号:"); scanf("%d",&num); m = -1; n = 0; for (int i = 0; i < jilu; i++) //获取排队病历号的诊室 { if (num == bingli[i]) { m = zhenshi[i]; break; } else { n++; } } if(n==jilu) { printf("该病例号并未被分配,请到诊室挂号再排队 "); } else { switch (m) //根据不同诊室进行排队 { case 1: PaiDui(qu,num); break; case 2: PaiDui(qu1,num); break; case 3: PaiDui(qu2,num); break; case 4: PaiDui(qu3,num); break; } } break; case 3: int panduan; printf("就诊诊室:1.外科 2.内科 3.皮肤科 4.骨科 "); scanf("%d",&see3); switch (see3) { case 1: panduan = JiuZhen(qu); if (panduan >= 0) //删除已就诊的病历号 { for (int i = 0; i < jilu; i++) { if (bingli[i] == panduan) { if (i == jilu - 1) { jilu--; } else { for (int j = i; j < jilu-1; j++) { bingli[i] = bingli[i + 1]; zhenshi[i] = zhenshi[i + 1]; } jilu--; } break; } } } break; case 2: panduan = JiuZhen(qu1); if (panduan >= 0) { for (int i = 0; i < jilu; i++) { if (bingli[i] == panduan) { if (i == jilu - 1) { jilu--; } else { for (int j = i; j < jilu-1; j++) { bingli[i] = bingli[i + 1]; zhenshi[i] = zhenshi[i + 1]; } jilu--; } break; } } } break; case 3: panduan = JiuZhen(qu2); if (panduan >= 0) { for (int i = 0; i < jilu; i++) { if (bingli[i] == panduan) { if (i == jilu - 1) { jilu--; } else { for (int j = i; j < jilu-1; j++) { bingli[i] = bingli[i + 1]; zhenshi[i] = zhenshi[i + 1]; } jilu--; } break; } } } break; case 4: panduan = JiuZhen(qu3); if (panduan >= 0) { for (int i = 0; i < jilu; i++) { if (bingli[i] == panduan) { if (i == jilu - 1) { jilu--; } else { for (int j = i; j < jilu-1; j++) { bingli[i] = bingli[i + 1]; zhenshi[i] = zhenshi[i + 1]; } jilu--; } break; } } } break; default: printf("输入格式错误!"); break; } break; case 4: printf("查看排队情况: "); printf("1.外科 2.内科 3.皮肤科 4.骨科 "); scanf("%d",&see4); switch (see4) { case 1: queryPaidui(qu); break; case 2: queryPaidui(qu1); break; case 3: queryPaidui(qu2); break; case 4: queryPaidui(qu3); break; } break; case 5: printf("外科诊室:"); allJiuZhen(qu); printf("内科诊室:"); allJiuZhen(qu1); printf("皮肤科诊室:"); allJiuZhen(qu2); printf("骨科诊室:"); allJiuZhen(qu3); flag = 0; break; case 6: if (qu->front != NULL|| qu1->front != NULL|| qu2->front != NULL|| qu3->front != NULL) /*队不空*/ printf(" >>请排队的病人明天就医! "); flag = 0; break; default: printf("输入格式错误!"); break; } } } int main() { SeeDoctor(); return 0; }
选择了四个诊室,如果有需求可以继续添加诊室,只需要再次添加几个队列就可以。
以上就是此次数据结构小学期第二阶段作业所得