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

📄 交通咨询.txt

📁 交通管理系统
💻 TXT
📖 第 1 页 / 共 4 页
字号:


#include"stdio.h"
#include"stdlib.h"
#include"string.h"

#define MAX_VERTEX_NUM 18
#define MAX_ARC_SIZE 100
#define MAX_ROUTE_NUM 5

#define NULL 0
#define False 0
#define True 1
#define INFINITY 10000

typedef struct
{ int number;
  float expenditure;
  int begintime[2];
  int arrivetime[2];
}Vehide;

typedef struct
{ Vehide stata[MAX_ROUTE_NUM];
  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[MAX_VERTEX_NUM];

typedef struct
{ AdjList vertices;
  int vexnum,planearcnum,trainarcnum;
}ALGraph;

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[MAX_ROUTE_NUM];
}TimeNode,*TimeTree;

struct arc
{ int co;
  char vt[10];
  char vh[10];
  int bt[2];
  int at[2];
  float mo;
}a[MAX_ARC_SIZE];
 
 char city[MAX_VERTEX_NUM][10];
 int TTime[2];
 int time0[2];
 int time1[2];
 int time2[2];
 int c[MAX_VERTEX_NUM];
 int d[MAX_VERTEX_NUM];

void Administer(ALGraph *G);
void cityedit(ALGraph *G);
void CopyTimeTree(TimeTree p,TimeTree q);
void createcityfile();
void CreateGraph(ALGraph *G);
void createplanefile();
void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);
void createtrainfile();
int DeleteplaneArc(ALGraph *G);
void DeleteQueue(LinkQueue *Q,int *x);
int DeletetrainArc(ALGraph *G);
void DeleteVertex(ALGraph *G);
void DemandDispose(int n,ALGraph G);
void DestoryTimeTree(TimeTree p);
void EnterplaneArc(ALGraph *G);
void EnterQueue(LinkQueue *Q,int x);
void EntertrainArc(ALGraph *G);
void EnterVertex(ALGraph *G);
void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);
void flightedit(ALGraph *G);
void initgraph(ALGraph *G);
void InitQueue(LinkQueue *Q);
int IsEmpty(LinkQueue *Q);
int LocateVertex(ALGraph *G,char *v);
void MinExpenditure(infolist arcs,float *expenditure,int *route);
void MinTime(infolist arcs,int *time,int *route);
void PrintGraph(ALGraph *G);
int save(ALGraph *G);
void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (*T)[2],int *final);
void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]);
void trainedit(ALGraph *G);
void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);
void UserDemand(ALGraph G);
void VisitTimeTree(TimeTree p);
 
 

int main()
/*
  显示程序功能选择界面
*/
{ALGraph G;
 int i;
 printf("请选择程序功能:\n");
 printf("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");
 printf("选择?");
 scanf("%d",&i);
 getchar();
 while(i!=4)
 {switch(i)
  
  {
   case 1:Administer(&G);break;
   case 2:UserDemand(G);break;
   case 3:PrintGraph(&G);break;
  }
  
  printf("\n请选择程序功能:\n");
  printf("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");
  printf("选择?");
  scanf("%d",&i);
  getchar();
 }

 return 1;
}
 
void Administer(ALGraph *G)
/*
  显示管理员管理项目选择界面
*/
{ int i;
  printf("\n请选择管理项目:\n");
  printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");
  printf("选择?");
  scanf("%d",&i);
  getchar();
  while(i!=5)
 
{ 
   switch(i)
    {
     case 1:initgraph(G);    //初始化交通系统
          break;
     case 2:cityedit(G);     //城市编辑
          break;
     case 3:flightedit(G);   //飞机航班编辑
          break; 
     case 4:trainedit(G);    //列车车次编辑
          break; 
    }
  printf("\n请选择管理项目:\n");
  printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");
  printf("选择?");
  scanf("%d",&i);
  getchar();
 }
}

void initgraph(ALGraph *G)     //初始化交通系统
/*
  初始化交通系统方式选择界面
*/
{int i;
 printf("\n请选择初始化方式:\n");
 printf("1=键盘\n2=文档\n");
 printf("选择?");
 scanf("%d",&i);
 getchar();
 switch(i)
 {
  case 1:createcityfile();
         createplanefile();
         createtrainfile();
         CreateGraph(G);
         break;
  case 2:CreateGraph(G);
         break;
 }
}

