NoneLeZ 2020-04-04 16:53 采纳率: 50%
浏览 623
已采纳

医院排队就诊问题(C语言实现)求大神帮忙查看一下如何修改这些错误

问题描述:
医院急诊科室,有医生1名
现有病人7名,先后到达
病人病情轻重各有不同(分3级,3级最重,1级最轻),重症的优先就诊;病症相同的,先来的先就诊。
模型假设:
1.病人挂完号后进入对应的科室,每位病人属性包括姓名,性别,和身份证号
2.一开始的时候,医生空闲(等待病人)。
3.有护士根据病人病情,给出病情优先级后,再排队。
4.排队的病人按照先后次序排队,重症的优先就诊,病症相同的,先来的先就诊。。
5.一位医生每次只能看一个病人。
解决方案模型:
1. 程序模拟医院排队就诊,程序开始输入病人资料(包括优先级,姓名,性别,和身份证号)。
2. 设置一个病人的优先队列,按照优先级由高到低,分段排队,最开头的是优先级最高的病人;如果优先级相同,那么按照先来后到的顺序排队。
3. 对病人队列有两种操作,pop与push,医生每次从病人队列里面pop一个病人,并打印病人信息(包括优先级,姓名,性别,和身份证号),直到队列空。
————————————————
运行输入:
请按照优先级,姓名,性别,和身份证号顺序输入:
1 吕雅畅 男 141130198509277099
1 卞丹丹 女 532925197204181629
2 潘德茂 男 500114197005227938
1 邬碧玉 女 620721198202232320
3 金慧雅 女 533123198508252640
2 岑俊茂 男 152526198707214777
3 毕采萱 女 420600198202107509

输出:
就诊顺序......
3 金慧雅 女 533123198508252640
3 毕采萱 女 420600198202107509
2 潘德茂 男 500114197005227938
2 岑俊茂 男 152526198707214777
1 吕雅畅 男 141130198509277099
1 卞丹丹 女 532925197204181629
1 邬碧玉 女 620721198202232320

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
int M=0;
int N=0;
typedef int Status;
typedef struct ElemType
{
    int level;
    char name[20];
    char gender;
    char ID[20];

}ElemType;
typedef struct Node   //结点结构
{
    ElemType data;
    struct Node *next;
}Node,*QueuePtr;

typedef struct
{
    QueuePtr front,rear;
} LinkQueue;

Status InitQueue(LinkQueue *Q)  // 队列初始化
{
   QueuePtr p;
   p=(QueuePtr)malloc(sizeof(QueuePtr));
   if(!p)
   {
       printf("内存分配失败");
       return ERROR;
   }
   Q=(LinkQueue*)malloc(sizeof(LinkQueue));
   if(!Q)
   {
       printf("内存分配失败");
       return ERROR;
   }
   p->next=NULL;
   Q->front=p;
   Q->front=Q->rear;
   return OK;
}

Status EnQueue(LinkQueue *Q, ElemType e)  //入队
{
    QueuePtr s=(QueuePtr)malloc(sizeof(Node));
    if(!s)
    {
       printf("内存分配失败");
       return ERROR;
    }
    s->data=e;
    s->next=NULL;
    Q->rear->next=s;      //把拥有元素e的新节点s赋值给队尾的后继节点
    Q->rear=s;            //把当前s设置为队尾节点,rear指向s
    return OK;
}

Status DeQueue(LinkQueue *Q,ElemType *e)  //出队
{
    QueuePtr p;
    if(Q->front==Q->rear)
    {
        printf("队列为空!");
        return ERROR;
    }

    p=Q->front->next;     //  将预删除的队头结点暂存给p
    *e=p->data;             // 将删除的队头结点赋值给e 即出队
    Q->front->next=p->next;  //  将原队头结点后继p->next 赋值给现投结点后继

    if(Q->rear==p)
    {
        Q->rear=Q->front;      //若队头是队尾,则删除后将rear指向头结点

    }
     free(p);

    return OK;
}

Status PriorEnQueue(LinkQueue *Q1,LinkQueue *Q2,ElemType *e)
{
    if(e->level==3)
       {
           EnQueue(Q1,e);
       }
    else
       {
          EnQueue(Q2,e);
       }

        return OK;

}


Status PriorDeQueue(LinkQueue*Q1,LinkQueue*Q2)
{
    ElemType *e;
    if(!(Q2->front==Q2->rear))
       e=DeQueue(Q2,e);
    else if(!(Q1->front==Q1->rear))
        e=DeQueue(Q1,e);
    else
    {
        return ERROR;
    }
    return OK;

}

