实验报告C语言数据结构全国交通模拟咨询
全国交通咨询模拟系统C实现课程设计报告

全国交通咨询模拟一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。
得到软件设计技能的训练。
二、问题描述交通咨询模拟。
根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。
旅途用火车或飞机作为交通工具。
用计算机编制程序,为旅客提供两种最优决策的交通咨询系统。
三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的两种交通工具:飞机和火车。
对飞机航班和列车时刻表进行编辑:里程、航班和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;4、旅途中的耗费的总时间应包括中转站的等候时间。
其中飞机至少二小时,火车至少一小时;5、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟班机或列车何时到达何地。
四、实现提示1、算法思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里建议采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
交通图咨询查询系统数据结构(C语言)

信息科学与工程学院《结构数据》课程设计报告课程设计名称:交通咨询系统专业班级 : 计算机xxx学生姓名 : xxx学号: 2015xxxx指导教师 : xx课程设计时间:2016。
07.04—2016.07.08计算机应用技术专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页填表说明1.“课题性质”一栏:A.工程设计;B.工程技术研究;C.软件工程(如CAI课题等);D.文献型综述;E.其它。
2.“课题来源"一栏:A.自然科学基金与部、省、市级以上科研课题;B.企、事业单位委托课题;C.校、院(系、部)级基金课题;D.自拟课题。
目录1 需求分析 01。
1 添加交通图信息 01。
2 查询单源最短路径 01。
3 查询多源最短路径 01。
4 更新交通图信息 01.6 读取、保存信息 (1)2 概要设计 (2)2.1 数据类型的定义 (2)2.2 功能模块结构图 (3)3 运行环境 (6)4 开发工具和编程语言 (6)5 详细设计 (7)5。
1 图结构的基本操作 (7)5。
1。
1添加城市结点和路径结点 (8)5。
1.2修改城市结点和路径结点 (8)5.1。
3删除城市结点和路径结点 (8)5。
1。
4退出保存 (8)5。
2 迪杰斯特拉算法的实现 (8)5.2。
1 迪杰斯特拉算法函数 (8)5.2.2 提取迪杰斯特拉函数信息 (8)5.2。
3 求多源最短路径 (8)6 程序编码 (9)7 运行结果 (39)8 心得体会 (45)9参考文献 (46)1需求分析本系统中的数据来源于标准输入设备(如键盘)和文件,可以实现对交通图城市、城市到其余城市的距离的操作,根据需要可查询某两个城市之间的最短距离、城市到各城市的最短距离,各个城市到各个城市的最短距离,以及路径。
本系统要实现的功能有:添加城市和城市间距离,删除城市及城市间距离,修改城市间距离,查询城市间的最短路径,查询某个城市到某个城市的最短路径。
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序文件

分类号编号华北水利水电学院North China Institute of Water Conservancy and Hydroelectric Power 课程设计题目:全国交通资讯系统院系信息工程学院专业计算机科学与技术专业姓名指导教师彬2013年6月28日目录1.需求分析 (1)问题描述 (1)1.1基本要求 (2)2概要设计 (3)2.1 数据结构 (3)2.2 程序模块 (5)3.详细设计 (6)3.1用到的各种函数 (6)3.2函数调用关系图 (8)3.3测试与分析 (8)4.用户说明书 (13)5.总结 (15)5.1明月的总结 (15)5.2璐璐的总结 (16)5.3吕竹青的总结 (17)参考文献: (18)附录:程序源代码 (18)1.需求分析问题描述设计、模拟一个全国城市间的交通咨询程序,为旅客提供三种最优咨询方案:(1)时间最短;(2)费用最小;(3)中转次数最少。
1.1基本要求1.1.1输入输出的形式和输入值的围在程序中输入城市名称时,需输入10个字母以的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。
1.1.2 输出形式程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
1.1.3程序所能达到的功能程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达,显示编辑的全国交通系统。
1.1.4任务分配在本程序中,我们一共划分了三个模块。
管理员模块的初始化数据,城市信息的编辑,以及显示交通系统和整体的界面由明月完成。
航班班次以及列车车次添加删除以及数据结构的初步实现由吕竹青完成。
交通咨询模拟数据结构课程设计

数据结构课程设计报告题目:全国交通咨询模拟一.需求分析1.程序设计任务:从中国地图平面图中选取部分城市,抽象为程序所需要图的结点,并以城市间的列车路线和飞机路线,作为图结点中的弧信息,设计一个全国交通咨询模拟系统。
利用该系统实现两种最优决策:最快到达或最省钱到达。
2. 明确规定:(1)输入形式和输入值的范围:每条飞机弧或者火车弧涉及的信息量很多,包括:起始城市、目的城市、出发时间、到达时间、班次以及费用。
作为管理员要输入的信息包括以上信息,而作为用户或者客户,要输入的信息有起始城市和目的城市,并选择何种最优决策。
(2)输出形式:按用户提供的最优决策的不同而输出不同的信息,其中输出的所搭飞机或火车的班次及其起始地点和终点、起始时间和出发时间还有相关的最优信息,比如最快经多少时间到达、最省钱多少钱到达和最少经多少中转站到达。
(3)程序所能达到的功能a.该系统有供用户选择的菜单和交互性。
可以对城市、列车车次和飞机航班进行编辑,添加或删除。
b.建立一个全国交通咨询系统,该系统具备自动查找任意两城市间铁路、飞机交通的最短路径和最少花费及中转次数最少等功能。
c.初始化交通系统有两种方式,键盘和文档。
二.设计概要1. 算法设计(1)、总体设计(1) 数据存储:城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构:根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构:采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
交通运输-数据结构实训全国交通咨询模拟 精品