void createcityfile()
/*
  创建城市名称文档
*/
{int i=0;
 int j;
 char flag='y';
 FILE *fp;
 printf("\n请输入城市名称的信息:\n");
 while(flag=='y'||flag=='Y')
  {
    printf("城市名称:");
    gets(city[i]);
    i++;
    printf("继续输入?(Y/N)");
    scanf("%c",&flag);
    getchar();
  }
 printf("\n");
 if((fp=fopen("city.txt","wb"))==NULL)
 {
  printf("无法打开文件!\n");
  return;
 }
 for(j=0;j<i;j++)
  fprintf(fp,"%10s",city[j]);
 fclose(fp);
}

void createplanefile()
/*
  创建飞机航班文档
*/
{int code,bt[2],at[2];  //code航班编号,bt出发时间,at到达时间
 float money;
 int i;
 int count;
 char vt[10],vh[10],flag; //vt起始城市,vh目标城市
 FILE *fp;
 flag='y';
 count=0;
 while(flag=='Y'||flag=='y')     /*flag为标志位,初值为1*/
 {
  printf("请输入飞机航班的信息:\n"); //提示"输入航班信息"
  printf("飞机航班编号:");  //输入航班code
  scanf("%d",&code);
  getchar();
  printf("起始城市:");   //输入航班的出发城市vt
  gets(vt);
  printf("目的城市:");  //输入航班的到达城市vh
  gets(vh);
  printf("航班费用:");  //输入机票价格money
  scanf("%f",&money);
  getchar();
  printf("起飞时间:");  //输入航班的出发时间bt
  scanf("%d:%d",&bt[0],&bt[1]);
  getchar();
  while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60)
  {
   printf("\n时间输入有误,请重新输入\n");
   scanf("%d:%d",&bt[0],&bt[1]);
   getchar();
  }
  printf("到达时间:");  //输入航班的到达时间at
  scanf("%d:%d",&at[0],&at[1]);
  getchar();
  while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60)
  {
   printf("\n时间输入有误,请重新输入\n");
   scanf("%d:%d",&at[0],&at[1]);
   getchar();
  }
  a[count].co=code; // a 为程序头部定义的结构体
  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++;  //计数值count+1
  printf("继续输入?(Y/N)");  //提示"是否要继续输入航班信息:"
  scanf("%c",&flag);
  getchar();
  printf("\n");
 }
 if((fp=fopen("plane.txt","wb"))==NULL) //航班文件不能以读写形式打开
  printf("\n无法打开文件!\n");  //提示"无法打开文件"
  fprintf(fp,"%d",count);    //将计数值count写入航班车文件
 for(i=0;i<count;i++)
  if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) //无法将a[i]写入航班文件
   printf("\n文件写入错误!\n");  //提示"文件无法写入"
 fclose(fp);    //关闭航班文件
}

void createtrainfile()
/*
  创建列车车次文档
*/
{int code,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')
 {printf("请输入列车车次的信息:\n");
  printf("列车车次编号:");
  scanf("%d",&code);
  getchar();
  printf("起始城市:");
  gets(vt);
  printf("目的城市:");
  gets(vh);
  printf("车次费用:");
  scanf("%f",&money);
  getchar();
  printf("发车时间:");
  scanf("%d:%d",&bt[0],&bt[1]);
  getchar();
  while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60)
  {
   printf("\n时间输入有误,请重新输入\n");
   scanf("%d:%d",&bt[0],&bt[1]);
   getchar();
  }
  printf("到达时间:");
  scanf("%d:%d",&at[0],&at[1]);
  getchar();
  while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60)
  {
   printf("\n时间输入有误,请重新输入\n");
   scanf("%d:%d",&at[0],&at[1]);
   getchar();
  }
  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++;
  printf("继续输入?(Y/N)");
  scanf("%c",&flag);
  getchar();
  printf("\n");
 }
 if((fp=fopen("train.txt","wb"))==NULL)
  printf("\n无法打开文件!\n");
 fprintf(fp,"%d",count);
 for(i=0;i<count;i++)
  if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)
   printf("\n文件写入错误!\n");
 fclose(fp);
}
 
 
int LocateVertex(ALGraph *G,char *v) 
/*
  城市名在交通系统中定位操作,找出城市名在图中对应结点位置
*/
{int j,k;
 j=-1;
 for(k=0;k<G->vexnum;k++)
  if(strcmp(G->vertices[k].cityname,v)==0)  //第k个结点中的城市名与传过来的城市名相同
  {j=k;    /*记录位置*/
   break;
  }
 return(j);
}

