1. 程式人生 > >第七週專案五C/C++資料結構實踐——排隊看病模擬(佇列)

第七週專案五C/C++資料結構實踐——排隊看病模擬(佇列)

/*   
*Copyright (c) 2017,煙臺大學計算機與控制工程學院   
*All rights reserved.   
*檔名稱:.cpp
*作    者:高晶   
*完成日期:2017年11月09日   
*版 本 號:v1.0   
* 資料結構實踐——排隊看病模擬(佇列)
/* 
【專案 - 排隊看病模擬】 
  編寫一個程式,反映病人到醫院看病,排隊看醫生的情況。在病人排隊過程中,主要重複兩件事: 
  (1)病人到達診室,將病歷本交給護士,排到等待佇列中候診。 
  (2)護士從等待佇列中取出下一位病人的病歷,該病人進入診室就診。 
  要求模擬病人等待就診這一過程。程式採用選單方式,其選項及功能說明如下: 

  (1)排隊——輸入排隊病人的病歷號,加入到病人排隊佇列中。 
  (2)就診——病人排隊佇列中最前面的病人就診,並將其從佇列中刪除。 
  (3)檢視排隊——從隊首到隊尾列出所有的排隊病人的病歷號。 
  (4)不再排隊,餘下順序就診——從隊首到隊尾列出所有的排隊病人的病歷號,並退出執行。 
  (5)下班——退出執行,提示未就診的病人明天再來。 

  執行結果可以如下圖所示: 


程式碼:

#include <stdio.h>
#include <malloc.h>
typedef struct qnode
{
    int data;
    struct qnode *next;
} QNode;            /*鏈隊結點型別*/

typedef struct
{
    QNode *front,*rear;
} QuType;           /*鏈隊型別*/

void SeeDoctor()
{
    int sel,flag=1,find,no;
    QuType *qu;
    QNode *p;
    qu=(QuType *)malloc(sizeof(QuType));    /*建立空隊*/
    qu->front=qu->rear=NULL;
    while (flag==1)                             /*迴圈執行*/
    {
        printf("1:排隊 2:就診 3:檢視排隊 4.不再排隊,餘下依次就診 5:下班  請選擇:");
        scanf("%d",&sel);
        switch(sel)
        {
        case 1:
            printf("  >>輸入病歷號:");
            do
            {
                scanf("%d",&no);
                find=0;
                p=qu->front;
                while (p!=NULL && !find)
                {
                    if (p->data==no)
                        find=1;
                    else
                        p=p->next;
                }
                if (find)
                    printf("  >>輸入的病歷號重複,重新輸入:");
            }
            while (find==1);
            p=(QNode *)malloc(sizeof(QNode));   /*建立結點*/
            p->data=no;
            p->next=NULL;
            if (qu->rear==NULL)                 /*第一個病人排隊*/
            {
                qu->front=qu->rear=p;
            }
            else
            {
                qu->rear->next=p;
                qu->rear=p; /*將*p結點入隊*/
            }
            break;
        case 2:
            if (qu->front==NULL)                /*隊空*/
                printf("  >>沒有排隊的病人!\n");
            else                                /*隊不空*/
            {
                p=qu->front;
                printf("  >>病人%d就診\n",p->data);
                if (qu->rear==p)            /*只有一個病人排隊的情況*/
                {
                    qu->front=qu->rear=NULL;
                }
                else
                    qu->front=p->next;
                free(p);
            }
            break;
        case 3:
            if (qu->front==NULL)            /*隊空*/
                printf("  >>沒有排列的病人!\n");
            else                            /*隊不空*/
            {
                p=qu->front;
                printf("  >>排隊病人:");
                while (p!=NULL)
                {
                    printf("%d ",p->data);
                    p=p->next;
                }
                printf("\n");
            }
            break;
        case 4:
            if (qu->front==NULL)            /*隊空*/
                printf("  >>沒有排列的病人!\n");
            else                            /*隊不空*/
            {
                p=qu->front;
                printf("  >>病人按以下順序就診:");
                while (p!=NULL)
                {
                    printf("%d ",p->data);
                    p=p->next;
                }
                printf("\n");
            }
            flag=0;                         /*退出*/
            break;
        case 5:
            if (qu->front!=NULL)            /*隊不空*/
                printf("  >>請排隊的病人明天就醫!\n");
            flag=0;                     /*退出*/
            break;
        }
    }
    p=qu->front;  //銷燬佇列
    while (p!=NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

int main()
{
    SeeDoctor();
    return 0;
}
執行結果: