【數據結構課設】校園導遊系統

/***********************************************************
* 版權所有 (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;
    }
}















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章