第七週實踐項目5--排隊看病模擬

問題及代碼:

/*      
Copyright (c)2015,煙臺大學計算機與控制工程學院      
All rights reserved.      
文件名稱:第7周項目5--排隊看病模擬.cpp      
作    者:朱振華      
完成日期:2015年10月26日      
版 本 號: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,*q;
    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;
}


 

運行結果:

 

 學習心得:

         這個題目的隊列部分雖說自己不能獨立寫出來,但現在看着老師的代碼可以畫出來,這就是進步。另外,這個題目用到case,選擇用了do while,以前在編程中不太常用,所以在做題目的同時回頭翻了翻C++的書。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章