⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 完成.cpp

📁 全副交通管理系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>


#define MAXNODE 20   //顶点的最大数
#define MAXCOST 9999 
//========================<数据结构定义>================================ 
typedef struct 
{
	int  ivex;			    //起始点号	
	
	char Number[10];        // 车次号
	int  Money;             //费用
	int  StratTime;         //起始时间(秒)
	int  EndTime;           //终止时间(秒)
	int  Time;              //中途时间(秒)
}EdgeType;  				//Edge类型


typedef struct arc  //链表中的结点
{
	int AdjVertex;  //弧头结点在数组中的序号
	
	EdgeType infor;

	struct arc *NextArc;
}arctype;

typedef struct   //一维数组中的结点
{
	char cityname[10];
    arctype *FirstArc;
}vertextype;

typedef struct 
{
    vertextype Adjlist[MAXNODE];	 //邻接表
	int vexNum, edgeNum;             //图中顶点数和边数
	int Flag[MAXNODE];             //0表示已经不存在,1表示存在
}GraphType;                          //图类型



typedef struct {
	int vx,vy;
	EdgeType p;
}Edge;

typedef struct {
	Edge edges[MAXNODE];         //路径中边的序列 : edges[i]表示从起点到i的最短路径
	int len;                       //路径中边的数目
}PathType;                   //存放最短路径的数据结构

//=====================================================================

//====================<Time 操作>======================================================
     

int TimeChange(int hour,int minute) //输入的时间转换
{
	int change;
	if(minute>60)
	{
		hour=hour+minute/60;
		minute=minute%60;
	}

	if(hour>24)
	{
		hour=hour%24;
	}

	 change= hour*60+minute;
	return change;
}

void PrintTime(int m)       //时间输出(包括起始时间,历经时间)
{
	int hour,minute;
	
	if(m>1440)
	{
		m=m%1440;
	}
	
	hour=m/60;
	minute=m%60;

	printf("%4d时%2d分",hour,minute);
}

int TimeSub(int a, int b)
{
	int c;
	if(a-b<0)
	{
		c=a+1440-b;
	}
	else if(a-b>1440)
	{
		c=(a-b)%1440;
	}
	else
		c=a-b;
	return c;
}
//=======================================================================
//========================<建图,编辑>================================
void CreateGraph(GraphType &G)
{ 
	//初始化空表
	int i;
	G.vexNum=0;
	G.edgeNum=0;
	for(i=0;i<MAXNODE;i++)
		G.Flag[i]=0;
}


bool LocateEdage(GraphType G,int i,int j,char *number)
{
	scanf("%s",number);
    arctype *p;
	p=G.Adjlist[i].FirstArc;

	while(p)
	{
		if(p->AdjVertex==j&&strcmp(p->infor.Number,number)==0)
			break;
		p=p->NextArc;
	}
	if(p)
		return true;
	else
		return false;
}

void InsertVex(GraphType &G,char *str)  //增加城市结点函数
{
  int i;
  for(i=0;i<MAXNODE;i++)
  {
	  if(G.Flag[i]!=1)
         break;
  }
  strcpy(G.Adjlist[i].cityname,str);
  G.Adjlist[i].FirstArc=NULL;
  G.Flag[i]=1;
  G.vexNum++;
}


void DeleteVex (GraphType &G, int ivex)   //删除结点(城市)函数
{

	int i;
	arctype *pt,*p;
	
	//把所有的ivex出度的路径删除
	pt=G.Adjlist[ivex].FirstArc;

	while(pt)
	{	
		p=pt->NextArc;
		free(pt);
		pt=p;
		G.edgeNum--;
	}
	pt=G.Adjlist[ivex].FirstArc=NULL;

	//把点ivex标记为不使用
	G.Flag[ivex]=0;
	G.vexNum--;

	//把所有的ivex入度的路径删除
	for(i=0;i<MAXNODE ;i++)
	{
		if(G.Flag[i]==1)
		{
			p=G.Adjlist[i].FirstArc;
			pt=p;
			while(p)
			{
				if(p->AdjVertex=ivex)
				{
					if(p==G.Adjlist[i].FirstArc)
					{
						G.Adjlist[i].FirstArc=p->NextArc;
						pt=G.Adjlist[i].FirstArc;
					}
					else
						pt->NextArc=p->NextArc;	
					free(p);
					p=pt;
					G.edgeNum--;
				}
			
				pt=p;         //pt要跟着p进行遍历!
				
					p=p->NextArc;
			} //while ends
		}//if ends
	}
	
}

void InsertEdge (GraphType &G  ,arctype q)//增加时刻或航班线路函数
{
  arctype *p=(arctype *)malloc(sizeof(arctype));

  p->AdjVertex=q.infor.ivex;
  strcpy(p->infor.Number,q.infor.Number);
  p->infor.StratTime=q.infor.StratTime;   //信息的复制
  p->infor.EndTime=q.infor.EndTime;
  p->infor.Time=q.infor.Time;
  p->infor.Money=q.infor.Money;

 p->NextArc=G.Adjlist[q.infor.ivex].FirstArc;
 G.Adjlist[q.infor.ivex].FirstArc=p;            //插入结点

 G.edgeNum++;
}

