數據結構課程設計(所有文檔)


數據結構 課程設計報告書


題目: 模擬醫院系統     
 
目錄 一、選題背景.................................................................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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM