数据结构课程设计(所有文档)

数据结构 课程设计报告书


题目: 模拟医院系统     
 
目录 一、选题背景.................................................................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 }

 

posted @ 2020-12-30 17:04  liweikuan  阅读(1897)  评论(1编辑  收藏  举报