Status GetIN(LinkQueue*Q1,LinkQueue*Q2,ElemType*e)
{
    int i;
    int n;
    printf("请输入前来就诊的病人数量:");
    scanf("%d",&n);
    for(i=M;i<M+N;i++)
    {
        printf("\n请输入第%d个病人的优先级:",i+1);
        scanf("%d",&e[i].level);
        printf("\n请输入第%d个病人的姓名:",i+1);
        scanf("%s",e[i].name);
        printf("\n请输入第%d个病人的性别:",i+1);
        scanf("%s",&e[i].gender);
        printf("\n请输入第%d个病人的身份证:",i+1);
        scanf("%s",e[i].ID);
        PriorEnQueue(Q1,Q2,e);
    }
    M=M+n;
    return OK;
}
Status ShowInformation(ElemType *e)
{
    int i;
    LinkQueue *Q1,*Q2;
    InitQueue(Q1);
    InitQueue(Q2);
    PriorDeQueue(Q1,Q2);
    printf("优先级----------姓名----------性别----------身份证\n");
    for(i=N;i<N;i++)
    {
        printf("\n");
        printf("%5d %5s %5s %10s",e[i].level,e[i].name,&e[i].gender,e[i].ID);
    }
    return OK;
}
int main()
{
    LinkQueue *Q1,*Q2;
    ElemType *e;
    GetIN(Q1,Q2,e);
    ShowInformation(e);
    return 0;

}






图片说明

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-04-04 20:33
    关注

    错误太多了,只能简单修改下编译错误

    // Q1062027.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define OK 1
    #define ERROR 0
    int M=0;
    int N=0;
    typedef int Status;
    typedef struct ElemType
    {
        int level;
        char name[20];
        char gender;
        char ID[20];
    
    }ElemType;
    typedef struct Node   //结点结构
    {
        ElemType data;
        struct Node *next;
    }Node,*QueuePtr;
    
    typedef struct
    {
        QueuePtr front,rear;
    } LinkQueue;
    
    Status InitQueue(LinkQueue **Q)  // 队列初始化
    {
       QueuePtr p;
       p=(QueuePtr)malloc(sizeof(QueuePtr));
       if(!p)
       {
           printf("内存分配失败");
           return ERROR;
       }
       *Q=(LinkQueue*)malloc(sizeof(LinkQueue));
       if(!(*Q))
       {
           printf("内存分配失败");
           return ERROR;
       }
       p->next=NULL;
       (*Q)->front=p;
       (*Q)->front=(*Q)->rear;
       return OK;
    }
    
    Status EnQueue(LinkQueue *Q, ElemType e)  //入队
    {
        QueuePtr s=(QueuePtr)malloc(sizeof(Node));
        if(!s)
        {
           printf("内存分配失败");
           return ERROR;
        }
        s->data=e;
        s->next=NULL;
        Q->rear->next=s;      //把拥有元素e的新节点s赋值给队尾的后继节点
        Q->rear=s;            //把当前s设置为队尾节点,rear指向s
        return OK;
    }
    
    Status DeQueue(LinkQueue *Q,ElemType *e)  //出队
    {
        QueuePtr p;
        if(Q->front==Q->rear)
        {
            printf("队列为空!");
            return ERROR;
        }
    
        p=Q->front->next;     //  将预删除的队头结点暂存给p
        *e=p->data;             // 将删除的队头结点赋值给e 即出队
        Q->front->next=p->next;  //  将原队头结点后继p->next 赋值给现投结点后继
    
        if(Q->rear==p)
        {
            Q->rear=Q->front;      //若队头是队尾,则删除后将rear指向头结点
    
        }
         free(p);
    
        return OK;
    }
    
    Status PriorEnQueue(LinkQueue *Q1,LinkQueue *Q2,ElemType e)
    {
        if(e.level==3)
           {
               EnQueue(Q1,e);
           }
        else
           {
              EnQueue(Q2,e);
           }
    
            return OK;
    
    }
    
    
    Status PriorDeQueue(LinkQueue*Q1,LinkQueue*Q2)
    {
        ElemType e;
        if(!(Q2->front==Q2->rear))
           DeQueue(Q2,&e);
        else if(!(Q1->front==Q1->rear))
           DeQueue(Q1,&e);
        else
        {
            return ERROR;
        }
        return OK;
    
    }
    
    Status GetIN(LinkQueue*Q1,LinkQueue*Q2,ElemType*e)
    {
        int i;
        int n;
        printf("请输入前来就诊的病人数量:");
        scanf("%d",&n);
        for(i=M;i<M+n;i++)
        {
            printf("\n请输入第%d个病人的优先级:",i+1);
            scanf("%d",&e[i].level);
            printf("\n请输入第%d个病人的姓名:",i+1);
            scanf("%s",e[i].name);
            printf("\n请输入第%d个病人的性别:",i+1);
            scanf("%s",&e[i].gender);
            printf("\n请输入第%d个病人的身份证:",i+1);
            scanf("%s",e[i].ID);
            PriorEnQueue(Q1,Q2,e[i]);
        }
        M=M+n;
        return OK;
    }
    Status ShowInformation(ElemType *e)
    {
        int i;
        LinkQueue *Q1,*Q2;
        InitQueue(&Q1);
        InitQueue(&Q2);
        PriorDeQueue(Q1,Q2);
        printf("优先级----------姓名----------性别----------身份证\n");
        for(i=N;i<N;i++)
        {
            printf("\n");
            printf("%5d %5s %5s %10s",e[i].level,e[i].name,&e[i].gender,e[i].ID);
        }
        return OK;
    }
    int main()
    {
        LinkQueue Q1,Q2;
        Q1.front=Q1.rear=NULL;
        Q2.front=Q2.rear=NULL;
        ElemType e;
        GetIN(&Q1,&Q2,&e);
        ShowInformation(&e);
        return 0;
    
    }
    
    
    

    问题采纳了可以继续帮你看运行的错误

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题