6. 编写病人看病模拟程序。在病人排队过程中主要重复以下两件事:
(1)病人到达诊室,将病历本交给护士,排到等待队列中候诊;
(2)护士从等待队列中取出下一位病人的病历,该病人进入就诊室候诊。
要求模拟病人等待就诊这一过程,主要功能说明如下:
(1)排队—>输入排队病人的病历号,加入到病人排队队列中。
(2)就诊—>病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3)查看排队—>从队首到队尾列出所有排队病人的病历号。
- #include
- #include
-
- 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;
- }
-
-