数据结构—交通指南系统
数据结构—交通系统

数据结构—交通系统在我们的日常生活中,交通系统是一个极其复杂但又至关重要的组成部分。
它就像是一个庞大的、不断运转的机器,将人们从一个地方运输到另一个地方,保障着城市和社会的正常运转。
而在这个复杂的系统背后,数据结构起着不可或缺的作用。
想象一下,每天有成千上万的车辆在道路上行驶,有无数的行人穿梭于街头巷尾,还有各种公共交通工具在城市中穿梭。
如何有效地管理和协调这一切,以确保交通的流畅、安全和高效?这就需要依靠数据结构来实现。
首先,让我们来谈谈交通流量数据。
这是交通系统中最基本也是最重要的数据之一。
通过在道路上设置传感器、摄像头等设备,我们可以实时收集到车辆的数量、速度、行驶方向等信息。
这些数据被整理和存储起来,形成了一个庞大的数据库。
而这个数据库的组织方式,就是一种数据结构。
比如说,我们可以使用链表来存储交通流量数据。
链表的特点是可以方便地进行插入和删除操作,这对于实时更新交通流量信息非常有用。
每当有新的数据产生,我们可以迅速地将其添加到链表中;而当某些数据过时或者不再需要时,也可以轻松地将其从链表中删除。
另外,队列这种数据结构在交通系统中也有广泛的应用。
比如在十字路口的信号灯控制中,车辆可以被看作是在一个队列中等待通行。
信号灯按照一定的规则依次放行队列中的车辆,从而保证交通的有序进行。
队列的先进先出原则很好地模拟了这种场景,使得交通控制更加合理和高效。
除了交通流量数据,路线规划也是交通系统中的一个重要环节。
当我们使用导航软件规划出行路线时,背后其实是一系列复杂的数据结构和算法在起作用。
例如,图这种数据结构被广泛应用于路线规划中。
我们可以将城市的道路网络看作是一个图,其中节点代表道路的交叉点,边代表道路段。
通过对这个图进行搜索和分析,导航软件可以找到从起点到终点的最优路径。
在图的搜索算法中,迪杰斯特拉算法是一种常用的方法。
它能够计算出图中一个节点到其他所有节点的最短路径。
当我们输入起点和终点后,导航软件就会运用这种算法,在道路网络的图中找到最短或者最快的路线,为我们提供准确的导航指引。
数据结构—交通系统

数据结构—交通系统数据结构—交通系统1:引言交通系统是一个城市或地区顺畅运行的重要组成部分。
为了有效管理和优化交通流量,需要设计和实现一个高效的交通系统。
本文档将介绍一个基于数据结构的交通系统设计。
2:整体架构交通系统可以分为以下几个模块:2.1 路网管理模块该模块负责管理整个路网的基础数据,包括道路、交叉口、车道、信号灯等信息。
2.2 路况监测模块该模块通过传感器和摄像头等设备对交通路况进行实时监测,并将数据反馈给系统。
2.3 路径规划模块该模块根据用户的起点和终点,利用路网数据和实时路况信息,计算出最优路径。
2.4 交通管理模块该模块根据实时路况和路径规划结果,控制信号灯、调整车道使用情况,以优化交通流量。
3:路网管理模块3.1 道路管理道路包括道路名称、起点和终点位置、道路长度等属性。
可以使用线性表或图来表示道路之间的连接关系。
3.2 交叉口管理交叉口是道路交汇的地方,包括交叉口名称、交叉口坐标、交通灯状态等属性。
可以使用树来表示交叉口的层级关系。
3.3 车道管理车道是道路上划分出的车辆行驶通道,包括车道编号、车道容量、车道速度限制等属性。
可以使用链表或数组来表示车道之间的关系。
4:路况监测模块4.1 传感器数据采集通过部署传感器设备,采集道路状况、车辆数量等数据。
可以使用数组或链表来存储和管理传感器数据。
4.2 图像识别技术利用摄像头采集交通图片,并通过图像识别技术分析车辆数量、车辆类型等信息。
可以使用图像处理算法来实现图像识别功能。
5:路径规划模块5.1 起点和终点选择用户选择起点和终点,并提供其他限制条件,例如出行时间、交通工具等。
5.2 最短路径算法利用最短路径算法,通过路网数据和实时路况信息,计算出起点到终点的最优路径。
可以使用Dijkstra算法、A算法等来实现最短路径计算。
6:交通管理模块6.1 信号灯控制根据交通流量和道路状况,动态调整信号灯的时间间隔,以控制交通流量。
6.2 车道使用管理根据车流量和道路容量,动态调整车道使用情况,例如开放或关闭车道,以优化交通流量。
数据结构—交通指南系统

