問題及代碼:
/*
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++的書。