学生实训报告实训名称:数据结构实训指导教师:姓名:学号:班级:日期:一、实训项目项目名称:全国交通咨询模拟二、实训的目的1.熟悉图数据结构;2.掌握图的顺序存储结构—邻接表;3.掌握最短路径算法4.上机调试程序,掌握查错、排错使程序能正确运行。
三.实训要求1.每个人独立完成实训项目,相互之间可以交流,不能抄袭2.实训的成果包括程序代码和报告3.程序代码要有注释和说明三、实验的环境:1.硬件环境: PC机2.软件环环境:Windows2000 +Visual C++6四、算法描述:建立图的数据结构,采用邻接矩阵作为其存储结构。
存储以上的全国主要城市的交通信息。
通过软件模拟的方法实现:给定出发点和终点,求出它们之间的最短路径,并给出最短路径的线路。
五、源程序清单:#include <stdio.h>#include<string.h>#define VEX_NUM 26#define MAXINT 1000000typedef struct graph{char city[VEX_NUM][10];int arcs[VEX_NUM][VEX_NUM];}Mgraph;void CreatGraph(Mgraph *G,int e);void Dijkstra(Mgraph *Gn, int v0,int path[],int dist[]);void PutPath(Mgraph *g,int v0,int v1,int p[],int d[]);int index(char s[],Mgraph *g);void main(){Mgraph *g;int i;int e;int v0,v1;char sr[10],dt[10];int dist[VEX_NUM];int path[VEX_NUM];g=new Mgraph;CreatGraph(g,30);printf("输入出发城市和终点城市\n");getchar();gets(sr);v0=index(sr,g);gets(dt);v1=index(dt,g);Dijkstra(g,v0,path,dist);PutPath(g,v0,v1,path,dist);}void CreatGraph(Mgraph *G,int e){int i,j,k,cost;printf("输入城市名称\n");for(i=0;i<VEX_NUM;++i)scanf("%s",G->city[i]);for(i=0;i<VEX_NUM;i++)for(j=0;j<VEX_NUM;j++)G->arcs[i][j]=MAXINT;printf("输入城市之间的距离\n");for(k=0;k<e;k++){scanf("%d,%d,%d",&i,&j,&cost);G->arcs[i][j]=cost;G->arcs[j][i]=cost;}}void Dijkstra(Mgraph *Gn, int v0,int path[],int dist[]) {int s[VEX_NUM];int v;int w;int i,j,k;int min;for(v=0; v<VEX_NUM; v++){s[v]=0;dist[v]=Gn->arcs[v0][v];if(dist[v]<MAXINT)path[v]=v0;else path[v]=-1;}dist[v0]=0;s[v0]=1;for(i=1;i<VEX_NUM -1;i++){min=MAXINT;for(w=0;w<VEX_NUM;w++)if(!s[w] && dist[w]<min){v=w;min=dist[w];}s[v]=1;for(j=0;j<VEX_NUM;j++)if(!s[j] && (min+Gn->arcs[v][j]<dist[j])){dist[j]=min+Gn->arcs[v][j];path[j]=v;}}}void PutPath(Mgraph *g,int v0,int v1,int p[],int d[]) {int k;int next;int top=0;int st[20];if(d[v1]<MAXINT && v1!=v0){st[top++]=v1;next=p[v1];while(next!=v0){st[top++]=next;next=p[next];}}elseif(v1!=v0){printf("%s->%s:没有路径\n",g->city[v0],g->city[v1]);return;}st[top++]=v0;while(top){next=st[--top];if(top!=0)printf("%s->",g->city[next]);elseprintf("%s\n",g->city[next]);}printf("两个城市之间的最短距离为:%d\n",d[v1]);}int index(char s[],Mgraph *g){int i;for(i=0;i<VEX_NUM;i++)if(strcmp(s,g->city[i])==0)return i;}六、运行结果:七、实验运行情况分析(包括算法、运行结果、运行环境等问题的讨论)。
2数据结构——全国交通咨询模拟系统实验报告

