病人看病模拟程序

6. 编写病人看病模拟程序。在病人排队过程中主要重复以下两件事:

(1)病人到达诊室,将病历本交给护士,排到等待队列中候诊;

(2)护士从等待队列中取出下一位病人的病历,该病人进入就诊室候诊。

要求模拟病人等待就诊这一过程,主要功能说明如下:

(1)排队—>输入排队病人的病历号,加入到病人排队队列中。

(2)就诊—>病人排队队列中最前面的病人就诊,并将其从队列中删除。

(3)查看排队—>从队首到队尾列出所有排队病人的病历号。
 

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int patientId;
    struct Node* next;
} Node;

typedef struct Queue {
    Node* front;
    Node* rear;
} Queue;

void initQueue(Queue* queue) {
    queue->front = NULL;
    queue->rear = NULL;
}

int isEmpty(Queue* queue) {
    return queue->front == NULL;
}

void enqueue(Queue* queue, int patientId) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->patientId = patientId;
    newNode->next = NULL;
    if (isEmpty(queue)) {
        queue->front = newNode;
        queue->rear = newNode;
    }
    else {
        queue->rear->next = newNode;
        queue->rear = newNode;
    }
}

int dequeue(Queue* queue) {

    Node* nodeToDelete = queue->front;
    int patientId = nodeToDelete->patientId;
    queue->front = nodeToDelete->next;//直接指向下一个
    free(nodeToDelete);
    if (queue->front == NULL) {
        queue->rear = NULL;
        //当queue->front == NULL为空时
        //基于前面的已经指向了下一个位置,
        //可以确定此时已经遍历完了整个队列,所以说,
        //队尾也要更新为NULL
        //因为我们这是删除队列的操作,如果说,删除完
        //当前元素后下一个为空,那就说明当前队列为空
        //当然要将队头尾都重置!
    }
    return patientId;
}

void displayQueue(Queue* queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty.\n");
        return;
    }
    Node* currentNode = queue->front;
    while (currentNode != NULL) {
        printf("%d ", currentNode->patientId);
        currentNode = currentNode->next;
    }
    printf("\n");

    //return  没必要写,等它执行结束函数也行
}

int main() {
    Queue queue;
    initQueue(&queue);

    int choice, patientId;
    do {
        printf("1. 排队\n");
        printf("2. 就诊\n");
        printf("3. 查看排队\n");
        printf("0. 退出\n");
        printf("请输入您的选择: ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            printf("请输入病历号: ");
            scanf("%d", &patientId);
            enqueue(&queue, patientId);
            break;
        case 2:
            if (!isEmpty(&queue)) {
                printf("就诊病历号: %d\n", dequeue(&queue));
            }
            else {
                printf("队列为空,没有病人在等待就诊。\n");
            }
            break;
        case 3:
            printf("当前排队病人的病历号: ");
            displayQueue(&queue);
            break;
        case 0:
            printf("程序已退出。\n");
            break;
        default:
            printf("无效选择,请重新输入。\n");
            break;
        }

        printf("\n");
    } while (choice != 0);

    return 0;
}


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值