数据结构课程设计_《旅游景区信息管理系统》

sxy.h

#include 
#include 
#include 
#include 
#define M 100
#define INF 999666333
using namespace std;
 struct Matrix
{
    string Sname;//景区名称,为了解决哈希冲突
    int count;//景点总数量
    int edge;//道路数量
    int m[M][M];//景点邻接矩阵
    string Pname[M];//各个景点的名称
};
struct Scenic
{
   Scenic(): next(NULL){}
    Matrix mat;
   struct Scenic *next;
};
int hash(string name);
void Welcome();//欢迎界面
void create_graph();//创建景区景点图
void print_graph();//输出景点分布(邻接矩阵的形式输出)
void DFS(int c,struct Scenic *p);//深度优先搜索导游线路
void guide_line();//导游线路
void dfs(int i,struct Scenic *p);//递归实现
void check_circuit();//判断回路
void Floyd(int a,int b,struct Scenic *&p);//Floyd算发求最短路
void min_distance();//最短路径、距离
void prime(struct Scenic *&p,string name);//最小生成树(prime算法)
void build_road();//道路修建规划图、
void scenic_message();//浏览所有景区景点信息
void change_sceic_name(struct Scenic *&p);//修改景点名称;
void change_weight(struct Scenic *&p);//修改该景区某条道路上的权值
void increase_number(struct Scenic *&p);//增加该景区小路的数量
void change_information();//修改景区景点信息
void MainFace();//主界面
void returnMainFace();//返回主界面
sxy.cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include//getch
#include//清屏函数头文件
#define l 1<<10
#define mod (1<<10)-1
#include "sxy.h"
using namespace std;
Scenic S[10000];
//用哈希表的形式进行建立查找景区名称地址
int hash(string name)
{
    int key=0,t=name.size();
    for(int i=0;i>name;
    getchar();
    key=hash(name);
    Scenic *p=new Scenic,*q=new Scenic;
    q=S[key].next;
    while(q)//不为空时说明该位置存在景区(ASCII可以相同)
    {
        if(q->mat.Sname==name)//名称不能相同,才可以输入景区
          {
             cout<<"该景点名称已存在,重新输入景点名称: ";
             cin>>name;
             getchar();
             key=hash(name);
             q=S[key].next;
             break;
          }
          else
            q=q->next;
    }
    delete q;
    p->mat.Sname=name;
    //包含文件操作
    outFile<<"*****************************************************************"<>p->mat.count;
    outFile<<"该景区的景点总数目为:"<mat.count<>p->mat.edge;
    outFile<<"该景区的道路数目为:"<mat.edge<mat.m,0,sizeof(p->mat.m));
    for(i=1;i<=p->mat.edge;i++)
    {
            cout<<"\n*第 "<>n1;
            outFile<<"************************第"<>p->mat.Pname[n1];
            outFile<<"景点编号为"<mat.Pname[n1]<>n2;
            cout<<"\t-景点 2 名称:";cin>>p->mat.Pname[n2];
            outFile<<"景点编号为"<mat.Pname[n2]<>p->mat.m[n1][n2];
            outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<mat.m[n2][n1]=p->mat.m[n1][n2];

    }
    p->next=S[key].next;
    S[key].next=p;
    cout<<"\n*景区创建成功!";
    outFile.close();  //关闭文件
     returnMainFace();
}
//输出景点分布(邻接矩阵的形式输出)
void print_graph()
{
    string name;
    int key,tag=1;
    Scenic *p;
    cout<<"*景区名称:"<>name;
    getchar();
    key=hash(name);
    p=S[key].next;
    if(p==NULL)
     cout<<"\n*景区景点分布图为"<mat.Sname==name)//找到的地址不为空,只有名字相同时才,进行输出有关信息
          {
            cout<<"*************查询景区名称为 "<mat.count;++i)
            {
                cout<<"景点名称 "<mat.Pname[i];
                for(int j=1;j<=p->mat.count;++j)
                    cout<<' '<mat.m[i][j];
                    cout<next;
        }
        if(tag)
        cout<<"\n*景区景点分布图为"<mat.count)
    {
        cout<mat.Pname[c]<mat.Pname[c]<<" --> ";
    visited[c]=1;
     for(int i=1;i<=(p->mat.count);i++)
    {
        if(p->mat.m[c][i]>0&&!visited[i])
        {
              DFS(i,p);
        if(p->mat.count>np)
        {
            cout<mat.Pname[c]<<"-->";
        }
        }
    }
     if(np==p->mat.count)
        returnMainFace();
}
//导游线路
void guide_line()
{
     //checked();
     Scenic *p;
     int key,c,tag=1;
     cout<<"\n*请输入对应景区的名称:";
     string name;
     cin>>name;
     getchar();
     key=hash(name);
    p=S[key].next;
    if(p==NULL)
      cout<<"\n*景区景点分布图(邻接矩阵表示)查询不存在!\n";
    else
    {
        while(p)
        {
            if(p->mat.Sname==name)
            {
                memset(visited,0,sizeof(visited));
                np=0;
                cout<<"输入对应景点的编号"<>c;
                cout<<"*形成的导游线路图(采用深度优先策略)如下所示:\n\n\t";
                DFS(c,p);
                tag=0;
                break;
            }
            else
                p=p->next;
        }
        if(tag)
        cout<<"\n*景区景点分布图为"<mat.count;j++)
    {
        if(p->mat.m[i][j]!=0&&vis[j]==0)
            dfs(j,p);
    }
}
//判断回路
void check_circuit()
{
    int key,tag=1;
    Scenic *p;
    string name;
    cout<<"*景区名称:"<>name;
    getchar();
    key=hash(name);
    p=S[key].next;
    if(p==NULL)
     cout<<"\n*景区景点分布图查询不成功!\n";
    else
    {
        while(p)
        {
            if(p->mat.Sname==name)
            {
                memset(vis,0,sizeof(vis));//初始化vis数组,表示一开始所有顶点都未被访问过
                DFS_Count=0;
                for(int i=1;i<=p->mat.count;i++)//深度优先搜索
                {
                    if(vis[i]==0)//如果这个顶点为被访问过,则从i顶点出发进行深度优先遍历
                    {
                        DFS_Count++;//统计调用void dfs(int i);的次数
                        dfs(i,p);
                    }
                }
                if(p->mat.edge+DFS_Count>p->mat.count)//遍历结束,若联通的数量个数加上边的数量个数>节点的数量个数,就判定为有环
                    cout<<"该景区中存在环"<next;
        }
        if(tag)
          cout<<"\n*景区景点分布图查询不成功!\n";
    }
    returnMainFace();
}
//Floyd算发求最短路
void Floyd(int a,int b,struct Scenic *&p)
{
    int i,j,k;
    int A[M][M],path[M][M];
    for(i=1;i<=p->mat.count;i++)//对进行求最短路的矩阵进行处理
    {
        for(j=1;j<=p->mat.count;j++)
        {
        if(p->mat.m[i][j]==0&&i!=j)
             A[i][j]=INF;
        else if(i==j)
            A[i][j]=0;
        else
            A[i][j]=p->mat.m[i][j];
        if(i!=j&&p->mat.m[i][j]mat.count;k++)
    {
          for(i=1;i<=p->mat.count;i++)
            {
              for(j=1;j<=p->mat.count;j++)
              {
                  if(A[i][j]>A[i][k]+A[k][j])
                  {
                       A[i][j]=A[i][k]+A[k][j];
                       path[i][j]=path[k][j];
                  }
              }
            }
    }
    int apath[M],d;
    if(A[a][b]mat.Pname[a]<<" 到 "<mat.Pname[b]<<" 的最短路径为:";
        k=path[a][b];
        d=0;
        apath[d]=b;
       while(k!=-1&&k!=a)//循环实现记录对应的节点编号
       {
           d++;
           apath[d]=k;
           k=path[a][k];
       }
         d++;
         apath[d]=a;
         cout<mat.Pname[apath[d]];
         cout<=0;s--)//输出节点名称
         {
            cout<<" --> "<mat.Pname[apath[s]];
             cout<<','<>name;
    getchar();
    key=hash(name);
    p=S[key].next;
    if(p==NULL)
     cout<<"\n*景区分布图查询不成功!\n";
    else
    {
        while(p)
        {
            if(p->mat.Sname==name)
            {
                cout<<"*******下面为该景区的一些信息:"<mat.Sname<mat.count;++i)
                {
                    cout<<"编号为 "<mat.Pname[i];
                    for(int j=1;j<=p->mat.count;++j)
                        cout<<' '<mat.m[i][j];
                        cout<>a;
                getchar();
                cout<<"\t-景点 2:";
                cin>>b;
                getchar();
                Floyd(a,b,p);
                tag=0;
                break;
            }
            else
                p=p->next;
        }
        if(tag)
        cout<<"\n*景区景点分布图查询不成功!\n";
    }
        returnMainFace();
}
void prime(struct Scenic *&p,string name)
{
    int A[M][M],a,b,tag=1;
    while(p)
        {
            if(p->mat.Sname==name)
            {
                for(int i=1;i<=p->mat.count;i++)
                {
                    for(int j=1;j<=p->mat.count;j++)
                    {
                        if(p->mat.m[i][j]==0&&i!=j)
                        A[i][j]=INF;
                        else if(i==j)
                        A[i][j]=0;
                        else
                        A[i][j]=p->mat.m[i][j];
                    }
                }
                cout<<"请输入您开始要建造的景点编号";
                cin>>a;
                cout<<"请输入您要完成到的达景点编号";
                cin>>b;
                cout<<"\n*道路修建规划图(prime算法)规划如下:\n";
                int lowcost[M],closest[M],k=0,sum=0,num=0;
                for(int i=1;i<=p->mat.count;++i)
                {
                    lowcost[i]=A[a][i];
                    closest[i]=a;
                }
                for(int i=1;imat.count;++i)
                {
                    int min=INF;
                    for(int j=1;j<=p->mat.count;++j)
                    {
                        if(lowcost[j]&&(lowcost[j]mat.Pname[closest[k]]<<"  到景点  "<mat.Pname[k]<<"  ,该条道路长度为:"<mat.count;++j)
                    {
                        if(A[k][j]&&A[k][j]next;
        }
        if(tag)
            cout<<"\n*景区景点分布图查询不成功!\n";
}
void build_road()//道路修建规划图、最小生成树(prime算法)
{
    Scenic *p;
     int key;
     cout<<"\n*请输入对应景区的名称:";

     string name;
     cin>>name;
     getchar();
    key=hash(name);
    p=S[key].next;
    if(p==NULL)
      cout<<"\n*景区景点分布图(邻接矩阵表示)查询不存在!\n";
    else
    {
        prime(p,name);
        returnMainFace();
    }
}
void scenic_message()//文件输出所有信息
{
    system("cls");
    char ch[200];
   ifstream inFile; //输入流对象
   inFile.open("景区景点信息表.txt",ios::in);
   while(!inFile.eof())
   {
       inFile.getline(ch,sizeof(ch),'\n');
       cout< v;
    cout<<"请输入原先的景点名称: ";
    cin>>name;
    cout<<"请输入要修改后的名称: ";
    cin>>rname;
    for(i=1;i<=p->mat.count;++i)
    {
        if(p->mat.Pname[i]==name)
           {
              p->mat.Pname[i]=rname;
              break;
           }
    }
    while(inFile)
    {
        getline(inFile, str);
        v.push_back(str);
    }
    stringstream stream;
    string result,s,a,r;// std::string result;
    stream << i; //将int输入流
    stream >> r; //从stream中抽取前面插入的int值
    s="景点编号为"+r;
    s+="名称为";
    a=s;
    s+=name;
    a+=rname;
    ofstream outFile("景区景点信息表.txt",ios::out);
    vector::const_iterator it=v.begin();
    for(;v.end()!=it;++it)
    {
       if(*it==s)
        {
            //v.erase(v.begin()+j);
            outFile< v;
    cout<<"请输入的该道路上景点1的名称: ";
    cin>>name1;
    cout<<"请输入的该道路上景点2的名称: ";
    cin>>name2;
    cout<<"请输入的该道路上原先的权值: ";
    cin>>weight;
    cout<<"请输入该道路上要修改后的的权值: ";
    cin>>weight1;
    for( i=1;i<=p->mat.count;++i)//修改到程序里面
    {
        if(p->mat.Pname[i]==name1)
            x=i;
        if(p->mat.Pname[i]==name2)
            y=i;
    }
    p->mat.m[x][y]=p->mat.m[y][x]=weight1;
    while(inFile)//下面修改到文件里面
    {
        getline(inFile, str);
        v.push_back(str);
    }
    //outFile<mat.Pname[n1]<<"和"<mat.Pname[n2]<<"之间的直接道路长度是"<mat.m[n1][n2]<> w; //从stream中抽取前面插入的int值
    stream1 << weight1; //将int输入流
    stream1 >> w1; //从stream中抽取前面插入的int值
    s=name1;ss=name2;
    s+="和";ss+="和";
    s+=name2;ss+=name1;
    s+="之间的直接道路长度是";ss+="之间的直接道路长度是";
    a=s;b=ss;
    s+=w;ss+=w;
    a+=w1;b+=w1;
    ofstream outFile("景区景点信息表.txt",ios::out);
    vector::const_iterator it=v.begin();
    for(;v.end()!=it;++it)
    {
       if(*it==s)
            outFile< v;
    cout<<"请输入小路两旁的1景区";
    cin>>name1;
    cout<<"请输入小路两旁的2景区";
    cin>>name2;
    cout<<"请输入该小路的权值";
    cin>>weight;
    for(i=1;i<=p->mat.count;++i)
    {
        if(p->mat.Pname[i]==name1)
            x=i;
        if(p->mat.Pname[i]==name2)
            y=i;
    }
    p->mat.m[x][y]=p->mat.m[y][x]=weight;
    while(inFile)//下面修改到文件里面
    {
        getline(inFile, str);
        v.push_back(str);
    }
    ofstream outFile("景区景点信息表.txt",ios::out);
     stringstream stream,stream1,stream2;
    string s,s1,ss,num,num1,w,m;
    vector::const_iterator it=v.begin();
    stream<mat.edge;
    stream>>num;
    p->mat.edge+=1;
    stream1<mat.edge;
    stream1>>num1;
    s="该景区的道路数目为:";s1="该景区的道路数目为:";
    s+=num;s1+=num1;
    for(;v.end()!=it;++it)
    {
       if(*it==s)
            outFile<>num;
    stream1<>num1;
    s="景点编号为"+num+"名称为"+name1;
    outFile<>w;
    s=name1+"和"+name2+"之间的直接道路长度是"+w;
    outFile<>name;
    getchar();
    key=hash(name);
    p=S[key].next;
    if(p==NULL)
     cout<<"\n*您要修改的"<mat.Sname==name)
          {
              cout<<"*******下面为该景区的一些信息:"<mat.Sname<mat.count;++i)
              {
                cout<<"编号为 "<mat.Pname[i];
                for(int j=1;j<=p->mat.count;++j)
                cout<<' '<mat.m[i][j];
                cout<>n;
              switch(n)
              {
              case 1:
                  change_sceic_name(p);
                  break;
              case 2:
                  change_weight(p);
                  break;
              case 3:
                  increase_number(p);
                  break;
              case 0:
                  returnMainFace();
                  break;
              }
            tag=0;
            break;
          }
          else
            p=p->next;
        }
        if(tag)
            cout<<"*您要修改的"<='0'&&c<='8'))
    {
        cout<<"*输入有误,请重新输入:";
        c=getch();
        cout<
main.cpp

#include 
#include"sxy.h"
using namespace std;
int main()
{
    Welcome();
    return 0;
}

你可能感兴趣的:(数据结构课程设计_《旅游景区信息管理系统》)