2数据结构——全国交通咨询模拟系统实验报告
实验目的:
实验环境:
本次实验的开发环境为Java编程语言,使用了面向对象的编程思想,采用了数据结构中的图和链表等数据结构。
实验内容:
1.设计交通工具类:
首先,根据系统需求,设计了交通工具类,该类用于表示交通工具的
基本信息,包括交通工具的名称、班次、票价等。
在该类中,使用了链表
数据结构来存储交通工具的班次信息。
2.设计城市类:
接下来,设计了城市类,用于表示各个城市的交通信息。
在该类中,
使用了图数据结构来表示城市之间的联通关系,每个城市作为图的一个节点,城市间的交通工具作为图的边。
实验结果:
经过测试,实验系统能够准确地输出起点城市到终点城市的最短路径
和最佳交通方案,用户可以根据输出信息来决定如何安排旅行计划。
实验总结:。
数据结构课程设计交通咨询系统实验参考代码
数据结构课程设计交通咨询系统实验参考代码#include<stdio.h>#include<stdlib.h>#define MVNum 100//最大顶点数#define Maxint 32767enum boolean{FALSE,TRUE};typedef char VertexType;typedef int Adjmatrix;typedef struct{VertexType vexs[MVNum];//顶点数组,类型假定为charAdjmatrix arcs[MVNum][MVNum];//邻接矩阵,类型假定为int 型}MGraph;int D1[MVNum],P1[MVNum];int D[MVNum][MVNum],P[MVNum][MVNum];/*建立有向图的储存结构*/void CreateMGraph(MGraph * G,int n,int e){//采用邻接矩阵表示法构造有向图G,n、e表示图的当前顶点数和边数int i,j,k,w;for(i=1;i<=n;i++)//输入顶点信息G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;//初始化邻接矩阵printf("输入%d条边人i、j及w:\n",e);for(k=1;k<=e;k++)//读入e条边,建立邻接矩阵{scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图人存储结构建立完毕!\n");}/*迪杰斯特拉算法*/void Dijkstra(MGraph *G,int v1,int n){//利用迪杰斯特拉算法,求出有向图G的v1顶点到其他顶点v 的最短路径P[v]及权D[v]int D2[MVNum],P2[MVNum];int v,i,w,min;enum boolean S[MVNum];for(v=1;v<=n;v++)//初始化S和D{S[v]=FALSE;//置空最短路径终点集D2[v]=G->arcs[v1][v];//置初始的最短路径值if(D2[v]<Maxint)P2[v]=v1;//v1是v的前趋(双亲)elseP2[v]=0;//v无前趋(双亲)}D2[v1]=0;S[v1]=TRUE;//S集初始时只有源点,距离为0for(i=2;i<n;i++)//其余n-1个顶点{min=Maxint;for(w=1;w<=n;w++)if(!S[w] && D2[w]<min){ v=w;min=D2[w]; }//w顶点离v1顶点更近S[v]=TRUE;for(w=1;w<=n;w++)//更新当前最短路径及距离if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])) { D2[w]=D2[v]+G->arcs[v][w];P2[w]=v;}}printf("路径长度,路径\n");for(i=1;i<=n;i++){ printf("%5d",D2[i]);printf("%5d",i); v=P2[i];while(v!=0){printf("<-%d",v);v=P2[v];}printf("\n");}}/*费洛伊德算法*/void Floyd(MGraph *G,int n){//利用费洛伊德算法,求出最短路径int i,j,k;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)P[i][j]=j;elseP[i][j]=0;D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++){for(i=1;i<=n;i++)for(j=1;j<=n;j++){ if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];P[i][j]=P[i][k];}}}}void main(){MGraph *G;int n,e,v,w,k;int xz=1;G=(MGraph *)malloc(sizeof(MGraph));printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);//建立图的存储结构while(xz!=0){printf("***********求城市之间的最短距离***********\n");printf("================================= =========\n");printf("1.求一个城市到所有城市的最短距离\n");printf("2.求任意的两个城市之间的最短距离\n");printf("================================== ========\n");printf("请选择:1或2,选择0 退出:\n");scanf("%d",&xz);if(xz==2){Floyd(G,n);////调用费洛伊德算法printf("输入源点和终点:v,w:\n");scanf("%d,%d",&v,&w);k=P[v][w];if(k==0)printf("顶点 %d 到 %d 无路径!\n",v,w);else{printf("从顶点 %d 到 %d 最短路径是 %d",v,w,v); while(k!=w){printf("->%d",k);k=P[k][w];//k为v的后继顶点}printf("->%d",k);//输出后继顶点printf("路径长度:%d\n",D[v][w]);}}elseif(xz==1){printf("求单源路径,输入源点v;");scanf("%d",&v);Dijkstra(G,v,n);//调用迪杰斯特拉算法}}printf("结束求最短路径,再见!\n");}。
C++数据结构-全国交通咨询模拟报告
数据结构课程设计报告班级:195182学号:20181003991姓名:钟欢日期:2019.12一、课程设计题目与要求1.课程设计题目:全国交通咨询模拟2.问题描述:出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
3.基本要求:3.1提供对城市信息进行编辑(如添加或删除)的功能。
3.2城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增加或删除)的功能。
3.3提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
3.4旅途中耗费的总时间应该包括中转站的等候时间。
3.5咨询以用户和计算机的对话方式进行。
二、需求分析1.问题描述搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。
需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。
2.程序的功能:2.1维护功能:2.1.1航班操作2.1.2列车操作2.1.3更改密码2.2咨询功能2.2.1选择出行交通工具2.2.2选择要查询的信息:○1查询花费最小的路径○2查询耗时最短的路径2.2.3进行进一步的输入得到所需要的结果三、设计1.设计思想1.1数据结构设计1.1.1逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。
全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。
城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。
实验报告C语言数据结构全国交通模拟咨询
浙江工商大学计算机与信息工程学院数据结构实验大作业报告专业:物流1001班级: 1001学号:姓名:金渐指导教师:庄毅2011年12月8日一、问题描述处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
系统框图:模块说明:本系统共分1、23、4、删除城市5、添加列车6、添加航班7、删除列车或航班8、找出最小费用路线9、打印出最小费用路线10、初始化系统数据(读入内存)11、找出最快路线12、计算最快路线耗费的时间并打印13、计算最小费用路线14、主界面15、存储信息到文件16、退出下面是系统总流程图:下面是各模块示意图:三、系统测试1、主界面2、添加城市模块:输入命令1 后,将提示输入城市名,而后返回主界面3、删除城市:输入命令2后,提示输入城市名,而后返回主界面4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面原train文件:添加路线后:5、删除路线:输入命令4,输入班次,而后返回主界面原train文件:删除后ttrain文件:6、查询最小费用路线:输入命令5,并输入起点站和重点站,然后选择交通工具结果正确!7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具四、小结从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。
数据结构课程设计-全国交通咨询模拟系统 程序设计 源代码
数据结构课程设计-全国交通咨询模拟系统程序设计源代码一、程序界面A.关于程序1. 该程序以C语言为开发工具,运行该程序前请确保你地机器上已安装tc或turboc ,否则系统会提示:BGI Error: Graphics not initialized (use 'initgraph'>而无法使用该程序.遇到此情况请安装tc ,建议将其安装到C:目录下,以确保程序运行万无一失.2. 该软件完全支持鼠标,请放心使用.3. 该程序能将您输入地城市转换为象素坐标,显示在屏幕上,操作直观方便,选择城市时,用时标一点该城市即可,省去了输入地麻烦.如果您选择地两个城市间有路径地话,程序除了给您信息输出外,还会在地图上将此路径以不同颜色画出,更加直观.4. 该程序附带三个数据文件(num.txt,vex.txt,len.txt --此文件由系统默认>以供用户调试,用户还可自己创建文件,以备实验查询使用.B. 程序地使用用户打开程序,会看到命令行 : FILE CHANGE SHORTWAY MAP HELP ABOUT QUIT CLRSCR用户将鼠标放于某命令上会看到屏幕最下面有一行字在闪动,这是对命令地解释,如当鼠标访于FILE上时其下解释"press this button to open/creat a file" ,当鼠标空闲时在下面显示:"Please Enter Your Choice With Mouse Or Keyboard" ,提示用户进行命令选择.单机鼠标就会将某一功能打开从而进行某一操作2.用户运行程序时请先打开 FILE 菜单,该菜单有4个命令选项:[ 信息提示 ]1. 调用已存信息库文件(由用户提供>2. 创建新地信息库文件3. 调用演示信息库文件4. 退出程序[ 请输入你地选择(1/2/3/4> ]此时程序等待用户输入选择.输入正确后程序会自动打开地图由用户进行下一步操作.3. 对于其他命令,用户可由显示于屏幕下面地提示进行相关操作.二.程序内部设计及数据结构A. 数据地存放格式1.火车信息数据结构定义:typedef struct inf{ int num。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江工商大学计算机与信息工程学院数据结构实验大作业报告专业:物流1001班级: 1001学号: ***********名:**指导教师:**2011年12月8日一、问题描述处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
二、系统设计系统框图:模块说明:本系统共分15个模块1、主函数2、添加城市3、查找城市并返回序号4、删除城市5、添加列车6、添加航班7、删除列车或航班8、找出最小费用路线9、打印出最小费用路线10、初始化系统数据(读入内存)11、找出最快路线12、计算最快路线耗费的时间并打印13、计算最小费用路线14、主界面15、存储信息到文件16、退出下面是系统总流程图:下面是各模块示意图:三、系统测试1、主界面2、添加城市模块:输入命令1 后,将提示输入城市名,而后返回主界面3、删除城市:输入命令2后,提示输入城市名,而后返回主界面4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面原train文件:添加路线后:5、删除路线:输入命令4,输入班次,而后返回主界面原train文件:删除后ttrain文件:6、查询最小费用路线:输入命令5,并输入起点站和重点站,然后选择交通工具结果正确!7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具四、小结从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。
六年级的时候,我的第一台台式电脑就这样被我折腾坏了。
高中,我迷上了硬件,一放假就泡论坛,研究攒机。
大学,我买了一台真正的属于自己的智能手机——魅族M8。
买时已经上市超过两年的M8使用的是被微软抛弃的windows CE系统。
系统的落后导致了应用程序的匮乏,虽然日常应用勉强可以应付,但是看着android丰富有趣的app不免让人心痒。
于是在大一的寒假里我第一次萌生了学习编程的念头。
现在,经过了C语言和数据结构的学习之后,编写一个相对大型的程序的机会终于来了,我也憋足了劲想要写出一个优秀的程序,并且选择了一个具有实际价值的模型——全国交通咨询系统。
第一天,我花了周六10个小时的时间写出了寻找相邻城市旅行时间最短的一个函数,然而这只是系统其中的一个简单的功能。
至此,我也就做好了在编写过程中遇到相当大困难的准备。
但是,后来的一个星期里,虽然利用了所有的课外时间来思考文件的存储格式以及所有城市间的转车、最低费用、最短时间函数,事情却依然毫无进展。
由于期末临近,时间紧迫,我只好求助于网上的资料。
查阅之后发现求图的最短路径使用的是我还未学会的迪杰斯特拉算法。
在认真研究之后,终于将迪杰斯特拉算法加到了自己的程序之中,完成了最最关键的功能。
两个星期后的今天,终于完成了系统的全部功能以及测试。
这一次的编程经验,我最大的体会是:代码的编写、调试并不是最困难的部分。
最困难的部分在于如何构思出一个巧妙的软件框架、统一的数据输入输出格式以形成一个完整的体系。
包括各种全局变量的设定、模块的划分都是需要很长的时间去考虑完善的。
五、附录cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <stdio.h>#include <string.h>#include<stdlib.h>/////////////////////////////////////结构体定义////////////////////////////////typedef short int NumType;typedef struct TrafficWay //交通工具信息记录了班次起止时间目的地价格{char name[15]; //班次int DepTime;int ArriveTime; //起止时间,以分钟为单位int DesCity; //目的地的编号int Price; //票价} TrafficWayDat;typedef struct CityNode //城市信息只记录序号通过的火车飞机数以及所有火车飞机的结构体{NumType city; //城市的序号int TrainNum,FlightNum; //标记火车列次和飞机航班数TrafficWayDat Train[15]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficWayDat Flight[15];} CityNodeDat; //节点数据类型typedef struct PathNode //存储路径的路点{int City;int FlainNo; //此地应乘的火车或飞机航班的次号} PathNodeDat;/////////////////////////////////////////变量定义//////////////////////////////////////CityNodeDat CityInfo[33]; //System Info ,记录城市信息char CityName[33][15]; //用来记录城市名,第一下标为该城市编号int NumofCity; //城市数目PathNodeDat TemPath[33]; //存储临时路径PathNodeDat MinPath[33]; //存储目前为止的最小路径int MinTime/*目前最小时间*/,DepTime/*出发时间*/;int curPath;const char CityFile[] ="city.txt";const char TrainFile[] ="train.txt";const char FlightFile[] ="flight.txt";//////////////////////////////////////////////添加城市////////////////////////////int AddCity (char *Name) //添加城市{strcpy(CityName[NumofCity],Name);CityInfo[NumofCity].city/*int类型*/=NumofCity;CityInfo[NumofCity].FlightNum=0;CityInfo[NumofCity].TrainNum=0;NumofCity++; //始终在最后一个空位置return 1;}////////////////////////////查找城市并返回序号///////////////////////////////int FindNumofCity (char *name) //查找城市并返回城市序号若无返回-1{int i;for (i=0;i<NumofCity;i++)if (strcmp(name,CityName[i])==0)return i;return -1;}/////////////////////////////////////删除城市///////////////////////int DelCity (char *Name){int city,i,j;city=FindNumofCity(Name); //得到城市序号for (i=city;i<NumofCity-1;i++){strcpy(CityName[i],CityName[i+1]); //后一个城市序号覆盖要删除的城市序号CityInfo[i].FlightNum=CityInfo[i+1].FlightNum; //后一个城市的航班数覆盖要删除的城市的航班数CityInfo[i].TrainNum=CityInfo[i+1].TrainNum; //后一个城市的火车数覆盖要删除的城市的火车数for (j=0;j<CityInfo[i].FlightNum;j++){CityInfo[i].Flight[j].Price=CityInfo[i+1].Flight[j].Price;CityInfo[i].Flight[j].DesCity=CityInfo[i+1].Flight[j].DesCity;strcpy(CityInfo[i].Flight[j].name,CityInfo[i+1].Flight[j].name);CityInfo[i].Flight[j].DepTime=CityInfo[i+1].Flight[j].DepTime;CityInfo[i].Flight[j].ArriveTime=CityInfo[i+1].Flight[j].ArriveTime;} //覆盖航班信息}NumofCity--;//城市数减少1return 1;}////////////////////////////////////////////////添加列车//////////////////////////////////////////////int AddTrain (char *train,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost) //添加列车{int i,j;i=FindNumofCity(DepCity);//起始城市序号j=FindNumofCity(DesCity); //终点城市序号CityInfo[i].Train[CityInfo[i].TrainNum].Price=cost;CityInfo[i].Train[CityInfo[i].TrainNum].DesCity=j;CityInfo[i].Train[CityInfo[i].TrainNum].DepTime=DepTime;CityInfo[i].Train[CityInfo[i].TrainNum].ArriveTime=EndTime;strcpy(CityInfo[i].Train[CityInfo[i].TrainNum].name,train);CityInfo[i].TrainNum++;//复制各类信息后,列车数+1return 1;}//////////////////////////////////////////////添加航班////////////////////////////int AddFlight(char *flight,char *DepCity,char *DesCity,int DepTime,int EndTime,int cost) //添加航班{int i,j;i=FindNumofCity(DepCity);j=FindNumofCity(DesCity);CityInfo[i].Flight[CityInfo[i].FlightNum].Price=cost;CityInfo[i].Flight[CityInfo[i].FlightNum].DesCity=j;CityInfo[i].Flight[CityInfo[i].FlightNum].DepTime=DepTime;CityInfo[i].Flight[CityInfo[i].FlightNum].ArriveTime=EndTime;strcpy(CityInfo[i].Train[CityInfo[i].FlightNum].name,flight);CityInfo[i].FlightNum++;return 1;}//////////////////////////////////////删除列车或航班//////////////////////////////////////int DelPath (char *name) //删除路径{int i;int j;int flag=0;for (i=0;i<NumofCity;i++){for (j=0;j<CityInfo[i].FlightNum;j++)if (strcmp(CityInfo[i].Flight[j].name,name)==0) //找到该航班{flag=1;break; //跳出for}if (flag) //找到了航班{for (;j<CityInfo[i].FlightNum-1;j++){CityInfo[i].Flight[j].Price=CityInfo[i].Flight[j+1].Price;CityInfo[i].Flight[j].DesCity=CityInfo[i].Flight[j+1].DesCity;strcpy(CityInfo[i].Flight[j].name,CityInfo[i].Flight[j+1].name);CityInfo[i].Flight[j].DepTime=CityInfo[i].Flight[j+1].DepTime;CityInfo[i].Flight[j].ArriveTime=CityInfo[i].Flight[j+1].ArriveTime;} //用后面的覆盖CityInfo[i].FlightNum--;break; //航班数-1 跳出大for}for (j=0;j<CityInfo[i].TrainNum;j++)if (strcmp(CityInfo[i].Train[j].name,name)==0) //找到该列车车次{flag=1;break;}if (flag){for (;j<CityInfo[i].TrainNum-1;j++){CityInfo[i].Train[j].Price=CityInfo[i].Train[j+1].Price;CityInfo[i].Train[j].DesCity=CityInfo[i].Train[j+1].DesCity;strcpy(CityInfo[i].Train[j].name,CityInfo[i].Train[j+1].name);CityInfo[i].Train[j].DepTime=CityInfo[i].Train[j+1].DepTime;CityInfo[i].Train[j].ArriveTime=CityInfo[i].Train[j+1].ArriveTime;} //覆盖CityInfo[i].TrainNum--;break;}}return 1;}////////////////////////////////打印最小费用路线//////////////////////////////////////////void FindMinPrice_Print(int matx[34][34],int PreCity[34],int p_end,int ByTorByP){int track[34];int i=0,j,k,min,tmp,end,cost=0;j=p_end;track[i++]=j;while (PreCity[j]>=0){cost+=matx[PreCity[j]][j];track[i++]=j=PreCity[j];}printf("\n旅行路线:");if (!ByTorByP){for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<CityInfo[track[i]].TrainNum;k++)if(CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]].Train[k].Price){min=CityInfo[track[i]].Train[k].Price;tmp=k;}printf("请乘坐%s次列车起止时间:",CityInfo[track[i]].Train[tmp].name);printf("%02d:%02d-%02d:%02d",CityInfo[track[i]].Train[tmp].Dep Time/60,CityInfo[track[i]].Train[tmp].DepTime%60,CityInfo[track[i]].Train[tmp].ArriveTime/60,CityInfo[track[i]].Train[tmp].ArriveTime%60);}}else{for(i--;i>0;i--){printf("\n%s:",CityName[track[i]]);end=track[i-1];min=32767;for (k=0;k<CityInfo[track[i]].FlightNum;k++)if(CityInfo[track[i]].Train[k].DesCity==end&&min>CityInfo[track[i]].Flight[k].Price){min=CityInfo[track[i]].Flight[k].Price;tmp=k;}printf("请乘坐%s次航班起止时间:",CityInfo[track[i]].Flight[tmp].name);printf("%02d:%02d-%02d:%02d",CityInfo[track[i]].Flight[tmp].DepTime/60,CityInfo[track[i]].Flight[tmp].DepTime%60,CityInfo[track[i]].Flight[tmp].ArriveTime/60,CityInfo[track[i]].Flight[tmp].ArriveTime%60);}}printf("\n%s: 已到达目的地",CityName[track[0]]);printf("\n最低价格: %d\n",cost);}///////////////////////////找出最小费用路线//////////////////////////void FindMinPrice(int matx[34][34],int p_start,int p_end,int ByTorByP){int PreCity[34];int i,j,min,pre,pos;for (i=0;i<NumofCity;i++){PreCity[i]=-1;}PreCity[p_start]=-2;while (PreCity[p_end]==-1){min=-1;for (i=0;i<NumofCity;i++)if (PreCity[i]!=-1){for (j=0;j<NumofCity;j++)if (PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)){pre=i;pos=j;min=matx[i][j];}}PreCity[pos]=pre;}FindMinPrice_Print(matx,PreCity,p_end,ByTorByP);}//////////////////////////////////////////////////初始化系统,读入内存////////////////////////////////////////////////////////////int InitSysData () //初始化系统数据,将数据读入内存{FILE *fp;int i,j,hour,minute,num,cost;char TempString1[15];char TempString2[15];char TempString3[15];fp=fopen(CityFile,"r");if (!fp){printf("\n文件打开错误!\n请先初始化系统数据!");return -1;}fscanf(fp,"%d",&NumofCity); //读入城市数for (i=0;i<NumofCity;i++) //将城市全部读入内存{fscanf(fp,"%s",&CityName[i]);CityInfo[i].city=i;CityInfo[i].TrainNum=0; //初始化列车数为0CityInfo[i].FlightNum=0; //初始化航班数为0}fclose(fp);fp=fopen(TrainFile,"r");if (!fp){printf("\n文件打开错误\n请先初始化系统数据!");return -1;}fscanf(fp,"%d",&num); //读入列车数for (i=0;i<num;i++){fscanf(fp,"%s",&TempString1);//车次fscanf(fp,"%s",&TempString2); //起点fscanf(fp,"%s",&TempString3); //终点j=FindNumofCity(TempString2);//j等于起点的序号CityInfo[j].Train[CityInfo[j].TrainNum].DesCity=FindNumofCity(TempStrin g3); //把该列车的终点序号赋给经过起点的火车strcpy(CityInfo[j].Train[CityInfo[j].TrainNum].name,TempString1); //车次赋值给该列车fscanf(fp,"%d:%d",&hour,&minute); //读取出发时间CityInfo[j].Train[CityInfo[j].TrainNum].DepTime=hour*60+minute; //出发时间赋值给starttimefscanf(fp,"%d:%d",&hour,&minute); //读取到达时间CityInfo[j].Train[CityInfo[j].TrainNum].ArriveTime=hour*60+minute; //赋值fscanf(fp,"%d",&cost); //读取价格CityInfo[j].Train[CityInfo[j].TrainNum].Price=cost; //赋值CityInfo[j].TrainNum++;}fclose(fp);fp=fopen(FlightFile,"r");if (!fp){printf("\n文件打开错误!\n请先初始化系统数据!");return -1;}fscanf(fp,"%d",&num);for (i=0;i<num;i++){fscanf(fp,"%s",&TempString1);fscanf(fp,"%s",&TempString2);fscanf(fp,"%s",&TempString3);j=FindNumofCity(TempString2);CityInfo[j].Flight[CityInfo[j].FlightNum].DesCity=FindNumofCity(TempString3);strcpy(CityInfo[j].Flight[CityInfo[j].FlightNum].name,TempString1);fscanf(fp,"%d:%d",&hour,&minute);CityInfo[j].Flight[CityInfo[j].FlightNum].DepTime=hour*60+minute;fscanf(fp,"%d:%d",&hour,&minute);CityInfo[j].Flight[CityInfo[j].FlightNum].ArriveTime=hour*60+minute;fscanf(fp,"%d",&cost);CityInfo[j].Flight[CityInfo[j].FlightNum].Price=cost;CityInfo[j].FlightNum++; //同上}fclose(fp);return 1;}//////////////////////////////////////////////////搜索最小时间路线////////////////////////////////////////////////////////int SearchMinTime (NumType City/*现在到达城市可以去的城市*/,NumType DesCity/*终点城市*/,int CurTime/*目前用去的时间*/,int curPathNo/*目前经过站点的数目*/,int ByTorByP){ /*搜索出最小时间的路线*/int i;if (City==DesCity) //到终点了{ // if1if (MinTime>CurTime-DepTime) //目前为止的最小时间若大于current时间{ // if2for (i=0;i<=curPathNo;i++){ // for1MinPath[i].City=TemPath[i].City;MinPath[i].FlainNo=TemPath[i].FlainNo;curPath=curPathNo;}// for1 //则目前最为止最小路径改为current路径,即将cuurrent路径赋值给minpathif(CurTime<DepTime)MinTime=CurTime+1440-DepTime;elseMinTime=CurTime-DepTime;//current时间赋值给最短时间} // if2} // if1else //没到终点{ // 最大的elsecurPathNo++; //经过的站点数TemPath[curPathNo].City=City; //记录现在到达的站点的所有名字if (!ByTorByP) //没到终点,若是火车{ // 最大的else下的iffor (i=0;i<CityInfo[City].TrainNum;i++) //一一搜索现在站点出发的火车{ // 最大的else下的if下的forif((CityInfo[City].Train[i].DepTime>=(CurTime%1440))&&(CityInfo[City].Train[i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime)) //若此列车出发时间大于等于现在的时间也就是可以坐上{ // 最大的else下的if下的for的if1//且(此列车的到站时间+已经花去的时间)-出发的时间小于TemPath[curPathNo].FlainNo=i;//记录在此地应乘的经过这里的第i列火车//目前为止的最小时间(若已经大于了,那就没有计算的必要了)SearchMinTime(CityInfo[City].Train[i].DesCity/*(后来调用)现在到达城市可以去的城市*/,DesCity,CityInfo[City].Train[i].ArriveTime+(CurTime/1440)*1440,curPathNo,ByTorByP); //再次搜索}if((CityInfo[City].Train[i].DepTime<(CurTime%1440))&&(CityInfo[City].Train[i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime)) //坐不上该车,所以要等一天{TemPath[curPathNo].FlainNo=i; //记录在此地应乘的经过这里的第i列火车SearchMinTime(CityInfo[City].Train[i].DesCity,DesCity,CityInfo[C ity].Train[i].ArriveTime+(CurTime/1440+1/*等一天*/)*1440,curPathNo,ByTorByP);}}}else //没到终点,不是火车是飞机{for (i=0;i<CityInfo[City].FlightNum;i++){if((CityInfo[City].Flight[i].DepTime>=CurTime)&&(CityInfo[City].Flight[i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime)){TemPath[curPathNo].FlainNo=i;SearchMinTime(CityInfo[City].Flight[i].DesCity,DesCity,CityInfo[City].Flight[i].ArriveTime+(CurTime/1440)*1440,curPathNo,ByTorByP);}if((CityInfo[City].Flight[i].DepTime<CurTime)&&(CityInfo[City].Flight[i].ArriveTime+(CurTime/1440)*1440-DepTime<MinTime)){TemPath[curPathNo].FlainNo=i;SearchMinTime(CityInfo[City].Flight[i].DesCity,DesCity,CityInfo[City].Flight[i].ArriveTime+(CurTime/1440+1)*1440,curPathNo,ByTorByP);}}}}return 1;}////////////////////////////////////计算最小时间//////////////////////////////////////int CalcMinTime (int DepCity,int DesCity,int ByTorByP) //计算最小时间,调用searchmintime{int i;MinTime=32767;curPath=0;TemPath[0].City=DepCity; //第一站是起点if (!ByTorByP)// 若是火车{for (i=0;i<CityInfo[DepCity].TrainNum;i++) //循环搜索起点的火车{TemPath[0].FlainNo=i;//记录在起点该坐得火车DepTime=CityInfo[DepCity].Train[i].DepTime; //记录了开始时间SearchMinTime(CityInfo[DepCity].Train[i].DesCity,DesCity,CityInfo[DepCit y].Train[i].ArriveTime,0,ByTorByP);}}else //若是飞机{for (i=0;i<CityInfo[DepCity].FlightNum;i++){TemPath[0].FlainNo=i;DepTime=CityInfo[DepCity].Flight[i].DepTime;SearchMinTime(CityInfo[DepCity].Flight[i].DesCity,DesCity,CityInfo[DepCi ty].Flight[i].ArriveTime,0,ByTorByP);}}if (MinTime==32767) //若没有找到终点{printf("\n系统中无该路线!");return 0; //结束}printf("\n旅行路线:\n");for (i=0;i<=curPath;i++){if (!ByTorByP) //若是火车printf("%s : 请乘坐%s 次列车起止时间:",CityName[MinPath[i].City],CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].name); //打印城市名和车次else //若是飞机printf("%s : 请乘坐%s 次航班",CityName[MinPath[i].City],CityInfo[MinPath[i].City].Flight[MinPath[i].FlainNo].na me); //打印城市名和飞机航班printf(" %02d:%02d---%02d:%02d\n",CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].DepTime/60,CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].DepTime% 60,CityInfo[MinPath[i].City].Train[MinPath[i].FlainNo].ArriveTime/60,CityInfo[MinPa th[i].City].Train[MinPath[i].FlainNo].ArriveTime%60);}printf("%s: 已到达目的地",CityName[DesCity]);printf("\n旅途耗费时间: %02d:%02d",MinTime/60,MinTime%60);return 1;}////////////////////////////////////////计算最小费用////////////////////////////////////////int CalcMinPrice (int DepCity,int DesCity,int ByTorByP){int ma[34][34]; //矩阵int i,j,min,end;for (i=0;i<NumofCity;i++)for (j=0;j<NumofCity;j++)ma[i][j]=-1; //全部赋值-1if (ByTorByP==0){ //乘坐的是火车for (i=0;i<NumofCity;i++){ //火车搜索每个城市min=32767;j=0;while (j<CityInfo[i].TrainNum){ //火车搜索该城市的每列车能到的目的地min=32767;end=CityInfo[i].Train[j].DesCity;while (end==CityInfo[i].Train[j].DesCity&&j<CityInfo[i].TrainNum) //搜该城市到end城市的所有列车{if (CityInfo[i].Train[j].Price<min) //该列车票钱小于目前最小花费{min=CityInfo[i].Train[j].Price;//赋值给min}j++; //下一列火车}ma[i][end]=min;//从i城市到end城市最便宜的列车的价格}}}else //坐的是飞机{for (i=0;i<NumofCity;i++){min=32767;j=0;while (j<CityInfo[i].FlightNum){min=32767;end=CityInfo[i].Flight[j].DesCity;while (end==CityInfo[i].Flight[j].DesCity&&j<CityInfo[i].FlightNum){if (CityInfo[i].Flight[j].Price<min){min=CityInfo[i].Flight[j].Price;}j++;}ma[i][end]=min;}}} //同火车FindMinPrice(ma,DepCity,DesCity,ByTorByP);return 1;}////////////////////////////////////主界面////////////////////////////////////////int StartUI(){printf(" **************************************************\n");printf(" * *\n");printf(" * 欢迎使用交通咨询系统!*\n");printf(" * *\n");printf(" **************************************************\n");printf(" **********************************请选择**********************************\n");printf(" * *\n");printf(" * 1:添加城市*\n");printf(" * 2:删除城市*\n");printf(" * 3:添加交通路线*\n");printf(" * 4:删除交通路线*\n");printf(" * 5:查询最小费用路线*\n");printf(" * 6:查询时间最短路线*\n");printf(" * *\n");printf(" * *\n");printf(" * 0:退出系统*\n");printf(" * *注: 通过文档修改系统信息,请在系统根目录下相应文件按文件*\n");printf(" * 已有的数据格式修改系统信息,每添加1条信息请将文件头的*\n");printf(" * 数字加1,删除请减1。