就诊管理(数据结构小学期)

暑假期间,在学校小学期做了数据结构的第二阶段作业,就诊管理。

就诊管理模拟病人到医院看病,选择看病的诊室排队看医生的情况。在病人排队过程中,主要重复两件事:病人到达诊室,将病历本交给护士,排到等待队列中候诊。护士从等待队列中取出下一位病人的病历,该病人进入诊室就诊(请参照铁大医院设置科室)

设计要求:

要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下:

(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;
}

 选择了四个诊室,如果有需求可以继续添加诊室,只需要再次添加几个队列就可以。

以上就是此次数据结构小学期第二阶段作业所得

作者:哦心有
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/haobox/p/14977077.html