void DeleteEdge(GraphType &G,arctype q )   //删除航班线路函数
{
		arctype *p,*pt;

	p=G.Adjlist[q.infor.ivex].FirstArc;
	pt=p;

	while(p)
	{
		if(p->AdjVertex==q.AdjVertex&&strcmp(p->infor.Number,q.infor.Number)==0)
		{
			break;
		}
		pt=p;
		p=p->NextArc;
	}
	if(p==G.Adjlist[q.infor.ivex].FirstArc)
		G.Adjlist[q.infor.ivex].FirstArc=p->NextArc;
	else
		pt->NextArc=p->NextArc;
         free(p);
	G.edgeNum--;
}


void Edit_City(GraphType &GT,GraphType &GP)  //   城市信息编辑函数
{
   
	  int n,i;
   char name[10];
     


	while(1)
	{
	    printf("\n");
     	printf("\t   1.添加城市");
	    printf("\t   2.删除城市");
	    printf("\t   0.退出");
	    printf("\t    请选择:");
	    scanf("%d",&n);
	
		   
	
		if(n==1)
		{	
		   printf("\n请输入添加城市的名称:");
		    scanf("%s",name);
		
		   InsertVex(GT,name);  //增加结点函数

		   InsertVex(GP,name);

	       printf("\n添加成功!");

	    	break;
		}

	   else if(n==2)
	   {
		
		   printf("\n请输入删除城市的名称:");

            scanf("%s",name);

		   for(i=0;i<MAXNODE;i++)  
		   {
              if(strcmp(GT.Adjlist[i].cityname,name)==0&&GT.Flag[i]==1)
               
			  {
				  DeleteVex(GT,i);   //删除结点函数
			      DeleteVex(GP,i);
			      printf("删除成功!\n");
			  }
		   }
	    	break;
	   }

    	else if(n==0)
		{
		  printf("\n");
		   break;
		}

        else
		     printf("输入有误,请重新输入!");
	}
}



void Edit_Train(GraphType &GT,GraphType GP)  //火车时刻表编辑(添加,删除)
{
	int n,i,j;
	int hour,minute;
	char name[10];
	char number[10];
	arctype q;
	  while(1)
	{
	  printf("\n");
	  printf("\t    1.添加列车");
	  printf("\t    2.删除列车");
	  printf("\t    0.退出");
	  printf("\t   请选择:");
	  scanf("%d",&n);

	  if(n==1)
	  {
		     
			  printf("\n请输入起始城市的名称:");
              scanf("%s",name);

			  for(i=0;i<MAXNODE;i++)  
			  {
				  if(strcmp(GT.Adjlist[i].cityname,name)==0&&GT.Flag[i]==1)
                   break;
				  else if(i==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
              }
		 
              
			  printf("\n请输入终点城市的名称:");
               scanf("%s",name);

              for(j=0;j<MAXNODE;j++)  
			  {
				  if(strcmp(GT.Adjlist[j].cityname,name)==0&&GT.Flag[j]==1)
                   break;
				  else if(j==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
              }

			  printf("\n请输入车次:");
		       scanf("%s",number);
              
			   q.infor.ivex=i;
			   q.AdjVertex=j;

               strcpy(q.infor.Number,number);

			   printf("\n请输入票价:");
		        scanf("%d",&q.infor.Money);

				printf("\n请输入发车时间:");
		              printf("\n几点:");
		          scanf("%d",&hour);
		
		          printf("几分: ");
		         scanf("%d",&minute);
	
		     q.infor.StratTime=TimeChange(hour,minute);
	
		   printf("\n请输入到站时间:");
	     	   printf("\n几点: ");
		    scanf("%d",&hour);
		
		   printf("几分: ");
		   scanf("%d",&minute);
		
		q.infor.EndTime=TimeChange(hour,minute);

		q.infor.Time=TimeSub(q.infor.EndTime,q.infor.StratTime);

		 printf("\n行车时间: %d分钟",q.infor.Time);
		
		InsertEdge(GT,q);  // 增加q这条线路
          printf("\n添加成功!");
		break;
	}

	  if(n==2)
	  {
          
			  printf("\n请输入起始城市的名称:");
              scanf("%s",name);

			  for(i=0;i<MAXNODE;i++)  
			  {
				  if(strcmp(GT.Adjlist[i].cityname,name)==0&&GT.Flag[i]==1)
                   break;
				  else if(i==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
              }
		 
              
			  printf("\n请输入终点城市的名称:");
               scanf("%s",name);

              for(j=0;j<MAXNODE;j++)  
			  {
				  if(strcmp(GT.Adjlist[j].cityname,name)==0&&GT.Flag[j]==1)
                   break;
				  else if(j==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
              }
   
            	printf("\n请输入车次:");
				if(LocateEdage(GT,i,j,number))
				{
					q.infor.ivex=i;
					q.AdjVertex=j;
					strcpy(q.infor.Number, number);
					DeleteEdge(GT,q);  //删除q这条线路
		            printf("删除成功!\n");
		          break;
				}
	}
                  
     
	  else if(n==0)
	  {
		  printf("\n");
		break;
	  }
	
	 
	  else
		printf("输入有误,请重新输入!");
   }//while ends	

}//Edit_Train ends


void Edit_Plane(GraphType GT,GraphType &GP)  //飞机航班表编辑(添加,删除)
{
  int n,i,j;

	int hour,minute;
	char name[10];
	char number[10];
	arctype q;
	 
	while(1)
	{
	  printf("\n");
	  printf("\t  1.添加航班");
	  printf("\t   2.删除航班");
	  printf("\t   0.退出");
	  printf("\t   请选择:");
	  scanf("%d",&n);

	  if(n==1)
	  {
		  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -