數據結構 課程設計報告書
題目: 模擬醫院系統
目錄
一、選題背景.................................................................3
二、需求分析.................................................................3
2.1 任務目標..............................................................3
2.2 功能分析..............................................................3
三、開發環境 ...............................................................4
四、總體設計.................................................................4
4.1 軟件框架圖..........................................................4
4.2 主界面設計..........................................................4
4.3存儲結構計...........................................................4
五、詳細設計.................................................................5
5.1系統子程序及功能設計簡介...............................5
5.2模塊功能說明.......................................................7
六、心得體會.................................................................10
一、選題背景
通過對醫院系統的系統分析、系統設計、編碼和調試等工作的實踐,了解醫院系統的一般設計方法和實現思路。
二、需求分析
2.1 任務目標
搞清楚醫院系統在C程序中利用源代碼是如何實現的,用到哪些數據結構,以及它的一些設計思路和科學的設計流程。
2.2 功能分析
根據程序模塊划分分析,程序應該實現以下功能:
1.進入醫院系統程序
2.醫院地點介紹
3.查看路線
4.查詢地點間最短路徑
5.地點信息查詢
6.更改圖信息
7.查詢兩地間可行路徑
8.打印鄰接矩陣
9.醫院排隊候診
10.退出
三、開發環境
VC++6.0
四、總體設計
4.1 軟件框架圖
4.2主界面設計
為了實現醫院系統各功能的管理,首先設計一個含有多個菜單項的主控菜單子程序以鏈接系統的各項子功能,方便用戶使用本系統。本系統主控菜單運行界面如下圖:

4.3存儲結構設計 本系統采用圖結構類型存儲抽象醫院圖的信息。其中各科室間的鄰接關系用圖的鄰接矩陣類型來存儲;科室信息用結構數組存儲,其中每個數組元素是一個結構變量,包括科室編號、科室名稱及科室介紹三個分量;圖的頂點個數及邊的個數由分量vexnum、arcnum表示,它們是整型數據。此外,本系統還設置了三個全局變量:visited[]數組用於存儲頂點是否被訪問標志;d[]數組用於存放邊上的權值或存儲查找路徑頂點的編號;hospital是一個圖結構的全局變量。 其中,“醫院排隊候診功能”采用鏈式隊列來實現。定義兩個隊列q1和q2,q1對應優先級別低的隊列,q2對應優先級別高的隊列,當有新的病人要加入隊列候診時,根據用戶從鍵盤終端輸入的優先級別,將該病人加入相應的隊列中,並同時生成一個對應該病人的ID編號,需要說明的是該ID編號是按照病人到達醫院進行排隊的先后順序依次生成的。醫生根據優先級別選擇病人進行診治,因此程序應該首先查看優先級別最高的隊列q2,若隊列q2不為空,則對隊列q2執行出隊操作,否則因對隊列q1執行出隊操作。為方便起見,可以定義一個帶有優先級別的隊列的入隊操作MyEnQueue()。 五、詳細設計 5.1系統子程序及功能簡介 本系統共設置18個子程序,各子程序的函數名及功能說明如下。 (1)maraph initgraph() //圖的初始化 (2)Int locatevex(mgraph c,int v) //查找景點在圖中的序號 (3)Void path(mgraph c,int m,int n,int k) //打印序號為(m,n)景點間的長度不度不超過8個景點的路徑 (4)Int allpath(mgraph c) //打印兩景點間的景點個數不超過8的所有路徑,調用(3) (5)void shortestpath_dij(mgraph c) //用Dijkstra算法,求一個景點到其他景間的最短路徑,並打印 以下編號(6)——(12)是圖的基本操作。包括重建圖,更新信息,刪除,增加結點和邊等。 (6)int creatgragh(mgraph *c) //建圖。以圖的鄰接矩陣存儲圖,返回值:1或-1 (7)int newgraph(mgraph *c)//更新圖的部分信息。返回值:1 (8)int enarc(mgraph *c) //增加一條邊。返回值:1 (9)int envex(mgraph *c) //增加一個結點。返回值:1 (10)int delvex(mgraph *c) //刪除圖的一個頂點。返回值:1 (11)int delarc(mgraph *c) //刪除圖的一條邊。返回值:1 (12)void printmatrix(mgraph c) //刪除圖的鄰接矩陣 (13)int changegraph(mgraph *c) //圖操作的主調函數。返回值:1 (14)void shortestpath_floyd(mgraph c) //用Floyd算法求任意兩景點間的最短路徑,並輸出 (15)void seeabout(mgraph c) //查詢景點的信息 (16)void browsecompus(mgraph c) //顯示所有景點信息 (17)void mainwork() //工作區函數。操作區用戶界面 (18)void mian() //主函數。設定界面的顏色和大小,調用工作區模塊函數 (19)void insertTail(jiedian * pHead, int ID , char name[], int numroom, char a[], int cost ) ////鏈表的尾插法 (20) void nodetest( jiedian * travel ) //鏈表的遍歷 (21) void wenjianfun ( Jiedian tou ) //文本文檔的處理 (22)int createheap(MaxHeap H ) //最大堆的創建 (23) void insert( MaxHeap H, DataType item ) //最大堆的插入 (24) DataType DeleteMax( MaxHeap H ) //最大堆的刪除 (25) int InitQueue( Queue *q ) //初始化隊列 (26) int EnQueue( Queue *q,int id ) //元素插入到循環隊列隊尾 (27) void MYEnQueue( Queue *q1, MaxHeap q2, Queue *zong, DataType d, int priority) //根據優先級選擇隊列(進入) (28) DataType MYDeQueue(Queue *q1,MaxHeap q2) //根據優先級選擇隊列(出) 5.2模塊功能說明 本系統除了要完成圖的初始化功能外還設置了9個子功能菜單。圖的初始化由函數initgraph實現。依據讀入的圖的頂點個數和邊的個數,分別初始化圖結構中圖的頂點向量數組和圖的鄰接矩陣。9個子功能的設計描述如下: (1)醫院地點介紹 醫院地點介紹由函數browsehospital實現。當用戶選擇該功能,系統即能輸出醫院全部地點的信息:包括地點編號、地點名稱、地點簡介。 (2)查看瀏覽路線 查看瀏覽路線由函數shortretpath_dij實現。該功能采用迪傑斯特拉(Dijkstra)算法實現。當用戶選擇該功能,系統能根據用戶輸入的起始地點編號,求出從該地點到其它地點的最短路徑線路及距離。 (3)查詢地點間最短路徑 查詢地點間最短路徑由函數shortretpath_floyd實現。該功能采用弗洛伊德(Floyd)算法實現。當用戶選擇改功能,系統能根據用戶輸入的起始地點及目的地點編號,查詢任意兩個地點之間的最短路徑線路及距離。 (4)地點信息查詢 地點信息查詢由函數seeabout實現。該功能根據用戶輸入的地點編號輸出該地點的相關信息。如地點編號、名稱等。 (5)更改圖的信息 更改圖的信息功能由主調函數changegraph及若干子函數完成,可以實現圖的若干基本操作。如增加新的地點、刪除邊、重建圖等。 (6)查詢地點間可行路徑 查詢地點間所有可行路徑由函數allpath和函數path實現,其中path函數是直接遞歸函數。由於是無向網,如果網中的邊數很多,任意兩個地點之間的所有路徑也會有很多,但很多路徑是無實際意義的(有近路,為什么要走遠路呢)。所以本算法在求得的兩地點間所有可行路徑中,限制只輸出路徑長度不超過8個地點的路線。 (7)打印鄰接矩陣 打印鄰接矩陣即輸出圖的鄰接矩陣的值,由函數printmatrix實現。 (8)醫院排隊候診 醫院排隊候診通過定義兩個隊列來實現優先級別的選擇。為方便起見,可以定義一個帶有優先級別的隊列的入隊操作MyEnQueue()。 (9)退出 退出即退出醫院系統,由函數exit(0)實現。 六、心得體會 在數據結構課程設計這門課程中,我們通過小組組合,做出了該門課程的課設報告。我們組做的是醫院系統,在初步了解一般醫院系統結構后,上網查找相關知識,運用所學,通過各個組員在這一星期的不斷嘗試,最終完成了我們的任務。這次課設,帶給了我很多東西,望在以后的學習過程中,盡力和同學互幫互助,最終使對方都有收獲,達到共贏。
PPT解讀







代碼實現
1 /* 2 程序說明: 3 醫院各科室的醫生數量有限,因此病人到醫院看病時必須排隊候診,病人的病情有輕重緩急之分, 4 5 不能僅僅根據先來先服務的原則就診,(例如:重症,生命垂危的病人應該先行就診)所以在此根據病人的病情安排不同的 6 優先級。 醫生在就診時,首先選擇優先級別高的病人就診,如果遇到兩個病人的優先級別相同的情況,則按照先到先就診的 7 原則進行診治。 8 */ 9 10 11 //數據結構說明: 循環隊列,隊列和最大堆(優先隊列) 12 //病人編號從10——開始。 13 14 #include<stdio.h> 15 #include<malloc.h> 16 #include<string.h> 17 #include<stdlib.h> 18 #define LEN sizeof(jiedian) 19 typedef int DataType; 20 #define ERROR -1 21 #define OK 1 22 #define mid 0 23 #define zongsize 200 //總隊列長度 24 #define MAXQSIZE 100 //最大隊列長度 25 #define Maxsize 20 //最大堆的容量 26 27 28 29 #define Infinity 1000 30 #define MaxVertexNum 35 31 #define MAX 40 32 #include<stdlib.h> 33 #include<conio.h> 34 #include<iostream.h> 35 36 37 38 39 typedef struct arcell 40 { //邊的權值信息 41 int adj; //權值 42 }arcell, adjmatrix[MaxVertexNum][MaxVertexNum]; //圖的鄰接矩陣類型 43 44 typedef struct vexsinfo 45 {//頂點信息 46 int position; //景點編號 47 char name[32]; //景點的名稱 48 char introduction[256]; //景點的介紹 49 }vexsinfo; 50 typedef struct mgraph 51 {//圖結構信息 52 vexsinfo vexs[MaxVertexNum]; //頂點向量【數組】 53 adjmatrix arcs; //鄰接矩陣 54 int vexnum, arcnum; //分別指定頂點數和邊數 55 }mgraph; 56 57 //全局變量 58 int visited[35]; //用於標志是否已經訪問過 59 int d[35]; //用於存放權值或存儲路徑頂點編號 60 mgraph campus; //圖變量(大學校園) 61 62 63 64 65 // (1) 對圖初始化 66 67 mgraph initgraph() 68 { 69 int i=0,j=0; 70 mgraph c; 71 c.vexnum =28; //頂點個數 72 c.arcnum =48; //邊的個數 73 for(i=0;i<c.vexnum ;i++) //依次設置頂點編號 74 c.vexs[i].position =i; 75 //依次輸入頂點信息 76 strcpy(c.vexs[0].name ,"大門"); 77 strcpy(c.vexs[0].introduction ,"離公交站近"); 78 strcpy(c.vexs[1].name ,"大廳"); 79 strcpy(c.vexs[1].introduction ,"門診大廳,掛號繳費取葯"); 80 strcpy(c.vexs[2].name ,"急診部"); 81 strcpy(c.vexs[2].introduction ,"急診大樓,處理緊急嚴重病人"); 82 strcpy(c.vexs[3].name ,"住院部"); 83 strcpy(c.vexs[3].introduction ,"住院樓,處理那些需要長期治療的病人"); 84 strcpy(c.vexs[4].name ,"門診部"); 85 strcpy(c.vexs[4].introduction ,"門診樓,對病人簡單的診斷和開處方"); 86 strcpy(c.vexs[5].name,"行政樓"); 87 strcpy(c.vexs[5].introduction ,"行政辦公,處理醫院日常事務"); 88 strcpy(c.vexs[6].name ,"后勤室"); 89 strcpy(c.vexs[6].introduction ,"后勤辦公,員工衣食以及醫院辦公用品存儲"); 90 strcpy(c.vexs[7].name,"手術室"); 91 strcpy(c.vexs[7].introduction ,"手術,對重症者處理傷口"); 92 strcpy(c.vexs[8].name ,"放射科"); 93 strcpy(c.vexs[8].introduction ,"拍片和CT,核磁共振"); 94 strcpy(c.vexs[9].name, "兒科"); 95 strcpy(c.vexs[9].introduction ,"對兒童的病症處理"); 96 strcpy(c.vexs[10].name ,"口腔科"); 97 strcpy(c.vexs[10].introduction ,"口腔大樓,對口腔症狀診斷處理"); 98 strcpy(c.vexs[11].name ,"葯房"); 99 strcpy(c.vexs[11].introduction ,"病人取葯和存放葯材的地方"); 100 strcpy(c.vexs[12].name ,"皮膚科"); 101 strcpy(c.vexs[12].introduction ,"對皮膚出現的症狀診斷開處方"); 102 strcpy(c.vexs[13].name ,"中醫科"); 103 strcpy(c.vexs[13].introduction ,"通過中醫的手段進行診斷開中醫葯材"); 104 strcpy(c.vexs[14].name ,"B超室"); 105 strcpy(c.vexs[14].introduction ,"看心臟和產前胎兒情況"); 106 strcpy(c.vexs[15].name ,"耳鼻喉科"); 107 strcpy(c.vexs[15].introduction ,"診斷耳朵鼻子喉嚨有問題的病人並開處方"); 108 strcpy(c.vexs[16].name ,"食堂"); 109 strcpy(c.vexs[16].introduction ,"醫生和護士吃飯的地方"); 110 strcpy(c.vexs[17].name ,"病案室"); 111 strcpy(c.vexs[17].introduction ,"存放病人檔案"); 112 strcpy(c.vexs[18].name ,"內科"); 113 strcpy(c.vexs[18].introduction ,"看病人身體內部問題"); 114 strcpy(c.vexs[19].name ,"外科"); 115 strcpy(c.vexs[19].introduction ,"病人外部如燒傷,骨傷"); 116 strcpy(c.vexs[20].name ,"婦科"); 117 strcpy(c.vexs[20].introduction ,"診斷婦女身體疾病"); 118 strcpy(c.vexs[21].name ,"眼科"); 119 strcpy(c.vexs[21].introduction ,"看人體眼部疾病"); 120 strcpy(c.vexs[22].name ,"重症監護室"); 121 strcpy(c.vexs[22].introduction ,"重型病人的病房"); 122 strcpy(c.vexs[23].name ,"產科室"); 123 strcpy(c.vexs[23].introduction ,"女性疾病的病因、病理、診斷及防治,妊娠、分娩的生理和病理變化,高危妊娠及難產的預防和診治,女性生殖內分泌,計划生育及婦女保健等"); 124 strcpy(c.vexs[24].name ,"普通室"); 125 strcpy(c.vexs[24].introduction ,"一般病人的病房"); 126 strcpy(c.vexs[25].name ,"院長辦公室"); 127 strcpy(c.vexs[25].introduction ,"管理醫院人員以及存放重要文件"); 128 strcpy(c.vexs[26].name ,"主任辦公室"); 129 strcpy(c.vexs[26].introduction ,"管理大夫和看疑難症狀的病人"); 130 strcpy(c.vexs[27].name ,"大夫辦公室"); 131 strcpy(c.vexs[27].introduction ,"大夫看病以及日常用品的地方"); 132 133 134 //依次輸入邊上的權值信息 135 for(i=0;i<c.vexnum ;i++) 136 for(j=0;j<c.vexnum ;j++) 137 c.arcs [i][j].adj =Infinity; //先初始化圖的鄰接矩陣 138 139 //部分弧長 140 141 c.arcs[0][1].adj=40; 142 143 c.arcs[1][2].adj=30; c.arcs[1][6].adj=25; c.arcs[1][10].adj=10; 144 145 c.arcs[1][24].adj=200; c.arcs[1][20].adj=25; 146 147 c.arcs[2][3].adj=7; c.arcs[2][4].adj=7; c.arcs[2][5].adj=7; 148 149 c.arcs[4][23].adj=100; 150 151 c.arcs[6][7].adj=8; c.arcs[6][8].adj=9; c.arcs[6][9].adj=7; 152 153 c.arcs[7][8].adj=3; c.arcs[7][9].adj=5; c.arcs[7][21].adj=15; 154 155 c.arcs[8][9].adj=2; 156 157 c.arcs[9][21].adj=6; 158 159 c.arcs[10][11].adj=5; c.arcs[10][12].adj=4; c.arcs[10][13].adj=7; 160 161 c.arcs[10][14].adj=8; c.arcs[10][15].adj=6; c.arcs[10][16].adj=7; 162 163 c.arcs[10][17].adj=6; c.arcs[10][18].adj=4; c.arcs[10][19].adj=8; 164 165 c.arcs[11][21].adj=10; 166 167 c.arcs[12][21].adj=13; 168 169 c.arcs[13][21].adj=7; 170 171 c.arcs[14][21].adj=3; 172 173 c.arcs[15][21].adj=8; 174 175 c.arcs[16][21].adj=10; 176 177 c.arcs[17][21].adj=15; 178 179 c.arcs[18][21].adj=16; 180 181 c.arcs[19][21].adj=18; 182 183 c.arcs[20][21].adj=25; c.arcs[20][22].adj=8; c.arcs[20][23].adj=10; 184 185 c.arcs[21][22].adj=20; c.arcs[21][23].adj=25; 186 187 c.arcs[23][25].adj=10; 188 189 c.arcs[23][26].adj=11; c.arcs[23][27].adj=9; 190 191 c.arcs[24][25].adj=5; c.arcs[24][26].adj=6; c.arcs[24][27].adj=5; 192 193 c.arcs[26][27].adj=90; 194 195 for(i=0;i<c.vexnum ;i++) //鄰接矩陣是對稱矩陣,對稱賦值 196 for(j=0;j<c.vexnum ;j++) 197 c.arcs[j][i].adj =c.arcs[i][j].adj ; 198 return c; 199 }//initgraph 200 201 202 // (2) 查找景點在圖中的序號 203 204 int locatevex(mgraph c,int v) 205 { 206 int i; 207 for(i=0;i<c.vexnum ;i++) 208 if(v==c.vexs[i].position) 209 return i; //找到,返回頂點序號i 210 211 return -1; //否則,返回-1 212 } 213 214 215 //(3) 、(4) 求兩景點間的所有路徑 216 217 // (3) 打印序號為m,n景點間的長度不超過6個地點的路徑 218 219 void path(mgraph c, int m,int n,int k) 220 { 221 int s,x=0; 222 int t=k+1; //t 記載路徑上下一個中間頂點在d[]數組中的下標 223 if(d[k]==n && k<6) //d[k]存儲路徑頂點。若d[k]是終點n且景點個數<=6,則輸出該路徑 224 { //遞歸出口,找到一條路徑 225 for(s=0;s<k;s++) 226 printf("%s--->",c.vexs[d[s]].name); //輸出該路徑。s=0 時為起點m 227 printf("%s",c.vexs[d[s]].name); //輸出最后一個地點名(即頂點n的名字,此時s==k) 228 printf("\n\n"); 229 } 230 else 231 { 232 s=0; 233 while(s<c.vexnum) //從第m個頂點,試探至所有頂點是否有路徑 234 { 235 if((c.arcs[d[k]][s].adj<Infinity) && (visited[s]==0)) //初態:頂點m到頂點s有邊,且未被訪問 236 { 237 visited[s]=1; 238 d[k+1]=s; //存儲頂點編號s 至d[k+1]中 239 path(c,m,n,t); //求從下標為t=k+1的第d[t]個頂點開始的路徑(遞歸調用),同時打印出一條m至n的路徑 240 visited[s]=0; //將找到的路徑上頂點的訪問標志重新設置為0,以用於試探新的路徑 241 } 242 s++; //試探從下一個頂點 s 開始是否有到終點的路徑 243 }//endwhile 244 245 }//endelse 246 247 }//endpath 248 249 //(4) 打印兩景點間的景點個數不超過6的所有路徑。調用(3) 250 251 int allpath(mgraph c) 252 { 253 int k,i,j,m,n; 254 printf("\n\n請輸入你要查詢的兩個景點編號:\n\n"); 255 scanf("%d%d",&i,&j); 256 printf("\n\n"); 257 m=locatevex(c,i); //調用(2),確定該頂點是否存在。若存在,返回該頂點編號 258 n=locatevex(c,j); 259 d[0]=m; //存儲路徑起點m (int d[]數組是全局變量) 260 for(k=0;k<c.vexnum;k++) //全部頂點訪問標志初值設為0 261 visited[k]=0; 262 visited[m]=1; //第m個頂點訪問標志設置為1 263 path(c,m,n,0); //調用(3)。k=0,對應起點d[0]==m。k為d[]數組下標 264 return 1; 265 } 266 267 268 // (5) 用迪傑斯特拉算法,求出一個景點到其他景點間的最短路徑,並打印 269 270 void shortestpath_dij(mgraph c) 271 { 272 //迪傑斯特拉算法,求從頂點v0到其余頂點的最短路經及其帶權長度d[v] 273 //若p[v][w]為1,則w是從v0到v的最短路經上的頂點 274 //final[v]類型用於設置訪問標志 275 276 int v,w,i,min,t=0,x,flag=1,v0; //vo為起始景點的編號 277 int final[35],d[35],p[35][35]; 278 printf("\n請輸入一個起始景點的編號:"); 279 scanf("%d",&v0); 280 printf("\n\n"); 281 while(v0<0||v0>c.vexnum) 282 { 283 printf("\n你所輸入的景點編號不存在\n"); 284 printf("請重新輸入:"); 285 scanf("%d",&v0); 286 }//while 287 for(v=0;v<c.vexnum ;v++) 288 { 289 final[v]=0; //初始化各頂點訪問標志 290 d[v]=c.arcs[v0][v].adj; //v0 到各頂點 v 的權值賦值給d[v] 291 for(w=0;w<c.vexnum ;w++) //初始化p[][]數組,各頂點間的路徑全部設置為空路徑0 292 p[v][w]=0; 293 if(d[v]<Infinity) //v0 到v 有邊相連,修改p[v][v0]的值為1 294 { 295 p[v][v0]=1; 296 p[v][v]=1; //各頂點自己到自己要連通 297 } 298 }//for 299 d[v0]=0; //自己到自己的權值設為0 300 final[v0]=1; //v0的訪問標志設為1,v 屬於 s 集 301 for(i=1;i<c.vexnum ;i++) //對其余c.vexnum-1個頂點w,依次求 v 到 w 的最短路徑 302 { 303 min=Infinity; 304 for(w=0;w<c.vexnum ;w++) //在未被訪問的頂點中,查找與 v0 最近的頂點v 305 if(!final[w]) 306 if(d[w]<min) //v0 到 w (有邊)的權值<min 307 { 308 v=w; 309 min=d[w]; 310 }//if 311 final[v]=1; //v 的訪問標志設置為1,v 屬於s集 312 for(w=0;w<c.vexnum ;w++) //修改v0 到其余各頂點w 的最短路徑權值d[w] 313 if(!final[w]&&(min+c.arcs[v][w].adj <d[w])) //若w 不屬於s,且v 到w 有邊相連 314 { 315 d[w]=min+c.arcs[v][w].adj; //修改v0 到w 的權值d[w] 316 for(x=0;x<c.vexnum ;x++) //所有v0 到v 的最短路徑上的頂點x,都是v0 到w 的最短路徑上的頂點 317 p[w][x]=p[v][x]; 318 p[w][w]=1; 319 }//if 320 }//for 321 for(v=0;v<c.vexnum ;v++) //輸出v0 到其它頂點v 的最短路徑 322 { 323 if(v!=v0) 324 printf("%s",c.vexs[v0].name); //輸出景點v0 的景點名 325 for(w=0;w<c.vexnum ;w++) //對圖中每個頂點w,試探w 是否是v0 到v 的最短路徑上的頂點 326 { 327 if(p[v][w] && w!=v0 && w!=v) //若w 是且w 不等於v0,則輸出該景點 328 printf("--->%s",c.vexs[w].name); 329 330 } 331 printf("---->%s",c.vexs[v].name); 332 printf("\n總路線長為%d米\n\n",d[v]); 333 334 335 336 }//for 337 }//shortestpath 338 339 340 //(6)-(11)修改圖的信息。包括建圖、更新信息、刪除、增加結點和邊 341 342 //(6) 構造圖的鄰接矩陣 343 344 int creatgragh(mgraph *c) //建圖。以圖的鄰接矩陣存儲圖 345 { 346 int i,j,m,n; 347 int v0,v1; 348 int distance; 349 printf("請輸入圖的頂點數和邊數: \n"); 350 scanf("%d %d",&c->vexnum ,&c->arcnum ); 351 printf("下面請輸入景點的信息:\n"); 352 for(i=0;i<c->vexnum ;i++) //構造頂點向量(數組) 353 { 354 printf("請輸入景點的編號:"); 355 scanf("%d",c->vexs[i].position ); 356 printf("\n請輸入景點的名稱:"); 357 scanf("%s",c->vexs[i].name ); 358 printf("\n請輸入景點的簡介:"); 359 scanf("%s",c->vexs[i].introduction ); 360 } 361 for(i=0;i<c->arcnum ;i++) //初始化鄰接矩陣 362 for(j=0;j<c->arcnum ;j++) 363 c->arcs[i][j].adj =Infinity; 364 365 printf("下面請輸入圖的邊的信息:\n"); 366 for(i=1;i<=c->arcnum ;i++) //構造鄰接矩陣 367 { 368 printf("\n第%d條邊的起點 終點 長度為:",i);//輸入一條邊的起點、終點及權值 369 scanf("%d %d %d",&v0,&v1,&distance); 370 m=locatevex(campus,v0); 371 n=locatevex(campus,v1); 372 if(m>=0 && n>=0) 373 { 374 c->arcs[m][n].adj =distance; 375 c->arcs[n][m].adj =c->arcs[m][n].adj ; 376 } 377 } 378 return 1; 379 }//creatgragh 380 381 382 // (7) 更新圖的部分信息。返回值: 1 383 384 int newgraph(mgraph *c) 385 { 386 int changenum; //計數。用於記錄要修改的對象的個數 387 int i,m,n,t,distance,v0,v1; 388 printf("\n下面請輸入你要修改的景點的個數:\n"); 389 scanf("%d",&changenum); 390 while(changenum<0||changenum>c->vexnum ) 391 { 392 printf("\n輸入錯誤!請重新輸入"); 393 scanf("%d",&changenum); 394 } 395 396 for(i=0;i<changenum;i++) 397 { 398 printf("\n請輸入景點的編號:"); 399 scanf("%d",&m); 400 t=locatevex(campus,m); 401 printf("\n請輸入景點的名稱:"); 402 scanf("%s",c->vexs[t].name ); 403 printf("\n請輸入景點的簡介:"); 404 scanf("%s",c->vexs[t].introduction ); 405 } 406 407 printf("\n下面請輸入你要更新的邊數"); 408 scanf("%d",&changenum); 409 while(changenum<0||changenum>c->arcnum ) 410 { 411 printf("\n輸入錯誤!請重新輸入"); 412 scanf("%d",&changenum); 413 } 414 415 printf("\n下面請輸入更新邊的信息:\n"); 416 for(i=1;i<=changenum ;i++) 417 { 418 printf("\n修改的第%d條邊的起點 終點 長度為:",i); 419 scanf("%d %d %d",&v0,&v1,&distance); 420 m=locatevex(campus,v0); 421 n=locatevex(campus,v1); 422 if(m>=0 && n>=0) 423 { 424 c->arcs[m][n].adj =distance; 425 c->arcs[n][m].adj =c->arcs[m][n].adj ; 426 } 427 } 428 return 1; 429 }//newgraph 430 431 // (8) 增加一條邊。返回值:1 432 433 int enarc(mgraph *c) 434 { 435 int m,n,distance; 436 printf("\n請輸入邊的起點和終點編號,權值:"); 437 scanf("%d %d %d",&m,&n,&distance); 438 while(m<0||m>c->vexnum ||n<0||n>c->vexnum ) 439 { 440 printf("輸入錯誤,請重新輸入:"); 441 scanf("%d %d",&m,&n); 442 } 443 if(locatevex(campus,m)<0) 444 { 445 printf("此結點%d已刪除",m); 446 return 1; 447 } 448 if(locatevex(campus,n)<0) 449 { 450 printf("此結點%d已被刪除:",n); 451 return 1; 452 } 453 c->arcs[m][n].adj =distance; 454 c->arcs[n][m].adj =c->arcs[m][n].adj; //對稱賦值 455 return 1; 456 }//enarc 457 458 // (9) 增加一個結點。返回值:1 459 460 int envex(mgraph *c) 461 { 462 int i; 463 printf("請輸入你要增加結點的信息:"); 464 printf("\n編號:"); 465 scanf("%d",&c->vexs[c->vexnum ].position ); 466 printf("名稱:"); 467 scanf("%s",c->vexs[c->vexnum ].name ); 468 printf("簡介:"); 469 scanf("%s",c->vexs[c->vexnum ].introduction) ; 470 c->vexnum ++; 471 for(i=0;i<c->vexnum;i++) //對原鄰接矩陣新增加的一行及一列進行初始化 472 { 473 c->arcs [c->vexnum -1][i].adj=Infinity; //最后一行(新增的一行) 474 c->arcs [i][c->vexnum -1].adj=Infinity; //最后一列(新增的一列) 475 } 476 return 1; 477 }//envex 478 479 // (10) 刪除圖的一個頂點。返回值:1 480 481 int delvex(mgraph *c) 482 { 483 int i=0,j; 484 int m; 485 int v; 486 if(c->vexnum <=0) 487 { 488 printf("圖中已無頂點"); 489 return 1; 490 } 491 printf("\n下面請輸入你要刪除的景點編號:"); 492 scanf("%d",&v); 493 while(v<0||v>c->vexnum ) 494 { 495 printf("\n輸入錯誤!請重新輸入"); 496 scanf("%d",&v); 497 } 498 m=locatevex(campus,v); 499 if(m<0) 500 { 501 printf("此頂點 %d 已刪除",v); 502 return 1; 503 } 504 for(i=m;i<c->vexnum-1 ;i++)//對頂點信息所在順序表進行刪除m 點的操作 505 { 506 strcpy(c->vexs[i].name ,c->vexs [i+1].name ); 507 strcpy(c->vexs[i].introduction ,c->vexs [i+1].introduction ); 508 } 509 //對原鄰接矩陣,刪除該頂點到其余頂點的鄰接關系。分別刪除相應的行和列 510 for(i=m;i<c->vexnum-1 ;i++) //行 511 for(j=0;j<c->vexnum ;j++) //列 512 c->arcs [i][j]=c->arcs [i+1][j]; //二維數組,從第m+1行開始依次往前移一行。即刪除第m 行 513 for(i=m;i<c->vexnum-1 ;i++) 514 for(j=0;j<c->vexnum ;j++) 515 c->arcs [j][i]=c->arcs [j][i+1]; //二維數組,從第m+1列開始依次往前移一列。即刪除第m 列 516 c->vexnum --; 517 return 1; 518 }//delvex 519 520 //(11) 刪除圖的一條邊。返回值:1 521 522 int delarc(mgraph *c) 523 { 524 int m,n; 525 int v0,v1; 526 if(c->arcnum <=0) 527 { 528 printf("圖中已無邊,無法刪除。"); 529 return 1; 530 } 531 printf("\n下面請輸入你要刪除的邊的起點和終點編號:"); 532 scanf("%d %d",&v0,&v1); 533 m=locatevex(campus,v0); 534 if(m<0) 535 { 536 printf("此 %d 頂點已刪除",v0); 537 return 1; 538 } 539 n=locatevex(campus,v1); 540 if(n<0) 541 { 542 printf("此 %d 頂點已刪除",v1); 543 return 1; 544 } 545 c->arcs [m][n].adj =Infinity; //修改鄰接矩陣對應的權值 546 c->arcs [n][m].adj =Infinity; 547 c->arcnum --; 548 return 1; 549 }//delarc 550 551 // (12) 輸出圖的鄰接矩陣的值 552 553 void printmatrix(mgraph c) 554 { 555 int i,j,k=0; //k 用於計數,控制換行 556 557 for(i=0;i<c.vexnum ;i++) 558 for(j=0;j<c.vexnum ;j++) 559 { 560 if(c.arcs[i][j].adj ==Infinity) 561 printf("----"); 562 else 563 printf("%4d",c.arcs[i][j].adj); 564 k++; 565 if(k%c.vexnum ==0) 566 printf("\n"); 567 } 568 }//printpath 569 570 //(13)圖操作的主調函數。返回值:1 571 572 int changegraph(mgraph *c) 573 { 574 575 int yourchoice; 576 printf("\n請問是要\n\n(1)再次建圖 (2)刪除結點 (3)刪除邊\n"); 577 printf("\n(4)增加結點 (5)增加邊 (6)更新信息\n\n(7)打印鄰接矩陣 (8)返回?\n\n"); 578 579 scanf("%d",&yourchoice); 580 printf("\n\n"); 581 while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6 582 ||yourchoice==7||yourchoice==8)) 583 { 584 printf("輸入選擇不明確,請重輸\n"); 585 scanf("%d",&yourchoice); 586 } 587 while(1) 588 { 589 switch(yourchoice) 590 { 591 case 1: creatgragh(c); break; 592 case 2: delvex(c); break; 593 case 3: delarc(c); break; 594 case 4: envex(c); break; 595 case 5: enarc(c); break; 596 case 6: newgraph(c); break; 597 case 7: printmatrix(campus); break; 598 case 8: return 1; 599 } 600 printf("\n請問是要\n\n(1)再次建圖 (2)刪除結點 (3)刪除邊\n"); 601 printf("\n(4)增加結點 (5)增加邊 (6)更新信息\n\n(7)打印鄰接矩陣 (8)返回?\n\n"); 602 603 scanf("%d",&yourchoice); 604 printf("\n\n"); 605 while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6 606 ||yourchoice==7||yourchoice==8)) 607 { 608 printf("輸入選擇不明確,請重輸\n"); 609 scanf("%d",&yourchoice); 610 } 611 }//endwhile(1) 612 613 return 1; 614 }//changegraph 615 616 // (14) 查詢兩景點間的最短路徑 617 618 void shortestpath_floyd(mgraph c) 619 { 620 //用floyd算法求各對頂點v和w間的最短路經及其帶權長度的d[v][w]。 621 //若p[v][w][u]==1;則u是v到w的當前求得的最短路經上的頂點 622 623 int i,j,k,d[35][35],p[35][35][35]; 624 int v,u,w; 625 for(v=0;v<c.vexnum ;v++) //初始化各對頂點 v,w 之間的起始距離 d[v][w] 及 路徑 p[v][w][] 數組 626 { 627 for(w=0;w<c.vexnum ;w++) 628 { 629 d[v][w]=c.arcs[v][w].adj; //d[v][w] 中存放 v 至 w 間初始權值 630 for(u=0;u<c.vexnum ;u++) //初始化最短路徑 p[v][w][] 數組,第 3 個分量全部清0 631 p[v][w][u]=0; 632 if(d[v][w]<Infinity) //如果 v 至 w 間有邊相連 633 { 634 p[v][w][v]=1; // v 是 v 至 w 最短路徑上的頂點 635 p[v][w][w]=1; // w 是 v 至 w 最短路徑上的頂點 636 }//if 637 }//for 638 }//endfor 639 640 for(u=0;u<c.vexnum ;u++) // 求v至w的最短路徑及距離。對任意頂點u,試探其是否為v至w最短路徑上的頂點 641 { 642 for(v=0;v<c.vexnum ;v++) 643 for(w=0;w<c.vexnum ;w++) 644 if(d[v][u]+d[u][w]<d[v][w]) //從 v 經 u 到 w 的一條路徑更短 645 { 646 d[v][w]=d[v][u]+d[u][w]; //修改 v 至 w 的最短路徑長度 647 for(i=0;i<c.vexnum ;i++) //修改 v 至 w 的最短路徑數組。 若i是v至u的最短路徑上的頂點, 648 p[v][w][i]=p[v][u][i]||p[u][w][i]; //或i是u至w的最短路徑上的頂點, 則i是v至w的最短路徑上的頂點 649 } 650 }//endfor 651 652 printf("\n請輸入出發點和目的地編號:"); 653 scanf("%d%d",&k,&j); 654 printf("\n\n"); 655 while(k<0||k>c.vexnum||j<0||j>c.vexnum) 656 { 657 printf("\n你所輸入的景點編號不存在!"); 658 printf("\n請重新輸入出發點和目的地編號:\n\n"); 659 scanf("%d%d",&k,&j); 660 printf("\n\n"); 661 } 662 printf("%s",c.vexs[k].name ); //輸出出發景點名稱 663 for(u=0;u<c.vexnum ;u++) 664 if(p[k][j][u] && k!=u && j!=u) //輸出最短路徑上中間景點名稱 665 printf("--->%s",c.vexs[u].name ); 666 printf("--->%s",c.vexs[j].name ); //輸出目的地景點名稱 667 668 printf("\n\n\n總長為%d米\n\n\n",d[k][j]); 669 670 }//shortestpath_floyd 671 672 // (15) 查詢景點的信息 673 674 void seeabout(mgraph c) 675 { 676 int k; 677 printf("\n請輸入要查詢的景點編號:"); 678 scanf("%d",&k); 679 while(k<0||k>c.vexnum) 680 { 681 printf("\n你所輸入的景點編號不存在!"); 682 printf("\n請重新輸入:"); 683 scanf("%d",&k); 684 } 685 printf("\n\n編號:%-4d\n",c.vexs[k].position ); 686 printf("\n\n景點名稱:%-10s\n",c.vexs[k].name ); 687 printf("\n\n介紹:%-80s\n\n",c.vexs[k].introduction ); 688 689 }//seeabout 690 691 // (16) 顯示所有景點信息 692 693 void browsecompus(mgraph c) 694 { 695 int i; 696 printf(" \n\n編號 景點名稱 簡介\n"); 697 printf("___________________________________________________________________________________________________________\n"); 698 699 for(i=0;i<c.vexnum ;i++) 700 printf("%-10d%-25s%-80s\n",c.vexs[i].position,c.vexs[i].name,c.vexs[i].introduction); 701 printf("___________________________________________________________________________________________________________\n\n"); 702 703 }//browsecompus 704 705 706 707 708 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 709 710 typedef struct binren 711 { 712 int id; //病人ID 713 }Binren; 714 715 716 typedef struct SqQueue 717 { 718 Binren * base ; //數組 719 int front; //頭指針 720 int rear; // 尾指針 721 int size; //最大隊列長度 722 }Queue; 723 724 725 //病人信息節點 726 typedef struct node 727 { int id; //病人編號 728 char name[30]; //病人姓名 729 int numroom; //病房 730 char address[30]; //家庭地址 731 int cost; //花費 732 struct node *next; 733 }jiedian , *Jiedian; 734 735 jiedian head; 736 737 738 typedef struct Heapstruct 739 { 740 DataType *Elements; //存儲堆元素的數組(存儲病人ID) 741 int size; //堆當前元素個數 742 int capacity; //堆的最大容量 743 }stack,* MaxHeap; 744 745 746 747 //鏈表的尾插法 748 void insertTail(jiedian *pHead, int ID,char name[],int numroom, char a[],int cost ){//尾插法 749 int len; 750 Jiedian t,n; 751 n=(jiedian *)malloc(sizeof(LEN)); 752 t=pHead; 753 if(n==NULL) 754 printf("分配字節失敗"); 755 n->id=ID; 756 strcpy(n->name,name); 757 len=strlen(name); 758 if(len>0) 759 strncpy(n->name,name,len); 760 else 761 printf("姓名輸入錯誤"); 762 n->numroom=numroom; ////病房號輸入可能存在錯誤,需要設計查錯功能。 763 strcpy(n->address,a); 764 len=strlen(a); 765 if(len>0) 766 strncpy(n->address,a,len); 767 else 768 printf("地址輸入錯誤"); 769 n->cost=cost; 770 t->next=n; 771 n->next=NULL; 772 t=n->next; 773 } 774 775 776 //鏈表的遍歷 777 void nodetest(jiedian *travel) //遍歷輸出 778 { 779 780 if(travel->next) 781 { printf("病人的ID:"); 782 printf("%d\n",travel->next->id); 783 printf("病人姓名:"); 784 printf("%s",travel->next->name); 785 printf("病房:"); 786 printf("%d\n",travel->next->numroom); 787 printf("家庭地址:"); 788 printf("%s",travel->next->address); 789 printf("花費:"); 790 printf("%d\n",travel->next->cost); 791 travel=travel->next; 792 793 } 794 795 } 796 797 798 //文本文檔的處理 799 void wenjianfun (Jiedian tou) //文件處理函數 800 { 801 int len,x,y,id,i=1; 802 char buf[30],a[30],b[30]; 803 FILE *fp; 804 if((fp=fopen("E:\\123\\lwk.txt","r"))==NULL) 805 printf("錯誤"); 806 else 807 while (!feof(fp)) 808 { 809 memset(buf,0,sizeof(buf)); 810 fgets(buf,sizeof(buf),fp); 811 id=atoi(buf); 812 printf("%d\n",id); 813 memset(buf,0,sizeof(buf)); 814 fgets(buf,sizeof(buf),fp); 815 len=strlen(buf); 816 if(len>0) 817 strncpy(a,buf,30); 818 printf("%s",a); 819 memset(buf,0,sizeof(buf)); 820 fgets(buf,sizeof(buf),fp); 821 x=atoi(buf); //atoi為字符串轉整型函數,頭文件為stdlib.h 822 printf("%d\n",x); 823 memset(buf,0,sizeof(buf)); 824 fgets(buf,sizeof(buf),fp); 825 len=strlen(buf); 826 if(len>0) 827 strncpy(b,buf,30); 828 printf("%s",b); 829 memset(buf,0,sizeof(buf)); 830 fgets(buf,sizeof(buf),fp); 831 y=atoi(buf); //atoi為字符串轉整型函數,頭文件為stdlib.h 832 printf("%d\n",y); 833 insertTail(tou,id,a,x,b,y); 834 } 835 fclose(fp); 836 } 837 838 839 840 //1.最大堆的創建 841 int createheap(MaxHeap H ) 842 { //創建容量為Maxsize的空的最大堆 843 H->Elements=(DataType*)malloc((Maxsize+1)*sizeof(DataType)); 844 H->size=0; 845 H->capacity=Maxsize; 846 H->Elements[0]=1000; //定義“哨兵”為大於堆中所有可能元素的值,便於以后更快操作 847 return OK; 848 } 849 850 //2.判斷堆是否滿 851 int Isfull(MaxHeap H) 852 { //棧滿返回1,否則返回0 853 return H->size==H->capacity; 854 } 855 856 //3.判斷堆是否空 857 int IsEmpty(MaxHeap H) 858 { //返回1棧空,否則返回0 859 return H->size==0; 860 } 861 862 //3.最大堆的插入 863 void insert(MaxHeap H, DataType item) 864 { 865 int i; 866 if(Isfull(H)){ 867 printf("最大堆已滿"); 868 } 869 i=++H->size; //i指向插入后堆中的最后一個元素的位置 870 for(; H->Elements[i/2]<item;i/=2) 871 H->Elements[i]=H->Elements[i/2]; //向下過濾結點 872 H->Elements[i]=item; //將item插入 873 printf("插入成功!"); 874 } 875 876 //4.最大堆的刪除 877 DataType DeleteMax(MaxHeap H) 878 { //從最大堆H中取出鍵值為最大的元素,並刪除一個節點 879 int parent,child; 880 DataType Maxitem, temp; 881 if(IsEmpty(H)) 882 { 883 printf("最大堆為空\n"); 884 return 0; 885 } 886 Maxitem=H->Elements[1]; //取出根結點最大值 887 //用最大堆H中最后一個元素從根結點開始向上過濾下層結點 888 temp=H->Elements[H->size--]; 889 for(parent=1;parent*2<=H->size;parent=child) 890 { 891 child=parent*2; 892 if((child!=H->size)&&(H->Elements[child]<H->Elements[child+1])) 893 child++; //child指向左右子結點的較大者 894 if(temp>=H->Elements[child]) break; 895 else //移動temp元素到下一層 896 H->Elements[parent]=H->Elements[child]; 897 } 898 H->Elements[parent]=temp; 899 return Maxitem; 900 } 901 902 903 904 905 //1.初始化隊列 906 int InitQueue(Queue *q) 907 { 908 q->base=(Binren*)malloc(MAXQSIZE*sizeof(Binren)); 909 if(!q->base) 910 { 911 printf("存儲空間分配失敗!"); 912 return ERROR; 913 } 914 q->front=q->rear=0; 915 q->size=MAXQSIZE; 916 return OK; 917 } 918 919 920 //初始化總隊列** 921 int zongQueue(Queue *q) 922 { 923 q->base=(Binren*)malloc(zongsize*sizeof(Binren)); 924 if(!q->base) 925 { 926 printf("存儲空間分配失敗!"); 927 return ERROR; 928 } 929 q->front=q->rear=0; 930 q->size=zongsize; 931 return OK; 932 } 933 934 935 //輸出所有病人信息** 936 void print(Queue *q) 937 { 938 while(q) 939 { 940 if(q->rear==q->front&&q->front!=0) 941 { 942 printf("所有病人ID輸出結束!"); 943 q->front=q->rear=0; 944 break; 945 } 946 else 947 if(q->rear==0) 948 { 949 printf("病人檔案處沒有病人信息!"); 950 break; 951 } 952 else 953 { 954 printf("病人的ID: %d\n",q->base[q->front]); 955 ++q->front; 956 } 957 } 958 } 959 960 961 //2.判斷隊列是否為空 962 int EmptyQueue(Queue *q) 963 { 964 return(q->front==q->rear); 965 } 966 967 //3.獲得循環隊列中元素 968 int GetHead(Queue *q) //??? 969 { int n=0,m; 970 if(q->front==0) 971 { 972 m=q->base[q->front].id; 973 ++q->front; 974 return m; 975 } 976 else 977 { 978 if(q->front%q->size==n) 979 { 980 q->front=0; 981 return mid; 982 } 983 else 984 { 985 m=q->base[q->front].id; 986 ++q->front; 987 return m; 988 } 989 } 990 991 992 } 993 994 995 //普通隊列的元素插入 996 void inQueue(Queue *q,int id) 997 { 998 if(q->rear==zongsize-1) 999 { 1000 printf("病人檔案處已滿,無法存儲病人檔案備份!\n"); 1001 printf("請開辟新的病人檔案處!\n"); 1002 } 1003 else 1004 { q->base[q->rear].id=id; 1005 ++q->rear; 1006 } 1007 } 1008 1009 1010 1011 //4.元素插入到循環隊列隊尾 1012 int EnQueue(Queue *q,int id) 1013 { 1014 //隊列滿 1015 if((q->rear+1)%q->size==q->front) 1016 { 1017 return mid; 1018 } 1019 else 1020 { 1021 q->base[q->rear].id=id; 1022 q->rear=(q->rear+1)%q->size; 1023 return OK; 1024 } 1025 } 1026 1027 1028 1029 //根據優先級選擇隊列(進入) 1030 void MYEnQueue(Queue *q1,MaxHeap q2,Queue *zong,DataType d,int priority) //** 1031 { 1032 int i; 1033 if(priority==1) 1034 { 1035 i=EnQueue(q1,d); 1036 if(i==0) 1037 printf("循環隊列已滿,病人無法排隊就診!"); 1038 inQueue(zong,d); //** 1039 } 1040 else 1041 { 1042 insert(q2,d); 1043 inQueue(zong,d); //** 1044 } 1045 } 1046 1047 1048 //根據優先級選擇隊列(出) 1049 DataType MYDeQueue(Queue *q1,MaxHeap q2) 1050 { 1051 DataType e; 1052 if(!IsEmpty(q2)) 1053 e=DeleteMax(q2); 1054 else 1055 { if(!EmptyQueue(q1)) 1056 e=GetHead(q1); 1057 else 1058 return ERROR; 1059 } 1060 return e; 1061 } 1062 1063 1064 1065 void ziwork( ) 1066 { 1067 int b=1; 1068 int menu,w,a; //存儲用戶選擇的菜單編號 1069 int priority; //病人看病的優先級別 1070 jiedian node; 1071 Queue q1; //優先級低的病人序列 1072 stack q2; //優先級高的病人序列 1073 Queue zong; //總隊列 1074 DataType id; //按照病人到達醫院的先后給予編號 1075 DataType e; //病人看病的優先級別 1076 zongQueue(&zong); //初始化總隊列** 1077 w=InitQueue(&q1); 1078 a=createheap(&q2); 1079 id=10; 1080 printf("************************************** 歡迎進入醫院排隊候診******************************************\n"); 1081 printf("**************************************1. 新病人加入候診隊列 *************************************\n"); 1082 printf("**************************************2. 醫生根據優先級別為病人診治*************************************\n"); 1083 printf("**************************************3. 輸出所有就診病人的ID *************************************\n"); 1084 // printf("**************************************4. 病人信息的存儲 *************************************\n"); 1085 // printf("**************************************5. 病人信息的輸出 *************************************\n"); 1086 printf("**************************************6. 返回上一級目錄 *************************************\n"); 1087 printf("-------------------------------------------------------------------------------------\n"); 1088 1089 printf("*****************************請按菜單編號選擇相應的操作(只處理數值型數據):*************************\n"); 1090 scanf("%d",&menu); 1091 tuichu: while(menu) 1092 { 1093 switch(menu) 1094 { 1095 case 1: 1096 system("cls"); 1097 printf("請輸入病人的優先級別(系統只設兩個優先級別:1或2):"); 1098 scanf("%d",&priority); 1099 // printf("請輸入病人的ID:\n"); 1100 // scanf("%d",&id); 1101 if(priority==1||priority==2) //級別輸入正確 1102 { 1103 printf("*******該病人的ID為:%d****\n",id); 1104 MYEnQueue(&q1,&q2,&zong,id++,priority); //** 1105 } 1106 else 1107 printf("\n請輸入病人的優先級別(系統只提供兩個優先級別:1或2)\n"); 1108 break; 1109 1110 case 2: //有病人出院 1111 system("cls"); 1112 e=MYDeQueue(&q1,&q2); 1113 if(e!=-1&&e!=0) //隊列不為空 1114 printf("*********************當前被診治病人的ID為:%d*****\n",e); 1115 else 1116 { 1117 if(e==-1) 1118 printf("***************無病人,隊列為空**********\n"); 1119 else 1120 printf("循環隊列中再無其他病人的ID!"); 1121 } 1122 break; 1123 1124 case 3: 1125 system("cls"); 1126 print(&zong); 1127 break; 1128 1129 case 4: 1130 system("cls"); 1131 if(b==1) 1132 { 1133 head.numroom=0; 1134 head.cost=0; 1135 wenjianfun(&head); 1136 } 1137 if(b!=1) 1138 { 1139 wenjianfun(&node); 1140 } 1141 ++b; 1142 break; 1143 1144 case 5: 1145 //*** 1146 printf("以下輸出病人的詳細信息:\n"); 1147 nodetest(&head); 1148 break; 1149 case 6: 1150 menu=0; 1151 goto tuichu; break; 1152 1153 default: break; 1154 } 1155 1156 printf("************************************** 歡迎進入醫院排隊候診******************************************\n"); 1157 printf("**************************************1. 新病人加入候診隊列 *************************************\n"); 1158 printf("**************************************2. 醫生根據優先級別為病人診治*************************************\n"); 1159 printf("**************************************3. 輸出所有就診病人的ID *************************************\n"); 1160 // printf("**************************************4. 病人信息的存儲 *************************************\n"); 1161 // printf("**************************************5. 病人信息的輸出 *************************************\n"); 1162 printf("**************************************6. 返回上一級目錄 *************************************\n"); 1163 printf("-------------------------------------------------------------------------------------\n"); 1164 printf("*****************************請按菜單編號選擇相應的操作(只處理數值型數據):*************************\n"); 1165 1166 printf("\n請輸入你的選擇:"); 1167 scanf("%d",&menu); 1168 1169 } 1170 1171 system("cls"); 1172 } 1173 1174 1175 1176 1177 void mainwork( ) 1178 { 1179 1180 int menu; 1181 campus=initgraph(); 1182 printf("************************************** 歡迎進入醫院系統程序 ******************************************\n"); 1183 printf("************************************** 1. 醫院地點介紹 ******************************************\n"); 1184 printf("************************************** 2. 查看路線 ******************************************\n"); 1185 printf("************************************** 3. 查詢地點間最短路徑 *************************************\n"); 1186 printf("************************************** 4. 地點信息查詢 *************************************\n"); 1187 printf("************************************** 5. 更改圖信息 *************************************\n"); 1188 printf("************************************** 6. 查詢兩地間可行路徑 *************************************\n"); 1189 printf("************************************** 7. 打印鄰接矩陣 *************************************\n"); 1190 printf("************************************** 8. 醫院排隊候診 *************************************\n"); 1191 printf("************************************** 9. 退出 *************************************\n"); 1192 printf("********************************************************************************************************\n"); 1193 while(1) 1194 { 1195 printf("-------------------------------------------------------------------------------------\n"); 1196 printf("*****************************請按菜單編號選擇相應的操作(只處理數值型數據):*************************\n"); 1197 scanf("%d",&menu); 1198 1199 switch(menu) 1200 { 1201 1202 case 1: system("cls"); browsecompus(campus); break; 1203 case 2: system("cls"); shortestpath_dij(campus); break; 1204 case 3: system("cls"); shortestpath_floyd(campus); break; 1205 case 4: system("cls"); seeabout(campus); break; 1206 case 5: system("cls"); changegraph(&campus); break; 1207 case 6: system("cls"); allpath(campus); break; 1208 case 7: system("cls"); printmatrix(campus); break; 1209 case 8: system("cls"); ziwork( ); break; 1210 case 9: 1211 system("cls"); 1212 printf("錯誤,請按菜單編號輸入\n"); 1213 exit(0); 1214 break; 1215 1216 } 1217 1218 printf("************************************** 歡迎進入醫院系統程序 ******************************************\n"); 1219 printf("************************************** 1. 醫院地點介紹 ******************************************\n"); 1220 printf("************************************** 2. 查看游覽路線 ******************************************\n"); 1221 printf("************************************** 3. 查詢地點間最短路徑 *************************************\n"); 1222 printf("************************************** 4. 地點信息查詢 *************************************\n"); 1223 printf("************************************** 5. 更改圖信息 *************************************\n"); 1224 printf("************************************** 6. 查詢兩地間可行路徑 *************************************\n"); 1225 printf("************************************** 7. 打印鄰接矩陣 *************************************\n"); 1226 printf("************************************** 8. 醫院排隊候診 *************************************\n"); 1227 printf("************************************** 9. 退出 *************************************\n"); 1228 printf("********************************************************************************************************\n"); 1229 1230 } 1231 1232 1233 } 1234 1235 1236 void main() 1237 { 1238 system("color 1f"); //屏幕顏色設定 1239 system("mode con: cols=140 lines=130"); 1240 mainwork(); 1241 }