南通大学数据结构实验课实验报告学生姓名所在院系专业学号指导教师南通大学2013年 12 月 11 日交通指南系统1.问题描述假设以一个带权有向图表示某一区域的公交线路图,图中顶点代表一些区域中的重要站点,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一站点到达另一站点。
2.基本要求(1)设计结点和图的存储结构;(2)设计任意两点最短路径方法;(3)输入:图的相关信息以建立公交线路网,以及公交线路网咨询的任意两个站点;(4)输出:两个站点间一条最短的简单路径。
3.实现提示(1)结点和图的存储结构typedef struct node{ int no;float wgt;struct node*next;}edgenode;typedef struct{ char vtx;edgenode*link;} vexnode;typedef vexnode Graph[n];;void Floyd(Graph G,float A[n][n],int p[n][n]){ int i,j,k;for(i=0;i<n;i++)fot(j=0;j<n;j++){ A[i][j]=G[i][j];P[i][j]=-1;}for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)if(A[i][k]+A[k][j]<A[i][j]){ p[i][j]=k;A[i][j]=A[i][k]+A[k][j];}}(2)算法提示采用任意两点最短路径的相关算法。
4.算法设计(1)结点类型:struct ArcCell{int adj; //存放弧长bool *info; //是否用过该弧};struct _MGraph{char vexs[20]; //存放站点ArcCell arcs[20][20]; //<i,j>int vexnum;int arcnum;};(2)类定义:class MGraph //没用私有成员{public:_MGraph mgraph;//void DestroyGraph(); //析构函数销毁图int LocateVex (char u); // 返回顶点在图中的位置bool CreateDN(); //构造有向网void ShortestPath_FLOYD(Path &P,Distanc &D);};(3)构造有向网:bool MGraph::CreateDN()//构造有向网{int i,j ,w;char v1, v2;cout<<"请输入站点个数,直接线路的条数: ";cin>>mgraph.vexnum>>mgraph.arcnum ;cout<<"\n请输入各站点名: ";for(i = 0;i<mgraph.vexnum;i++)//构造顶点向量{cin>>mgraph.vexs[i];}for(i = 0;i<mgraph.vexnum;i++) //初始化邻接矩阵{for(j = 0;j<mgraph.vexnum;j++){if(i==j)mgraph.arcs[i][j].adj = 0;elsemgraph.arcs[i][j].adj = 20000; //infinity;mgraph.arcs[i][j].info = false;}}for(i = 0;i<mgraph.arcnum;i++) //构造邻接矩阵{cout<<"\n请输入一条线路的起点,终点,距离(公里): ";cin>>v1>>v2>>w;int m = LocateVex(v1);int n = LocateVex(v2);mgraph.arcs[m][n].adj = w; // <v1, v2>的权值}return true;}(4)销毁有向图:void MGraph::DestroyGraph(){for(int i = 0 ;i<mgraph.vexnum;i++)for(int j = 0;j<mgraph.vexnum;j++){if(mgraph.arcs[i][j].info){delete []mgraph.arcs[i][j].info;mgraph.arcs[i][j].info = false;}}mgraph.vexnum = 0;mgraph.arcnum = 0;}(5)定位点:int MGraph::LocateVex(char u){for(int i = 0 ;i<20;i++){if(u == mgraph.vexs[i]){return i;}}return -1;}(6)最短路径void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径// 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]// 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。
3-交通咨询系统设计-数据结构-课程设计任务书

交通资讯系统1.系统需求分析1.1问题描述在交通网络非常发达的今天,人们出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也很感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示城市,边表示城市之间的交通关系。
设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到达另外一个城市顶点之间的最短路径(里程)的问题。
1.2功能要求For personal use only in study and research; not for commercial use1.交通资讯系统提供用户三种决策方案:一是建立交通网络图的存储结构。
二是某个城市到达其余各城市的最短路径。
三是实现两个城市之间最短路径的问题。
主要目的是给用户提供路径咨询。
2.本系统规定:(1)在程序中输入城市名称时,需输入0到5的城市代号For personal use only in study and research; not for commercial use(2)在选择功能是,应输入与所选功能对应的一个整形数据。
(3)程序的输出信息主要是:城市代号,某城市到达其余各城市的最短路径,两城市之间最短路径2.概要设计2.1系统总体设计图2.1系统总体设计2.2各模块的功能void main() 主函数void Dijkstr() 采用狄克斯特拉算法求从顶点v 到其余个顶点的最短路径 void DisPath() 由path 计算最短路径 void Ppath() 输出各条最短路径void Floyd() 采用弗洛伊德算法求所有顶点之间的最短路径交通资讯系统一个城市到其他城市两个城市之间存储 交 通图查询最短距离获得最佳路径查询最短距离获得最佳路径void DisPath2() 由path计算最短路径void Ppath2() 输出各条最短路径2.3相关数据结构设计1.数据结构typedef int InfoType;typedef struct{char cityname;int no;InfoType info;}VertexType;typedef struct{int edges[MAXV][MAXV];int n,e;VertexType vxs[MAXV];}MGraph;2.数据库结构:下表构成该系统的基本数据库城市代号邻接矩阵边数城市个数路径城市名称组int int int int char3.详细设计3.1采用c语言定义相关的数据结构本系统定义了整形int,字符型char,还有结构体定义,建立图的存储结构首先定义交通图的存储结构,邻接矩阵是表示图形中顶点之间相邻关系的矩阵.设G=(V,E)是具有n(n>0)个顶点的图,则邻接矩阵具有如下定义的n阶方阵Wij 若vi≠vj 且<vi,vj>∈E(G)A[i][j]=∞ 其他一个图的邻接矩阵表示是唯一的,除了许用一个二维数组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n 个元素的一维数组来存储顶点信息3.2函数调用关系图void main(){ int i,j,z,x; MGraph g;intA[][MAXV]={{INF,5,INF,7,INF,INF},{INF,INF,4,INF,INF,INF},{8,INF,INF,INF,INF,9},{INF,INF,5,INF,INF,6},{INF,INF,INF,5,INF,INF}, {3,INF,INF,INF,1,INF}}; g.n=6; g.e=10;for(i=0;i<g.n;i++)main 函数z=1 查看系统中的城市代号z=2;调用Dijkstra 函数求v 到其余各顶点的最短路径 调用DisPath 函数计算最短路径调用ppath 函数 输出各条最短路径 z=3;调用Floyd 函数求所有定点之间的最短路径调用ppath2函数 输出各条最短路径调用DisPath2函数 计算最短路径z=0 退出程序for(j=0;j<g.n;j++)g.edges[i][j]=A[i][j];printf("******************* 交通咨询系统**********************\n");printf("************* 1-查看系统中的城市代号**********\n");printf("************* 2-一个城市到所有城市的最短路径**********\n");printf("************* 3-任意的两个城市之间的最短路径**********\n");printf("************* 0-退出**********\n");printf("\n");printf("请选择:");scanf("%d",&z);while(z!=0){switch(z){case 1:printf("0——北京,1——天津,2——上海,3——广州,4——南京,5——厦门\n");printf("\n");main();scanf("%d",&z);break;case 2:printf("请输入城市代号:");scanf("%d",&x);switch(x){case 0:printf("以下是最短路径:\n");Dijkstra(g,x);break;case 1:printf("以下是最短路径:\n");Dijkstra(g,x);break;case 2:printf("以下是最短路径:\n");Dijkstra(g,x);break; case 3:printf("以下是最短路径:\n");Dijkstra(g,x);break;case 4:printf("以下是最短路径:\n");Dijkstra(g,x);break;case 5:printf("以下是最短路径:\n");Dijkstra(g,x);break;default :printf("输入有误,请重新输入\n");printf("\n");main();}printf("\n");main();scanf("%d",&z);break;case 3:Floyd(g);printf("请选择:");printf("\n");main();scanf("%d",&z);break;case 0:exit(-1);break;default:printf("输入有误,请重新输入\n");printf("\n");main();}}}初始化距离和路径,将s[]置为空。
(完整word版)数据结构课程设计交通咨询系统

目录第1章概述 (1)1.1 性能需求 (1)1.2 功能需求 (2)第2章概要设计 (3)2。
1功能模块设计 (3)2.2算法分析与设计 (3)第3章详细设计 (5)3.1 管理员功能模块设计 (5)3。
2计算最少费用功能模块设计 (11)第4章调试分析与测试结果 (18)4。
1调试分析 (18)4。
2测试结果 (19)第5章总结 (21)参考文献 (22)附录 (23)第1章概述数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构.数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:1。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4。
数据结构课程设计交通咨询系统2.cpp

头文件:(TrafficGraph.h)#ifndef TrafficGraph_h#define TrafficGraph_h#define dingdian 18#define NULL 0#define hu 100#define lujing 5#include"queue.h"#include"heap.h"#include<string.h>#include<conio.h>#include<fstream>char *ch[2]={"列车","航班"};template<class T>class Graph{struct EdgeNode{int dest;double cost;operator int(){return dest;}};typedef struct{char number[20];float expenditure;int begintime[2];int arrivetime[2];}qiche;typedef struct{qiche stata[lujing];int last;}infolist;typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode{char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[dingdian];typedef struct{AdjList vertices;int vexnum,planearcnum,trainarcnum; }ALGraph;AdjList vertices;int vexnum,planearcnum,trainarcnum; typedef struct Node{int adjvex;int route;struct Node *next;}Node;typedef struct QNode{int adjvex;struct QNode *next;}QNode;typedef struct{QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode{int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[lujing];}TimeNode,*TimeTree;struct arc{char co[20];char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[hu];char city[dingdian][10];int TTime[2],time[2],time1[2],time2[2];int c[dingdian],d[dingdian];public:Graph(){}~Graph(){}void guanliyuan();void cityedit();void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph();void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[dingdian]);void createtrainfile();void DeleteEdge(int j,T *code,ArcNode *E,char *ch);int DeleteplaneArc();void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc();void DeleteVertex();void DemandDispose(int n);void DestoryTimeTree(TimeTree p);void EnterEdge(int j,int *bt,int *at,T *code,float money,ArcNode *E,int s);void EnterplaneArc();void EnterQueue(LinkQueue *Q,int x);void EntertrainArc();void EnterVertex();void ExpenditureDispose(int k,infolist (*arcs)[dingdian],int v0,int v1,float *M,int *final);void flightedit();//编辑航班void chushihua();//初始化系统void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(T *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph();int save();void TimeDispose(int k,infolist (*arcs)[dingdian],int v0,int v1,int (*S)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[dingdian]);void trainedit();void TransferDispose(int k,infolist (*arcs)[dingdian],int v0,int v1);void UserDemand();void VisitTimeTree(TimeTree p);};template<class T>void Graph<T>::guanliyuan(){int i=0;while(i!=5){system("cls");cout<<"\n\t\t\t【管理员管理】"<<endl;cout<<"\t\t*******************************"<<endl;cout<<"\t\t\t1=初始化交通系统"<<endl;cout<<"\t\t\t2=城市编辑"<<endl;cout<<"\t\t\t3=飞机航班编辑"<<endl;cout<<"\t\t\t4=列车车次编辑"<<endl;cout<<"\t\t\t5=返回上一级菜单"<<endl;cout<<"\t\t*******************************"<<endl;cout<<"\t\t请输入您的选择:";cin>>i;getchar();switch(i){case 1:chushihua();break;case 2:cityedit();break;case 3:flightedit();break;case 4:trainedit();break;}}}template<class T>void Graph<T>::chushihua(){system("cls");int i;cout<<"\n\t\t您想从哪儿初始化(键盘(1)或文档(2)):";cin>>i;getchar();switch(i){createcityfile();createplanefile();createtrainfile();CreateGraph();break;case 2:CreateGraph();break;}}template<class T>void Graph<T>::createcityfile()//新建“城市”文件{int i=0;int j;char flag='y';FILE *fp;cout<<"【请输入城市名称的信息】"<<endl;while(flag=='y'||flag=='Y'){cout<<"城市名称(小于10字符):";gets(city[i]);i++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("city.txt","wb"))==NULL){cout<<"无法打开文件!"<<endl;return;}for(j=0; j<i; j++)fprintf(fp,"%10s",city[j]);fclose(fp);}template<class T>void Graph<T>::createplanefile()//新建“航班”文件{T code[20];int bt[2],at[2];float money;int i;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y'){cout<<"【请输入飞机航班的信息】"<<endl;cout<<"飞机航班编号:";cin>>code;getchar();cout<<"起始城市:";gets(vt);cout<<"目的城市:";gets(vh);cout<<"航班费用:";cin>>money;getchar();cout<<"起飞时间:(时:分)";scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&bt[0],&bt[1]);getchar();}cout<<"到达时间:(时:分)";scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&at[0],&at[1]);getchar();}strcpy(a[count].co,code);strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("plane.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;fprintf(fp,"%d",count);for(i=0; i<count; i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;fclose(fp);}template<class T>void Graph<T>::createtrainfile(){T code[20];int bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){cout<<"【请输入列车车次的信息】"<<endl;cout<<"列车车次编号:";cin>>code;getchar();cout<<"起始城市:";gets(vt);cout<<"目的城市:";gets(vh);cout<<"车次费用:";cin>>money;getchar();cout<<"发车时间:(时:分)";scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&bt[0],&bt[1]);getchar();}cout<<"到达时间:(时:分)";scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&at[0],&at[1]);getchar();}strcpy(a[count].co,code);strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("train.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;fprintf(fp,"%d",count);for(i=0; i<count; i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;fclose(fp);}template<class T>int Graph<T>::LocateVertex(T *v){int j,k;j=-1;for(k=0; k<vexnum; k++)if(strcmp(vertices[k].cityname,v)==0){j=k;break;}return j;}template<class T>void Graph<T>::CreateGraph(){int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fopen("city.txt","rb"))==NULL){cout<<"无法打开文件!"<<endl;return;}while(!feof(fp)){fscanf(fp,"%10s",city[i]);i++;}fclose(fp);j=0;while(j<i){strcpy(vertices[j].cityname,city[j]);vertices[j].planefirstarc=NULL;vertices[j].trainfirstarc=NULL;j++;}vexnum=i;if((fp=fopen("plane.txt","rb"))==NULL)cout<<"无法打开文件!"<<endl;k=0;fscanf(fp,"%d",&count1);while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)cout<<"文件读取错误!"<<endl;k++;}fclose(fp);k=0;arc_num=0;while(k<count1){i=LocateVertex(a[k].vt);j=LocateVertex(a[k].vh);q=vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+1;strcpy(q->info.stata[t].number,a[k].co);q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;strcpy(p->info.stata[0].number,a[k].co);p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->st=0;p->nextarc=vertices[i].planefirstarc;vertices[i].planefirstarc=p;arc_num++;}k++;}planearcnum=arc_num;if((fp=fopen("train.txt","rb"))==NULL){cout<<"无法打开文件!"<<endl;return;}k=0;fscanf(fp,"%d",&count2);while(k<count2){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)cout<<"文件读取错误!"<<endl;k++;}fclose(fp);k=0;arc_num=0;while(k<count2){i=LocateVertex(a[k].vt);j=LocateVertex(a[k].vh);q=vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+1;strcpy(q->info.stata[t].number,a[k].co);q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;strcpy(p->info.stata[0].number,a[k].co);p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->st=0;p->nextarc=vertices[i].trainfirstarc;vertices[i].trainfirstarc=p;arc_num++;}k++;}trainarcnum=arc_num;}template<class T>int Graph<T>::save(){int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(j<vexnum){strcpy(city[j],vertices[j].cityname);j++;}i=0;if((fp=fopen("city.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;while(i<vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0; i<vexnum; i++){q=vertices[i].planefirstarc;while(q!=NULL){for(t=0; t<=q->st; t++){strcpy(a[k].vt,vertices[i].cityname);strcpy(a[k].vh,vertices[q->adjvex].cityname);strcpy(a[k].co,q->info.stata[t].number);a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("plane.txt","wb"))==NULL){cout<<"无法打开文件!"<<endl;return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;i++;}fclose(fp);k=0;for(i=0; i<vexnum; i++){q=vertices[i].trainfirstarc;while(q!=NULL){for(t=0; t<=q->st; t++){strcpy(a[k].vt,vertices[i].cityname);strcpy(a[k].vh,vertices[q->adjvex].cityname);strcpy(a[k].co,q->info.stata[t].number);a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}if((fp=fopen("train.txt","wb"))==NULL){cout<<"无法打开文件!"<<endl;return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;i++;}fclose(fp);return 1;}template<class T>void Graph<T>::cityedit(){system("cls");int i;cout<<"您想(1=增加城市,2=删除城市):";cin>>i;getchar();if(i==1)EnterVertex();if(i==2)DeleteVertex();getchar();}template<class T>void Graph<T>::EnterVertex(){char v[10],c;int i;cout<<"请输入新增城市的名称:";gets(v);i=LocateVertex(v);if(i>=0&&i<vexnum){cout<<"此城市已存在,不能新增了。
数据结构课程设计交通咨询系统设计

四、详细设计 1.数据类型定义
(1)全局变量的定义 typedef short int CityType;//CityType 定义短整形的变量 typedef struct TrafficNode { char name[MAX_STRING_NUM]; //班次 //MAX_STRING_NUM最为
for (i--; i>0; i--) { printf("\n%s:", CityName[track[i]]); end = track[i - 1]; min = 32767; for (k = 0; k<AdjList[track[i]].FlightNum; k++) if (AdjList[track[i]].Train[k].EndCity == end&&min>AdjList[track[i]].Flight[k].Cost) { min = AdjList[track[i]].Flight[k].Cost; tmp = k; } printf("%s", AdjList[track[i]].Flight[tmp].name); printf("%2d:%2d-%2d:%2d", AdjList[track[i]].Flight[tmp].StartTime / 60, AdjList[track[i]].Flight[tmp].StartTime % 60, AdjList[track[i]].Flight[tmp].StopTime / 60, AdjList[track[i]].Flight[tmp].StopTime % 60); } } printf("\n%s: DESTINATION!", CityName[track[0]]); printf("\nMin Cost : %d\n", cost); } void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType) { int PreCity[Dij_MAXN]; //PreCity[i]==-1,never used; //PreCity>0,the precity of City i
数据结构区域交通指南图

管理学院09电商专业 1 班学号3109004338 姓名姚礼华协作者____无______ 教师评定_________________ 实验题目区域交通指南图综合实验评分表实验报告一、实验目的与要求1、实现图的邻接矩阵、邻接表存储结构;2、掌握有向网最短路径求解的迪杰斯特拉算法和佛洛依德算法;二、实验内容查找路径的系统需要有以下几个功能:1.要有数据输入的功能2.当数据输入错误时要有方法重新输入本条数据3.要有反复查找路径的功能4.路径的输出要有路程和从起点到终点所要经过的顶点存储结构的设计:1.在数据输入方面我使用的有结构体,图2.在数据输出方面我使用的有栈源程序:(其中有一些代码是用作查看使用)#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<conio.h>#define MAXV 100typedef struct {char vexs[MAXV];int edges[MAXV][MAXV];int n,e;}MGraph;//栈开始#define MAX 100typedef int datatype;typedef struct {datatype data[MAX];int top;}seqstack;seqstack *s;seqstack *createemptystacks(){seqstack *s;s=(seqstack *)malloc(sizeof(seqstack)); s->top=0;return s;}int stackemptys(seqstack *s){return(s->top==0);}int stackfulls(seqstack *s){return s->top==MAX;} void pushs(seqstack *s,datatype x){if(stackfulls(s))printf("overflow\n");else{s->data[s->top++]=x;}}void pops(seqstack *s){if(stackemptys(s))printf("underflow\n");else s->top--;}datatype gettops(seqstack *s){return s->data[s->top-1];}//栈结束MGraph *creategraph(MGraph *g){int i,j,k;g=(MGraph *)malloc(sizeof(MGraph));printf("结点数:");scanf("%d",&g->n);printf("边数(为结点数的二次方减去结点数):"); scanf("%d",&g->e);printf("\n");for(j=0;j<g->n;j++){printf("行列号为%d的结点的值(可以是字符):",j);scanf("%s",&g->vexs[j]);}printf("\n");for(i=0;i<g->n;i++) //初始化矩阵{ for(j=0;j<g->n;j++){g->edges[i][j]=0;/*printf(" %d ",g->edges[i][j]);*/}/*printf("\n");*/}printf("相连的两个顶点(行或列有输错,请在权值上输入大于10000 ,重新输入)\n");printf("如果结点之间不相连,输入权值为1000 \n");for(k=0;k<g->e;k++) //输入边的值{printf("输入行的序列:");scanf("%d",&i);printf("输入列的序列:");scanf("%d",&j);if(i<g->n&&j<g->n){printf("边的权值:");scanf("%d",&g->edges[i][j]);if(g->edges[i][j]>1000){printf("权值出错,重新输入(enter键继续)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南通大学数据结构实验课实验报告学生姓名所在院系专业学号指导教师南通大学2013年 12 月 11 日交通指南系统1.问题描述假设以一个带权有向图表示某一区域的公交线路图,图中顶点代表一些区域中的重要站点,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一站点到达另一站点。
2.基本要求(1)设计结点和图的存储结构;(2)设计任意两点最短路径方法;(3)输入:图的相关信息以建立公交线路网,以及公交线路网咨询的任意两个站点;(4)输出:两个站点间一条最短的简单路径。
3.实现提示(1)结点和图的存储结构typedef struct node{ int no;float wgt;struct node*next;}edgenode;typedef struct{ char vtx;edgenode*link;} vexnode;typedef vexnode Graph[n];;void Floyd(Graph G,float A[n][n],int p[n][n]){ int i,j,k;for(i=0;i<n;i++)fot(j=0;j<n;j++){ A[i][j]=G[i][j];P[i][j]=-1;}for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++)if(A[i][k]+A[k][j]<A[i][j]){ p[i][j]=k;A[i][j]=A[i][k]+A[k][j];}}(2)算法提示采用任意两点最短路径的相关算法。
4.算法设计(1)结点类型:struct ArcCell{int adj; //存放弧长bool *info; //是否用过该弧};struct _MGraph{char vexs[20]; //存放站点ArcCell arcs[20][20]; //<i,j>int vexnum;int arcnum;};(2)类定义:class MGraph //没用私有成员{public:_MGraph mgraph;//void DestroyGraph(); //析构函数销毁图int LocateVex (char u); // 返回顶点在图中的位置bool CreateDN(); //构造有向网void ShortestPath_FLOYD(Path &P,Distanc &D);};(3)构造有向网:bool MGraph::CreateDN()//构造有向网{int i,j ,w;char v1, v2;cout<<"请输入站点个数,直接线路的条数: ";cin>>mgraph.vexnum>>mgraph.arcnum ;cout<<"\n请输入各站点名: ";for(i = 0;i<mgraph.vexnum;i++)//构造顶点向量{cin>>mgraph.vexs[i];}for(i = 0;i<mgraph.vexnum;i++) //初始化邻接矩阵{for(j = 0;j<mgraph.vexnum;j++){if(i==j)mgraph.arcs[i][j].adj = 0;elsemgraph.arcs[i][j].adj = 20000; //infinity;mgraph.arcs[i][j].info = false;}}for(i = 0;i<mgraph.arcnum;i++) //构造邻接矩阵{cout<<"\n请输入一条线路的起点,终点,距离(公里): ";cin>>v1>>v2>>w;int m = LocateVex(v1);int n = LocateVex(v2);mgraph.arcs[m][n].adj = w; // <v1, v2>的权值}return true;}(4)销毁有向图:void MGraph::DestroyGraph(){for(int i = 0 ;i<mgraph.vexnum;i++)for(int j = 0;j<mgraph.vexnum;j++){if(mgraph.arcs[i][j].info){delete []mgraph.arcs[i][j].info;mgraph.arcs[i][j].info = false;}}mgraph.vexnum = 0;mgraph.arcnum = 0;}(5)定位点:int MGraph::LocateVex(char u){for(int i = 0 ;i<20;i++){if(u == mgraph.vexs[i]){return i;}}return -1;}(6)最短路径void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径// 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]// 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。
{int u,v,w,i;for(v = 0;v<mgraph.vexnum;v++){for(w = 0;w<mgraph.vexnum;w++){D[v][w] = mgraph.arcs[v][w].adj;// 顶点v到顶点w的直接距离for(u = 0;u<mgraph.vexnum;u++)P[v][w][u] = false; //路径矩阵初值if(D[v][w]<20000) //从v到w有直接路径P[v][w][v] = P[v][w][w] = true;//由v到w的路径经过v和w两点}}for(u = 0;u<mgraph.vexnum;u++){for(v = 0;v<mgraph.vexnum;v++){for(w = 0;w<mgraph.vexnum;w++){if(D[v][u]+D[u][w]<D[v][w])//从v经u到w的一条路径更短{D[v][w] = D[v][u]+D[u][w];// 更新最短距离for(i = 0;i<mgraph.vexnum;i++)P[v][w][i] = P[v][u][i]||P[u][w][i];//从v到w的路径经过从v到u和从u到w 的所有路径}}}}}5.源代码#include <iostream>using namespace std;struct ArcCell{int adj; //存放弧长bool *info; //是否用过该弧};struct _MGraph{char vexs[20]; //存放站点ArcCell arcs[20][20]; //<i,j>int vexnum;int arcnum;};typedef int Path[20][20][20];typedef int Distanc[20][20];class MGraph //没用私有成员{public:_MGraph mgraph;//void DestroyGraph(); //析构函数销毁图int LocateVex (char u); // 返回顶点在图中的位置bool CreateDN(); //构造有向网void ShortestPath_FLOYD(Path &P,Distanc &D);};bool MGraph::CreateDN()//构造有向网{int i,j ,w;char v1, v2;cout<<"请输入站点个数,直接可达线路的条数: ";cin>>mgraph.vexnum>>mgraph.arcnum ;cout<<"\n请输入各站点名: ";for(i = 0;i<mgraph.vexnum;i++)//构造顶点向量{cin>>mgraph.vexs[i];}for(i = 0;i<mgraph.vexnum;i++) //初始化邻接矩阵{for(j = 0;j<mgraph.vexnum;j++){if(i==j)mgraph.arcs[i][j].adj = 0;elsemgraph.arcs[i][j].adj = 20000; //infinity;mgraph.arcs[i][j].info = false;}}for(i = 0;i<mgraph.arcnum;i++) //构造邻接矩阵{cout<<"\n请输入其中一条线路的起点站点名,终点站点名,需要时间(分钟): ";cin>>v1>>v2>>w;int m = LocateVex(v1);int n = LocateVex(v2);mgraph.arcs[m][n].adj = w; // <v1, v2>的权值}return true;}void MGraph::DestroyGraph(){for(int i = 0 ;i<mgraph.vexnum;i++)for(int j = 0;j<mgraph.vexnum;j++){if(mgraph.arcs[i][j].info){delete []mgraph.arcs[i][j].info;mgraph.arcs[i][j].info = false;}}mgraph.vexnum = 0;mgraph.arcnum = 0;}int MGraph::LocateVex(char u){for(int i = 0 ;i<20;i++){if(u == mgraph.vexs[i]){return i;}}return -1;}void MGraph::ShortestPath_FLOYD(Path &P,Distanc &D)//求每对顶点间的最短路径// 用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]// 若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。