数据结构课程设计(所有文档)
数据结构 课程设计报告书
题目: 模拟医院系统
目录
一、选题背景.................................................................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 }