/***********************************************************
* 版權所有 (C)2017,高兆港
*
* 文件名稱:main.cpp
* 文件標識:無
* 內容摘要:主函數
* 其它說明:無
* 當前版本: V1.0
* 作 者:高兆港
* 完成日期: 20171222
*
* 修改記錄1:
* 修改日期:20171222
* 版本號: V1.0
* 修改人: 高兆港
* 修改內容:創建
**********************************************************/
#include <iostream>
#include <malloc.h>
#include "daohang.h"
using namespace std;
int main()
{
cout << "******************************歡迎使用煙大導航**************************************" << endl;
cout << "*********************************煙大景點*******************************************" << endl;
INFO B[MAXV]={"鐘樓","三元湖","第七餐廳","綜合樓","八景園","東門看海","西門新世界"};
int v;
int A[MAXV][MAXV]=
{
0,1,7,7,4,10,5,
1,0,LIMITFSS,5,LIMITFSS,LIMITFSS,3,
7,LIMITFSS,0,5,LIMITFSS,10,LIMITFSS,
7,5,5,0,LIMITFSS,LIMITFSS,LIMITFSS,
4,LIMITFSS,LIMITFSS,LIMITFSS,0,15,3,
10,LIMITFSS,10,LIMITFSS,15,0,LIMITFSS,
5,3,LIMITFSS,LIMITFSS,3,LIMITFSS,0
};
MGraph *g;
g=(MGraph*)malloc(sizeof(MGraph));
CreateMGraph (g,A,B);
page(g);
cout<<endl;
return 0;
}
/***********************************************************
* 版權所有 (C)2017,高兆港
*
* 文件名稱:daohang.h
* 文件標識:無
* 內容摘要:函數聲明
* 其它說明:無
* 當前版本: V1.0
* 作 者:高兆港
* 完成日期: 20171222
*
* 修改記錄1:
* 修改日期:20171222
* 版本號: V1.0
* 修改人: 高兆港
* 修改內容:創建
**********************************************************/
#ifndef DAOHANG_H
#define DAOHANG_H
#define MAXV 7
#define LIMITFSS 100
#include <iostream>
using namespace std;
typedef struct
{
int no; //頂點編號
char info[10]; //頂點名稱
}VertexType; //頂點類型
typedef struct //定義一個圖
{
int n,e; //頂點數 邊數
int edges[LIMITFSS][LIMITFSS]; //鄰接矩陣
VertexType vex[LIMITFSS]; //頂點信息
}MGraph;
typedef struct
{
char ifm[100];
}INFO;
void CreateMGraph(MGraph *G,int A[][MAXV],INFO B[]); //創建鄰接矩陣
void page(MGraph *G); //主頁
void DispMGraph(MGraph *G); //顯示鄰接矩陣
void Ppath(int path[],int i,int v,MGraph *L);
void Dispath(int dist[],int path[],int s[],int v,MGraph *P);
void Dijkstra(MGraph *G,int v);
void Add(MGraph *&G); //景點增加
void Del(MGraph *&G); //景點刪除
void Change(MGraph *&G); //景點修改
void user(MGraph *G); //用戶界面
void admin(MGraph *G); //管理界面
#endif // DAOHANG_H
/***********************************************************
* 版權所有 (C)2017,高兆港
*
* 文件名稱:daohang.cpp
* 文件標識:無
* 內容摘要:函數庫
* 其它說明:無
* 當前版本: V1.0
* 作 者:高兆港
* 完成日期: 20171222
*
* 修改記錄1:
* 修改日期:20171222
* 版本號: V1.0
* 修改人: 高兆港
* 修改內容:創建
**********************************************************/
#include "daohang.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAXV 7
#define LIMITFSS 100
using namespace std;
/*********************************************************
* 功能描述:創建鄰接矩陣
* 輸入參數:MGraph *G,int A[][MAXV],INFO B[]
* 輸出參數:G->edges[i][j]
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void CreateMGraph(MGraph *G,int A[][MAXV],INFO B[]) //創建鄰接矩陣
{
int i,j;
G->n=7;
G->e=24;
for (i=0;i<G->n;i++) //初始化景點信息
{
G->vex[i].no=i+1;
for (j=0; B[i].ifm[j]!='\0'; j++)
G->vex[i].info[j]=B[i].ifm[j];
}
for (i=0;i<G->n;i++) //初始化鄰接矩陣
for (j=0;j<G->n;j++)
{
if (i==j)
G->edges[i][j]=0;
else
G->edges[i][j]=LIMITFSS;
}
for (i=0;i<G->n;i++) //賦值
for (j=0;j<G->n;j++)
{
G->edges[i][j]=A[i][j];
}
}
/*********************************************************
* 功能描述:主頁
* 輸入參數:MGraph *G
* 輸出參數:G->vex[i].no G->vex[i].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void page(MGraph *G) //主頁
{
cout << "******************************歡迎使用煙大導航**************************************" << endl;
cout << "*********************************煙大景點*******************************************" << endl;
int i;
int a;
for(i=0;i<G->n;i++)
{cout<<G->vex[i].no<<"."<<G->vex[i].info<<" ";} //輸出景點編號及信息
cout<<endl;
cout<<"請選擇:"<<" "<<"1.管理員"<<" "<<"2.用戶"<<" "<<"3.退出"<<endl;
cin>>a;
switch(a)
{
case 1:
admin(G);break;
case 2:
user(G);break;
case 3:
cout<<"謝謝使用!"<<endl;
break;
}
}
/*********************************************************
* 功能描述:顯示鄰接矩陣
* 輸入參數:MGraph *G
* 輸出參數:G->n G->e G->vex[i].no G->vex[i].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void DispMGraph(MGraph *G) //顯示鄰接矩陣
{
int i,j;
cout<<"頂點數:"<<G->n<<endl;
cout<<"邊數:"<<G->e<<endl;
for(i=0;i<G->n;i++) //顯示景點信息
{
cout<<G->vex[i].no<<G->vex[i].info<<endl;
}
cout<<"各點連接情況:"<<endl;
cout<<" ";
//顯示鄰接矩陣
for(j=0;j<G->n;j++)
{
cout<<j<<" ";
}
cout<<endl;
for(i=0;i<G->n;i++)
{
cout<<i<<" ";
for(j=0;j<G->n;j++)
{
if(G->edges[i][j]==LIMITFSS)
cout<<"∞ ";
else
{ cout<<G->edges[i][j]<<" ";
}
}cout<<endl;
}
cout<<"1.返回主頁"<<" 2.退出"<<endl;
int p;
cin>>p;
if(p==1)
page(G);
else if(p==2)
cout<<"謝謝使用!"<<endl;
}
/*********************************************************
* 功能描述:多步時遞歸輸出路徑
* 輸入參數:int path[],int i,int v,MGraph *G
* 輸出參數:G->vex[k].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Ppath(int path[],int i,int v,MGraph *G) //多步時遞歸輸出路徑
{
int k;
k=path[i];
if(k==v)
return;
Ppath(path,k,v,G);
cout<<"→"<<G->vex[k].info;
}
/*********************************************************
* 功能描述:顯示最短路徑
* 輸入參數:int dist[],int path[],int s[],int v,MGraph *G
* 輸出參數:G->vex[i].info,(G->edges[v][i])*100
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Dispath(int dist[],int path[],int s[],int v,MGraph *G) //顯示最短路徑
{
int i;
cout<<"請輸入終點:";
cin>>i;
i=i-1;
if(s[i]==1)
{
cout<<"從"<<G->vex[v].info<<"到"<<G->vex[i].info<<"的最短路徑爲:";
cout<<G->vex[v].info;
Ppath(path,i,v,G);
cout<<"→"<<G->vex[i].info<<endl;
cout<<"距離您約"<<(G->edges[v][i])*100<<"米"<<endl;
}
}
/*********************************************************
* 功能描述:一個頂點到各個頂點的最短路徑
* 輸入參數:MGraph *G,int v
* 輸出參數:dist[j]
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Dijkstra(MGraph *G,int v) //一個頂點到各個頂點的最短路徑
{
//定義輔助存儲及賦初值
int mindis,i,j,u;
int s[MAXV];//是否加入了s
int dist[MAXV];//距離
int path[MAXV];//經過點
for (i=0;i<G->n;i++)
{
s[i]=0;
dist[i]=G->edges[v][i];
if (G->edges[v][i]<LIMITFSS)
path[i]=v;
else
path[i]=-1;
}
s[v]=1;
path[v]=0;
//選取不在s中且具有最小距離的頂點u
for (i=0;i<G->n;i++)
{
mindis=LIMITFSS;
for (j=0;j<G->n;j++)
{
if(s[j]==0 && s[j]<LIMITFSS)
{
u=j;
mindis=dist[j];
}
}
s[u]=1;
//修改不在s中的頂點的距離
for(j=0;j<G->n;j++)
{
if(s[j]==0)
{
if(G->edges[u][j]<LIMITFSS && dist[u]+G->edges[u][j]<dist[j])
{
dist[j]=dist[u]+G->edges[u][j];
path[j];
}
}
}
}
Dispath(dist,path,s,v,G);
}
/*********************************************************
* 功能描述:景點增加
* 輸入參數:MGraph *&G
* 輸出參數:G->vex[n-1].no,G->vex[n-1].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Add(MGraph *&G) //景點增加
{
int n;
char info[200];
int distance;;
int i;
cout<<"請輸入景點編號:";
cin>>n;
G->vex[n-1].no=n;
G->n=n;
cout<<"請輸入地點名稱:";
cin>>info;
for(i=0; info[i]!='\0'; i++)
{
G->vex[n-1].info[i]=info[i];
}
cout<<"請輸入"<<G->vex[n-1].info<<"到各個景點的距離:";
for(i=0; i<G->n; i++)
{
cout<<G->vex[n-1].info<<"到"<<G->vex[i].info<<"的距離爲:";
cin>>distance;
G->edges[n-1][i]=distance;
G->edges[i][n-1]=distance;
}
cout<<"1.返回主頁"<<" 2.退出"<<endl;
int p;
cin>>p;
if(p==1)
page(G);
else if(p==2)
cout<<"謝謝使用!"<<endl;
}
/*********************************************************
* 功能描述:景點刪除
* 輸入參數:MGraph *&G
* 輸出參數:G->vex[n-1].no,G->vex[n-1].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Del(MGraph *&G) //景點刪除
{
int n,i;
cout<<"請輸入您要刪除的地點編號:";
cin>>n;
if(n>=G->n)
{
cout<<"你輸入的編號地點不存在,請重新輸入:";
Del(G);
}
else
{
int j=n;
int p=n;
while(n<G->n)
{
G->vex[n-1].no=G->vex[n].no;
G->vex[n-1].no--;
strcpy(G->vex[n-1].info,G->vex[n].info);
n++;
}
for(j; j<G->n; j++)
for(i=0; i<G->n; i++)
{
if(i>=p)
{
G->edges[j][i]=G->edges[j+1][i+1];
G->edges[i][j]=G->edges[i+1][j+1];
}
else
{
G->edges[j][i]=G->edges[j+1][i];
G->edges[i][j]=G->edges[i][j+1];
}
}
G->n--;
printf("刪除成功\n");
}
cout<<"1.返回主頁"<<" 2.退出"<<endl;
int p;
cin>>p;
if(p==1)
page(G);
else if(p==2)
cout<<"謝謝使用!"<<endl;
}
/*********************************************************
* 功能描述:景點修改
* 輸入參數:MGraph *&G
* 輸出參數:G->vex[n-1].no,G->vex[n-1].info
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void Change(MGraph *&G) //景點修改
{
int n;
int i;
int distance;
char info[100];
cout<<"請輸入景點編號:"<<endl;
cin>>n;
G->vex[n-1].no=n;
cout<<"請輸入景點信息:";
cin>>info;
strcpy(G->vex[n-1].info,info);
cout<<"請輸入"<<G->vex[n-1].info<<"到各個點的距離:"<<endl;
for(i=0; i<G->n; i++)
{
cout<<G->vex[n-1].info<<"到"<<G->vex[i].info<<"的距離爲:";
cin>>distance;
G->edges[n-1][i]=distance;
G->edges[i][n-1]=distance;
}
cout<<"1.返回主頁"<<" 2.退出"<<endl;
int p;
cin>>p;
if(p==1)
page(G);
else if(p==2)
cout<<"謝謝使用!"<<endl;
}
/*********************************************************
* 功能描述:用戶界面
* 輸入參數:MGraph *G
* 輸出參數:無
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void user(MGraph *G) //用戶界面
{
cout<<"1.查詢"<<" "<<"2.返回主頁"<<endl;
int a;
cin>>a;
switch (a)
{
case 1:
int v;
cout<<"請輸入起點:";
cin>>v;
Dijkstra(G,v);
break;
case 2:
page(G);
}
}
/*********************************************************
* 功能描述:管理員界面
* 輸入參數:Graph *G
* 輸出參數:無
piFileType-文件類型
* 返回值:無
* 其它說明:無
************************************************************/
void admin(MGraph *G) //管理員界面
{
cout<<"1.查詢後臺"<<" 2.增加景點"<<" 3.刪除景點"<<" 4.修改景點"<<" 5.返回主頁"<<endl;
int a;
cin>>a;
switch (a)
{
case 1:DispMGraph (G);break;
case 2:Add(G);break;
case 3:Del(G);break;
case 4:Change(G);break;
case 5:page(G);break;
}
}