就诊管理(数据结构小学期)
暑假期间,在学校小学期做了数据结构的第二阶段作业,就诊管理。
就诊管理模拟病人到医院看病,选择看病的诊室排队看医生的情况。在病人排队过程中,主要重复两件事:①病人到达诊室,将病历本交给护士,排到等待队列中候诊。②护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊(请参照铁大医院设置科室)
设计要求:
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:
(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("病历号重复,该病人之前已进入到队列\n");
}
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(" >>没有排列的病人!\n");
else /*队不空*/
{
p = qu->front;
printf(" >>排队病人:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
//全部就诊
void allJiuZhen(QuType *qu)
{
QNode* p;
if (qu->front == NULL) /*队空*/
printf(" >>没有排列的病人!\n");
else /*队不空*/
{
p = qu->front;
printf(" >>病人按以下顺序就诊:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
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(" ***********************************************\n");
printf(" 1.选择诊室\n");
printf(" 2.排队\n");
printf(" 3.就诊\n");
printf(" 4.查看各诊室排队\n ");
printf(" 5.不再排队,依次就诊\n");
printf(" 6.下班\n");
printf(" ***********************************************\n");
printf("请选择:");
scanf("%d",&sel);
switch (sel)
{
case 1:
n = 1;
j = 0;
printf("1.外科 2.内科 3.皮肤科 4.骨科\n"); //选择诊室,并分配病历号
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("该病例号并未被分配,请到诊室挂号再排队\n");
}
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.骨科\n");
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("查看排队情况:\n");
printf("1.外科 2.内科 3.皮肤科 4.骨科\n");
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(" >>请排队的病人明天就医!\n");
flag = 0;
break;
default:
printf("输入格式错误!");
break;
}
}
}
int main()
{
SeeDoctor();
return 0;
}
选择了四个诊室,如果有需求可以继续添加诊室,只需要再次添加几个队列就可以。
以上就是此次数据结构小学期第二阶段作业所得

浙公网安备 33010602011771号