数据结构课程设计----火警与医疗系统
来源:互联网 发布:android数据库操作 编辑:程序博客网 时间:2024/05/17 07:39
Linklist.h
#ifndef LINKLIST_H_INCLUDED#define LINKLIST_H_INCLUDED/***********************************版权所有: 2017,hudejie文件名称: 单链表头文件内容摘要: 该文件用于描述单链表的结构体及函数定义当前版本: V1.0作者: hudejie完成日期: 2017.12.21***********************************/#include "stdio.h"#include "malloc.h"using namespace std;typedef struct L{ int num; //地点编号 char name[62]; //地点名称 char rem[60]; //地点信息} ElemType;//typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LinkList;void CreateListF(LinkList *&L,ElemType a);//头插法(链表,自定义的数据类型) //void CreateListR(LinkList *&L,ElemType a[],int n); //尾插法建立单链表void DestroyList(LinkList *&L); //销毁单链表 (链表)void DispList(LinkList *L); //输出单链表所有地点信息(链表)void InitList(LinkList *&L); //初始化线性表(链表)bool LinkEmpt(LinkList *&L); //判断链表是否为空(链表)//int Lisklength(LinkList *&L); //求链表长度//bool GetElem(LinkList *&L,int i,ElemType &e); //求指定位置的数据元素int LocateElem(LinkList *L,ElemType e); //按元素值查找(链表,自定义的数据类型)bool ListInsert(LinkList *&L,int i,ElemType e); //插入元素(链表,插入位置,自定义的数据类型)bool Delete(LinkList *&L,int i,ElemType &e); //删除元素(链表,删除位置,自定义的数据类型)#endif // LINKLIST_H_INCLUDEDLinklist.cpp
/***********************************版权所有: 2017,hudejie文件名称: 单链表头文件内容摘要: 该文件用于描述单链表各种函数的实现当前版本: V1.4作者: hudejie完成日期: 2017.12.21***********************************/#include "linklist.h"/***********************************功能描述:头插法建立链表输入参数:链表头指针,自定义数据输出参数:无返回值:链表头指针***********************************/void CreateListF(LinkList *&L,ElemType a)//{ LinkList *s; s=(LinkList *)malloc(sizeof(LinkList)); s->data=a; s->next=L->next; L->next=s;}/***********************************功能描述:销毁单链表输入参数:链表头指针输出参数:无返回值:链表头指针***********************************/void DestroyList(LinkList *&L) //{ LinkList *p=L,*q=p->next; while(q!=NULL) { free(p); //释放 p=q; q=q->next; } free(p);}/***********************************功能描述:输出单链表所有地点信息输入参数:链表头指针输出参数:链表内地点信息返回值:链表头指针***********************************/void DispList(LinkList *L) //{ LinkList *p=L->next; printf("所有地点信息如下:\n\n"); printf("地点编号:\t地点名称:\t\t地点信息:\n"); while (p!=NULL) { printf(" %d\t\t %s \t\t %s\n",p->data.num,p->data.name,p->data.rem); //输出链表信息 p=p->next; } printf("\n");}/***********************************功能描述:初始化单链表输入参数:链表头指针输出参数:无返回值:链表头指针***********************************/void InitList(LinkList *&L) //初始化线性表{ L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL;}bool Delete(LinkList *&L,int i,ElemType &e) //删除元素{ int j=0; LinkList *p=L,*q; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { q=p->next; if(q==NULL) return false; e=q->data; p->next=q->next; free(q); return true; }}/***********************************功能描述:单链表插入元素输入参数:链表头指针,插入位置,自定义数据类型输出参数:无返回值:链表头指针***********************************/bool ListInsert(LinkList *&L,int i,ElemType e) //插入元素{ int j=0; LinkList*p=L,*s; while(p!=NULL && j<i-1) { j++; p=p->next; } if(p==NULL) return false; else { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return true; }}graph.h
#ifndef GRAPH_H_INCLUDED#define GRAPH_H_INCLUDED/***********************************版权所有: 2017,hudejie文件名称: 图头文件内容摘要: 该文件用于描述图的结构体及函数定义当前版本: V1.1作者: hudejie完成日期: 2017.12.21***********************************/#include"linklist.h"#define MAXV 100 //最大顶点个数#define INF 32767 //INF表示∞typedef int InfoType;//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号 InfoType info; //顶点其他信息,在此存放带权图权值} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息}MGraph;void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵(数组,定点个数,邻接矩阵)//Dijkstra算法,复杂度为O(n^3);用于寻找图中指定节点到其余各节点的最短路径void Dijkstra(MGraph g,int v,LinkList *a,int p); //最短路径算法 (邻接矩阵,起始顶点,链表,尾顶点)void Dispath(MGraph g,int dist[],int path[],int S[],int i);//输出单源最短路径(邻接矩阵,距离数组,路径数组,数组,尾顶点)#endif // GRAPH_H_INCLUDEDgraph.cpp
/***********************************版权所有: 2017,hudejie文件名称: 图文件内容摘要: 该文件用于描述图各种函数的实现当前版本: V1.5作者: hudejie完成日期: 2017.12.21***********************************/#include <stdio.h>#include <malloc.h>#include "graph.h"/***********************************功能描述:二维数组转置邻接矩阵输入参数:整形指针,顶点个数,邻接矩阵输出参数:无返回值:邻接矩阵***********************************/void ArrayToMat(int *Arr, int n, MGraph &g) //二维数组转置邻接矩阵(数组,顶点数,邻接矩阵){ int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 g.n=n; //顶点数 for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) { g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用 if(g.edges[i][j]!=0 && g.edges[i][j]!=INF) //寻找顶点 count++; } g.e=count;}/***********************************功能描述:二维数组转置邻接矩阵输入参数:邻接矩阵,距离,路径,整形数组,排序顶点,链表,排序尾点输出参数:输出最短路径返回值:无***********************************/void Dispath(MGraph g,int dist[],int path[],int S[],int v,LinkList *a,int i) //输出单源最短路径(邻接矩阵,){ LinkList *b,*c; int j,k; int apath[MAXV],d; //逆向存放一条顶点路径及其定点个数 //循环输出顶点v到i的路径 if(S[i]==1&&i!=v) { b=a; c=a; while(b->next!=NULL) //寻找链表中与顶点编号相同的顶点名称 { b=b->next; if(b->data.num==v) break; } while(c->next!=NULL) //寻找链表中与顶点编号相同的顶点名称 { c=c->next; if(c->data.num==i) break; } printf("从 %s 到 %s 的最短路径为:",b->data.name,c->data.name); d=0; apath[d]=i; //添加路径的终点 k=path[i]; if(k==-1) //没有路径的情况 printf("无路径\n"); else //存在路径时输出路径 { while(k!=v) { d++; apath[d]=k; k=path[k]; } d++; //添加路径上的起点 apath[d]=v; b=a; while(b->next!=NULL) { b=b->next; if(b->data.num==apath[d]) break; } printf("%s",b->data.name); //先输出起点 for(j=d-1; j>=0; j--) //在输出其他顶点 { b=a; while(b->next!=NULL) //寻找链表中与顶点编号相同的顶点名称 { b=b->next; if(b->data.num==apath[j]) break; } printf("->%s",b->data.name); } printf(" \t路径长度为:%d千米",dist[i]); printf("\n\n"); } }}/***********************************功能描述:Dijkstra算法,复杂度为O(n^3);用于寻找图中指定节点到其余各节点的最短路径输入参数:邻接矩阵,排序顶点,链表,排序尾点输出参数:无返回值:邻接矩阵***********************************/void Dijkstra(MGraph g,int v,LinkList *a,int p){ int dist[MAXV],path[MAXV]; //用于记录距离和路径 int s[MAXV]; //用于加入节点 int mindis,i,j,u; for (i=0; i<g.n; i++) { dist[i]=g.edges[v][i]; //距离初始化 s[i]=0; //s[]置空 if (g.edges[v][i]<INF) //路径初始化 path[i]=v; else path[i]=-1; } s[v]=1; path[v]=0; //源点编号v放入s中 for (i=0; i<g.n; i++) //循环直到所有顶点的最短路径都求出 { mindis=INF; //mindis置最小长度初值 for (j=0; j<g.n; j++) //选取不在s中且具有最小距离的顶点u if (s[j]==0 && dist[j]<mindis) { u=j; mindis=dist[j]; } s[u]=1; //顶点u加入s中 for (j=0; j<g.n; j++) //修改不在s中的顶点的距离 if (s[j]==0) if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j]) //寻找路径中较短的呢个 { dist[j]=dist[u]+g.edges[u][j]; path[j]=u; } } Dispath(g,dist,path,s,v,a,p); //输出最短路径}operate.h
#ifndef OPERATE_H_INCLUDED#define OPERATE_H_INCLUDED/***********************************版权所有: 2017,hudejie文件名称: 功能实现操作头文件内容摘要: 该文件用于将各文件链接在一起实现主函数的应用当前版本: V1.2作者: hudejie完成日期: 2017.12.21***********************************/#include"stdio.h"#include"graph.h"#include"linklist.h"using namespace std;void Read(LinkList *&b); //读操作 (链表)void Write(LinkList *&b); //写操作(链表)void entermain(MGraph g,LinkList *b); //初始页面(邻接矩阵,链表)void enter1(MGraph g,LinkList *b); //火警响应页面(邻接矩阵,链表)void enter2(MGraph g,LinkList *b); //火警响应页面(邻接矩阵,链表)void Map(); //平面图#endif // OPERATE_H_INCLUDED//LinkList *&b,operate.cpp
/***********************************版权所有: 2017,hudejie文件名称: 功能实现操作文件内容摘要: 该文件用于将各文件链接在一起实现主函数的应用当前版本: V1.3作者: hudejie完成日期: 2017.12.21***********************************/#include"stdio.h"#include"iostream"#include <cstdlib>#include "operate.h"#include <fstream>#include"string"#include"graph.h"#include"cstring"using namespace std;char a[10];/***********************************功能描述:用于读取文件信息输入参数:链表输出参数:无返回值:链表***********************************/void Read(LinkList *&b) //读操作{ LinkList *a,*c; c=b; ifstream file("地图信息.txt",ios::in); a=(LinkList *)malloc(sizeof(LinkList)); while (file) { file>>a->data.num>>a->data.name>>a->data.rem; //讲信息读入链表中 if (!file) break; //如果File为空 跳出While循环,也就是说文件的数据读完了就不在增加equipment数组 //if(file.eof()) break; c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); } c->next=NULL; file.close();}/***********************************功能描述:将链表信息读到文件里输入参数:链表输出参数:无返回值:链表***********************************/void Write(LinkList *&b) //写操作{ LinkList *a; a=b->next; ofstream file("地图信息.txt",ios::out); //ios::out 以输出方式打开文件,有过已有此名字的文件,则将其原有内容全部清除 file<<"地点编号\t\t"<<"地点名称\t\t"<<"地点简介\n"; while(a!=NULL) { file<<a->data.num<<" \t\t"<<a->data.name<<" \t\t"<<a->data.rem<<"\n"; //将地图信息写入硬盘 a=a->next; } file.close();}/***********************************功能描述:火警与医疗系统界面输入参数:链表,邻接矩阵输出参数:界面返回值:无***********************************/void entermain(MGraph g,LinkList *b) //初始页面{ int tmp; system("cls"); printf("-----------------------欢迎登录烟台大学火警与医疗系统-----------------------\n\n\n"); printf(" 1.火警响应\n"); printf(" 2.医疗救助\n"); printf(" 3.地点信息查看\n"); printf(" 4.地图查看\n"); printf(" 5.退出\n"); cout<<"请按提示输入数字:"; cin>>tmp; while (cin.fail()) //清除输入的非数字字符 { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } while(1) //判断输入的数字是否正确 { if(tmp>=1&&tmp<=5) break; else { cout<<"输入错误,请重新输入:"; cin>>tmp; while (cin.fail()) { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } } } switch(tmp) { case 1: enter1(g,b); //火警响应系统页面 break; case 2: enter2(g,b); //医疗救助系统页面 break; case 3: DispList(b); system("pause"); entermain(g,b); //初始页面 break; case 4: Map(); system("pause"); entermain(g,b); //初始页面 case 5: return; break; }}/***********************************功能描述:火警响应系统界面输入参数:链表,邻接矩阵输出参数:界面返回值:无***********************************/void enter1(MGraph g,LinkList *b) //火警响应页面{ int tmp; system("cls"); printf("-----------------------------火警响应系统-------------------------------\n\n\n"); printf(" 1.校医院\n"); printf(" 2.宿舍楼\n"); printf(" 3.钟楼\n"); printf(" 4.千米长廊\n"); printf(" 5.新图\n"); printf(" 6.综合楼\n"); printf(" 7.七餐\n"); printf(" 8.返回\n"); printf("请选择报警地点:"); cin>>tmp; while (cin.fail()) //清除输入的非数字字符 { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } while(1) //判断输入是否正确 { if(tmp>=1&&tmp<=8) break; else { cout<<"输入错误,请重新输入"; cin>>tmp; while (cin.fail()) { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } } } if(tmp!=8) { Dijkstra(g,0,b,tmp); Map(); //地图 system("pause"); entermain(g,b); //初始页面 } else entermain(g,b); //初始页面}/***********************************功能描述:医疗救助系统统界面输入参数:链表,邻接矩阵输出参数:界面返回值:无***********************************/void enter2(MGraph g,LinkList *b) //火警响应页面{ int tmp; system("cls"); printf("-----------------------------医疗救助系统-------------------------------\n\n\n"); printf(" 1.警卫处\n"); printf(" 2.宿舍楼\n"); printf(" 3.钟楼\n"); printf(" 4.千米长廊\n"); printf(" 5.新图\n"); printf(" 6.综合楼\n"); printf(" 7.七餐\n"); printf(" 8.返回\n"); printf("请选择医疗地点:"); cin>>tmp; while (cin.fail()) //清除输入的非数字字符 { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } while(1) //判断输入是否正确 { if(tmp>=1&&tmp<=8) break; else { cout<<"输入错误,请重新输入"; cin>>tmp; while (cin.fail()) { cin.clear(); cin>>a; cout << "输入的不是数字,请输入一个数:"; cin >> tmp; } } } switch(tmp) { case 1: Dijkstra(g,1,b,0); Map(); //地图 system("pause"); entermain(g,b); //初始页面 break; case 2: case 3:case 4:case 5:case 6:case 7: Dijkstra(g,1,b,tmp); Map(); //地图 system("pause"); entermain(g,b); //初始页面 break; case 8: entermain(g,b); //初始页面 break; }}/***********************************功能描述:地图界面输入参数:无输出参数:界面返回值:无***********************************/void Map() //平面图{ printf("\n"); printf(" 校医院--------------------- 宿舍楼 --------------------------火警点 \n"); printf(" | \\ || // | \n"); printf(" | \\ || // | \n"); printf(" | \\ || // | \n"); printf(" | \\ \\ // | \n"); printf(" | \\ \\ // | \n"); printf(" | \\ \\ // | \n"); printf(" | ----------------------- 钟楼----------------- | \n"); printf(" | // | \\ | \n"); printf(" | // | \\ | \n"); printf(" 千 // | \\ | \n"); printf(" 米 // | \\| \n"); printf(" 长---- | 七餐 \n"); printf(" 廊 | | \n"); printf(" | | | \n"); printf(" | | | \n"); printf(" | | | \n"); printf(" |------------ 图书馆 ------------ 综合楼 ------------------------- \n");}
main.cpp
/***********************************版权所有: 2017,hudejie文件名称: 主函数内容摘要: 用于程序的初始化以及负责程序的运行当前版本: V1.5作者: hudejie完成日期: 2017.12.21***********************************/#include "linklist.h"#include"iostream"#include"graph.h"#include "operate.h"#include"string"#include"cstring"using namespace std;/***********************************功能描述:用于程序的初始化以及负责程序的运行输入参数:无输出参数:函数返回值:0***********************************/int main(){ int tmp; MGraph g; LinkList *L; InitList(L); LinkList *a,*c; c=L; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=0; strcpy(a->data.name,"火警点"); strcpy(a->data.rem,"校园戒备中心,二十四小时不间断值班"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=1; strcpy(a->data.name,"校医院"); strcpy(a->data.rem,"一家小型医院,服务全校师生"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=2; strcpy(a->data.name,"宿舍楼"); strcpy(a->data.rem,"学生栖息的小屋,同学们最喜欢的地方"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=3; strcpy(a->data.name,"钟楼"); strcpy(a->data.rem,"烟大的标志性建筑,计控学院的根据地"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=4; strcpy(a->data.name,"千米长廊"); strcpy(a->data.rem,"据说一千米,但感觉只有九百九十九米"); c->next=a; c=a;a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=5; strcpy(a->data.name,"新图"); strcpy(a->data.rem,"学霸们经常去的地方"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=6; strcpy(a->data.name,"综合楼"); strcpy(a->data.rem,"配备有各种大中小型自习教室"); c->next=a; c=a; a=(LinkList *)malloc(sizeof(LinkList)); a->data.num=7; strcpy(a->data.name,"七餐"); strcpy(a->data.rem,"上世纪全亚洲最大的餐厅"); c->next=a; c=a; c->next=NULL; int A[8][8]= { {0,INF,3,4,INF,INF,INF,7}, {INF,0,2,4,11,INF,INF,INF}, {3,2,0,7,INF,INF,INF,INF}, {4,4,7,0,5,INF,6,8}, {INF,11,INF,5,0,2,INF,INF}, {12,INF,INF,INF,2,0,1,INF}, {INF,INF,INF,6,INF,1,0,5}, {7,INF,INF,INF,INF,INF,5,0} }; ArrayToMat(A[0],8,g); //Dijkstra(g,0,L); Write(L); entermain(g,L); //初始页面 return 0;}课程设计总结:
因为我的程序可以看成是一个求最短路径的问题,所以要用到图中最短路径的算法(其实已经啥都不会了),在考虑用什么算法就把两个算法的视频又看了一遍,看完后才对这个项目有信心。数据结构上了一个学期了,每个模块差不多都忘记了,课程设计的过程中也是一边做一遍学,这个系统花时间最多的不是图,也不是链表而是文件,整整花了两天时间调试文件,调试出来一看二十行代码不到,最后还没怎么用,想想前两天真的伤心啊!!!
短暂的课程设计就这样过去了,感谢那个帮我调了两个小时代码的哥们,感谢给我指导,给我帮助,给我意见的老师,也感谢陪我一起打代码的同学们。
阅读全文
0 0
- 数据结构课程设计----火警与医疗系统
- 数据结构课程设计-通讯录管理系统的设计与实现
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计《模拟客服系统》
- 数据结构课程设计-学生信息管理系统
- 数据结构课程设计 图书管理系统
- 数据结构课程设计----银行模拟系统
- 数据结构课程设计-宿舍管理系统
- 数据结构课程设计 - 通讯录管理系统
- 校园导游系统 数据结构课程设计
- 数据结构课程设计--电子投票系统
- 数据结构课程设计 电子投票系统
- 数据结构课程设计-图书管理系统
- 数据结构课程设计--图书管理系统
- 数据结构课程设计-图书管理系统
- 数据结构课程设计、职工信息管理系统
- 数据结构课程设计-图书馆管理系统
- 数据结构课程设计--图书管理系统
- mysql和eclipse插入语句乱码问题
- JS复制对象、数组
- 文件上传
- MVVM
- <p>标签首行缩进2字符
- 数据结构课程设计----火警与医疗系统
- AI留给人类的时间已不多:《未来简史》作者赫拉利Nature来信
- nginx配置讲解
- Hacking Enums and Modifying "final static" Fields
- 3、html列表
- handsontable测试
- python——pandas库
- Apache Shiro学习笔记(1)
- Struts2 --- ActionContext和ServletActionContext