void CreateGraph(ALGraph *G)
/*
  用city,plan,train三个文档创建城市交通系统
*/
 {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)  //打开城市文件,文件指针返回值为空
 {
  printf("\n无法打开文件!\n");
  return;
 }
 while(!feof(fp))  //文件不为空
 {
  fscanf(fp,"%10s",city[i]);
  i++;
 }
 fclose(fp);  //关闭文件
 j=0;
 while(j<i)
 {
  strcpy(G->vertices[j].cityname,city[j]);//将 city[i] 中的内容复制到图的结构体的结点数组中;
  G->vertices[j].planefirstarc=NULL; // 图的结构体其他项赋初值;
  G->vertices[j].trainfirstarc=NULL;
  j++;
 }
 G->vexnum=i;
 if((fp=fopen("plane.txt","rb"))==NULL)
  printf("\n无法打开文件!\n");
 k=0;
 fscanf(fp,"%d",&count1);   //打开航班信息文件"plane.txt"
 
 while(k<count1)
 {
   if(fread(&a[k],sizeof(struct arc),1,fp)!=1)
   printf("\n文件读入错误!\n");
   k++;
 }
 fclose(fp);  //关闭文件
 k=0;         //a的计数变量k=0
 arc_num=0;  //弧的计数变量 arc_num=0
 
 while(k<count1)
 {
  i=LocateVertex(G,a[k].vt); //调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i
  j=LocateVertex(G,a[k].vh); //调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j
  q=G->vertices[i].planefirstarc;
  m=0;
  while(q!=NULL)
  {
    if(q->adjvex==j)  //弧 q中的邻接顶点与j相等
   {
    t=q->info.last+1;  // 将数组a[i] 中的内容都复制到弧q中
    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->info.last=t;
    m=1;
    break;
   }
   q=q->nextarc;
  }
  if(m==0)
  {p=(ArcNode*)malloc(sizeof(ArcNode));  //开辟一个弧结点
   p->adjvex=j;   //将数组a[i]中的内容都复制到新的弧结点中
   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->info.last=0;
   p->nextarc=G->vertices[i].planefirstarc;
   G->vertices[i].planefirstarc=p;  // 将弧结点连接到适当的位置中去
   arc_num++;
  }
  k++;
 }
 G->planearcnum=arc_num;
 if((fp=fopen("train.txt","rb"))==NULL)
 {printf("\n无法打开文件!\n");
  return;
 }
 k=0;
 fscanf(fp,"%d",&count2);  //打开列车信息文件"plane.txt"
 while(k<count2)
 {if(fread(&a[k],sizeof(struct arc),1,fp)!=1)
   printf("\n文件读入错误!\n");
  k++;
 }
 fclose(fp);  //关闭文件
 k=0;       //a的计数变量k=0;
 arc_num=0;  // 弧的计数变量 arc_num=0;
 while(k<count2)
 {
  i=LocateVertex(G,a[k].vt);  // 调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i
  j=LocateVertex(G,a[k].vh);  // 调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j
  q=G->vertices[i].trainfirstarc;
  m=0;
  while(q!=NULL)
  {
    if(q->adjvex==j)  //弧 q中的邻接顶点与j相等
   {
    t=q->info.last+1;  //将数组a[i] 中的内容都复制到弧q中
    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->info.last=t;
    m=1;
    break;
   }
   q=q->nextarc;
  }
  if(m==0)
  {
   p=(ArcNode*)malloc(sizeof(ArcNode));  //开辟一个弧结点
   p->adjvex=j;  //将数组a[i]中的内容都复制到新的弧结点中
   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->info.last=0;
   p->nextarc=G->vertices[i].trainfirstarc;
   G->vertices[i].trainfirstarc=p;  //将弧结点连接到适当的位置中去
   arc_num++;
  }
  k++;
 }

⌨️ 快捷键说明

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